BPM-Prozess zur Geocodierung mit OSM
Grundlagen
Standardmäßig wird ein C0-Prozess zur Geocodierung von Adressdaten im CRM ausgeliefert. Dieser verwendet als Startereignis "System-Start (Webservice, Timer, ProcessUtils.startProcess)" und kann somit regelmäßig über einen Timer ausgeführt werden.
Wird der Geocodierungsprozess im Zusammenspiel mit der Geoanalyse genutzt, ist darauf zu achten, dass die Laufzeiten der Timer für die Geocodierung und die Aktualisierung der Geoanalyse-Tabellen aufeinander abgestimmt sind.
Es sollte sichergestellt werden, dass der Timer für die Geocodierung der Adressen vor dem Timer der Aktualisierung der Geoanalyse-Tabellen läuft.
Die wesentliche Logik des Prozesses ist in der Skriptbibliothek SC0Geocoding.library ausgelagert.
Bei der Ausführung des Prozesses im CRM-System werden zunächst alle Adressdatensätze zur Geocodierung herangezogen, sofern sie vollständig sind. Der Prozess codiert standardmäßig alle aktiven Adressen dann, wenn die folgenden Felder gefüllt sind:
PLZ (ZIPKey.Address)
Ort (City.Address)
Straße (Street.Address)
Hausnummer (StreetNumber.Address)
Sofern vorhanden, wird der Hausnummer-Zusatz (StreetNumberAddition.Address) berücksichtigt. Für den Fall, dass für einen übergebenen Hausnummer-Zusatz über den Dienst keine Koordinaten ermittelt werden konnten, wird versucht, in einem erneuten Aufruf des Geocodierungs-Dienstes für die Adresse inklusive der Hausnummer, jedoch ohne den Hausnummer-Zusatz zu geocodieren.
Sollen beispielsweise auch Adressen in denen keine Hausnummer und kein Hausnummer-Zusatz, sondern lediglich die Straße enthalten ist, geocodiert werden, so muss die Suche zur Ermittlung der zu geocodierenden Daten entsprechend übersteuert werden. Weiterhin müssen in diesem Fall die in der Scriptbibliothek ausgelieferten SC0GeocodeUtils entsprechend angepasst werden, da dort in der Standard-Implementierung Rückantworten des Geocodierungsdienstes, die ausschließlich Koordinaten für eine Straße, nicht aber explizit für ein Gebäude o.Ä. liefern, ausgeschlossen werden.
Sind in Ihrem System die Hausnummern nicht im Hausnummer-Feld, sondern gemeinsam mit der Straße im Straßen-Feld hinterlegt, können Sie in der Skriptbibliothek SC0Geocoding in der Methode createAddressSearch die Bedingung für StreetNumber.Address in der Suche auf NO_CONDITION umstellen.
Kommt es beim Versuch, eine Adresse zu geocodieren, zu einem Fehlerfall, wird innerhalb des Prozesses unterschieden zwischen
Der Dienst kann nicht nach außen Kommunzieren (IO-Exeption)
Mögliche Gründe hierfür sindDie URL ist auf Ihrem verwendeten Proxy nicht freigeschaltet
Der Aufruf wird von der Firewall blockiert, weil die URL dort nicht freigeschaltet ist
Es besteht keine Internetverbindung
Das SSL-Zertifikat ist abgelaufen oder fehlerhaft konfiguriert
Der Geocodierungs-Dienst ist nicht erreichbar (z.B. Aufgrund von Wartungsarbeiten)
Der Geocodierungs-Service liefert für die übergebenen Adressdaten die Info zurück, dass die Koordinaten nicht gefunden werden können
Anhand des Feldes "Status Geocodierung" (GeocodeState.Address) lässt sich im Fehlerfall ableiten, welcher der beiden zuvor genannten Fälle für eine Adresse zutrifft. Konnte der Dienst nicht nach außen kommunizieren, erhält die Adresse den "Status Geocodierung" = 0 oder null, handelt es sich dagegen um eine Adresse, zu welcher der OSM-Geocodierungsdienst keine Koordinaten gefunden hat, wird der Wert von "Status Geocodierung" auf '11' gesetzt.
Erfolgreich geocodierte Adressen erhalten neben den Koordinaten für den Längen- und Breitengrad den Wert '100' für das Feld "Status Geocodierung".
Der Prozess reagiert auf das Speichern einer Adresse und leert bei einer Änderung eines relevanten Adressfeldes die Felder Lng (Längengrad), Lat (Breitengrad) und GeocodeState (Status Geocodierung), so dass die Adresse beim nächsten Lauf des Prozesses erneut geocodiert wird.
Der Geocodierungsprozess wurde als Massendatenprozess implementiert. Das bedeutet, der Prozess reiht bei Bedarf - das heißt, mindestens eine Adresse muss geocodiert werden - einen Massendaten-Task ein, der die Geocodierung durchführt. Läuft bereits ein solcher Prozess, so wird kein weiterer eingereiht.
Abbildung: Geocodierungsprozess in der Auftragswarteschlange
Auskunft über den Status des Prozesses innerhalb der Verarbeitungsdauer liefert ein Eintrag in den Massendatenaktionen.
Abbildung: Protokollierung des Prozessverlaufs in den Massendatenaktionen
Hier ist beispielsweise ersichtlich, wie viele Ergebnisse vom Prozess verarbeitet wurden. Der Detailansicht einer Massendatenaktion kann entnommen werden, ob der Prozess erfolgreich ausgeführt werden konnte, oder ob es zu einem Fehler bei der Verarbeitung gekommen ist. Läuft der Geocodierungsprozess auf einen Fehler, so wird so lange kein weiterer Prozess gestartet, bis die fehlerhafte Instanz gelöscht wurde.
Wie häufig die Geocodierung von Adressen anhand des Prozesses in Ihrem System durchgeführt werden soll, ist abhängig davon, wie viele Adressen täglich in Ihrem System neu angelegt oder verändert werden und wie schnell sie diese mit Koordinaten anreichern,nutzen und auswerten möchten (zum Beispiel in der Geoanalyse). Um möglichst aktuelle Koordinaten vorzufinden, empfehlen wir Ihnen, den Prozess mindestens einmal täglich über einen Timer-Aufruf ausführen zu lassen.
Genutzte Globale Variablen
C0Geokodierung_isSecureHttp | <true>: Zugriff auf Geocodierung mittels https <false>: Zugriff auf Geocodierung mittels http (Default-Wert) | Gibt an, ob der Zugriff der Geocodierung über eine http- oder https-Verbindung erfolgt. |
C0Geokodierung_NominatimBaseUrl | <leer>: Nutzt //nominatim.openstreetmap.org (Default-Wert) Für den Fall, das Sie die Geoanalyse lizensiert haben, wenden Sie sich bitte an Ihren Projektleiter. Ggf. muss hier nach der Anpassung der Globalen Variable eine weitere Freischaltung einer URL auf dem Proxy/der Firewall erfolgen. Die Anzahl der täglichen Geocodierungsaufrufe ist nicht beschränkt. | Basis-URL für die Geocodierung mit Nominatim. Gibt an, durch welchen Nominatim-Service die Geocodierung der Datenerfolgen soll. |
Geoanalysis_MapProvider | <OSM>: Kartenmaterial über öffentlichen OSM-Kartenserver <CURSOR>: Kartenmaterial über den privaten CURSOR-OSM-Kartenserver bei Sylphen | Gibt an, von welchem Dienstleister die Kartenkacheln zur Darstellung in der Geoanalyse bezogen werden |
Technische Hinweise
Freischaltung von URLs
Für die Nutzung der Geocodierung muss die folgenden URLvom System aufrufbar sein und ggf. kundenseitig für den Proxy sowie die Firewall freigeschaltet werden:
URL für den öffentlichen Nominatim-Geocodierungsdienst |
SSL-Zertifikat
Beim Geschäftspartner muss ein gültiges SSL-Zertifikat installiert sein.
Schnittstellen
Bei der Verwendung von Schnittstellen, welche Einträge auf der Adresstabelle bearbeiten beziehungsweise neu anlegen, ist auf folgende Punkte zu achten:
Die Schnittstelle/der Webservice ist dahingehend anzupassen, dass bei Adressänderungen die Koordinaten (Lng.Address, Lat. Address) sowie GeocodeState.Address geleert werden, damit geänderte Adressen beim Updatelauf des Geocodierungsprozesses berücksichtigt werden
Es darf kein (datenbankseitiger) Schreibschutz auf den Feldern Lat.Address, Lng.Address, GeocodeState.Adress, UpdateDate.Adress und UpdateUser.Adress existieren.
Der Geocodierungsprozess muss in diese Felder der Adresstabelle schreiben dürfen.
Man muss sich bewusst sein, dass der Geocodierungsprozess das Updatedatum sowie auch den Updateuser von Adressdatensätzen ändert
Beim Start des Prozesses zur Adressgeocodierung via Timer ist darauf zu achten, dass dieser nicht zeitgleich mit Schnittstellen läuft, die ebenfalls auf der Adresstabelle arbeiten.
Der Geocodierungsprozess sollte erst nach Beendigung des Schnittstellenlaufes starten.
Anpassungsmöglichkeiten
Steht die Hausnummer in Ihrem System gemeinsam mit dem Straßennamen im Feld Straße der Adresse statt separat im Feld Hausnummer, kann der Prozess kundenindividuell im Customizing angepasst werden, sodass die Adresse ebenfalls geocodiert wird. Allerdings erkennt der Codierungsservice im besten Fall die Straße, die Hausnummer wird dann ignoriert, so dass die Codierung nur "straßengenau" ist.