Geolokation#
Geodaten sammeln#
In der Stella Helper Applikation kann für die automatische Aktualisierung eine Datenbank-Konfiguration vom Typ "Geolocation" angelegt werden. Die wesentlichen Angaben sind
Geolocation Config#
- Quelldatenbank
- Auswahlformel der Dokumente
- Formel für die Berechnung der Adressdaten
- Feldnamen für die Speicherung der Koordinaten

Darüber hinaus wird zur Dokumentenauswahl auch noch das Feld __geoupdate mit einem Wert von 1 hinzugezogen. Nur Dokumente mit diesem Flag werden entsprechend bearbeitet.
Vorbereitung#
Der Microservice nutzt den HERE Maps Service über ein REST API. Dazu muss bei HERE ein Konto angelegt, ein Projekt erzeugt und ein API Key generiert werden. In der Stella Helper Anwendung muss in der Konfiguration sowohl die API Endpoint URL als auch dieser API Key hinterlegt werden. Die URL ist im Feld bereits vorgegeben.

Umkreissuche#
Eine Spezialfunktion ist die Umkreissuche. Hierbei kann zu einem Firmendokument (alternativ Standort oder Liegenschaft), zu dem zuvor die Geodaten ermittelt wurden, eine Umkreissuche nach anderen Dokumentarten durchgeführt werden, z.B. nach Handwerkern, die in einem Umkreis von x Kilometern zu diesem Standort verfügbar wären. Der Radius wird hierbei beim Handwerker festgelegt.
Damit diese Suche einfach durchführbar ist, wird dazu in der Stella Helper Applikation ein Dokument vom Typ "Geocollection Config" angelegt. Später wird diese Konfiguration lediglich durch eine eindeutige ID identifiziert.
Geocollection Config#
In diesem Dokument müssen alle Felder ausgefüllt werden.

| Feld | Beschreibung |
|---|---|
| ID | Eindeutige Kennung für diese Konfiguration |
| Form or Object Name | Aveedo Objekt- oder Layoutname. Hiermit definiert man die Datenquelle |
| Selection Formula for Source Data | Auswahlformel für die Suchdaten. Intern wird zusätzlich ebenfalls auf das Feld __geoupdate mit dem Wert 1 geprüft, d.h. die Formel wird ergänzt |
| Fieldname for Latitude | Feld in den Suchdaten, welches den Breitengrad enthält |
| Fieldname for Longitude | Feld in den Suchdaten, welches den Längengrad enthält |
| Fieldname for Operating Radius | Feld, welches den Einsatzradius z.B. für den Handwerker enthält |
| Data Formula for Evaluation | Für die Darstellung genutzte Formel, um die Daten eines Suchergebnisses anzuzeigen |
| Fieldname for Category | Die Suchdaten können noch kategorisiert sein, dazu wird später ein Element bereitgestellt, um das Ergebnis zu filtern. |
Der folgende Code ist ein Beispiel zur Anzeige des Ergebisses inklusive Filterfunktion. Dieser kann in einem Custom Control direkt im Document Layout genutzt werden.
<div class="uk-grid">
<div class="uk-width-1-3 uk-form-row">
<span class="uk-form-label">Gewerk</span>
<div class="uk-form-controls"><select id="craftselect" class="uk-width-1-1">
</select></div>
</div>
<div class="uk-width-2-3 uk-form-row">
<button type="button" class="uk-button" onclick="loadGeo()">Aktualisieren</button></div>
<div class="uk-width-1-1 uk-form-row">
<span class="uk-form-label">Ergebnisse</span>
<div class="uk-form-controls" id="craftsmen"></div>
</div>
</div>
<script type="text/javascript">
var crafts = new Array();
var data;
function addCategories(cats) {
for (var x = 0; x < cats.length; x++) {
var cat = cats[x];
if (crafts.indexOf(cat) == -1) {
crafts.push(cat);
}
}
}
function loadGeo() {
var html = $('#craftsmen');
var lat = '<![JAVASCRIPT[API.getFieldValueNumber("locLat")]]>';
var lng = '<![JAVASCRIPT[API.getFieldValueNumber("locLng")]]>';
if (lat == 'null' || lng == 'null') {
html.html('Für diesen Markt sind keine Geodaten hinterlegt.');
return;
}
html.html('Bitte warten...');
$.ajax({
method: 'GET',
url: '<![JAVASCRIPT[API.getConfigValue("System", "HelperUrl")]]>/index.xsp/geo',
data: {
'lat': lat,
'lng': lng,
'id': 'craftsmen'
}
}).done(function (response) {
html.empty();
// response is already JSON
var json = response;
if (json.status == "ok") {
data = json.data;
for (var x = 0; x < data.length; x++) {
var cr = data[x];
addCategories(cr.categories);
html.append('<div><a target="_blank" href="' + cr.url + '">' + cr.text + '</a></div>');
}
}
// populate combo box
$('#craftselect').empty();
$('#craftselect').append(new Option('- Alle -', ''));
$.each(crafts, function (idx, val) {
$('#craftselect').append(new Option(val, val));
});
$('#craftselect').trigger('chosen:updated');
});
}
function filter(cat) {
console.log("Filter", cat);
var html = $('#craftsmen');
html.empty();
for (var x = 0; x < data.length; x++) {
var cr = data[x];
if (cr.categories.indexOf(cat) != -1 || cat == '') {
html.append('<div><a target="_blank" href="' + cr.url + '">' + cr.text + '</a></div>');
}
}
}
$('#craftselect').on('change', function () {
filter($(this).val());
})
loadGeo();
</script>