Zum Inhalt

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>