Programmierung

Geokodierung mittels Webservices und Entfernungsberechnung

Für die Tourenplanung im Außendienst oder bei Auslieferungen ist es oft wünschenswert weitere Kunden in einem bestimmten Umkreis zu bestimmen. Dazu ist es notwendig die Kundenadressen zu geokodieren. Dafür bietet z.B. Google einen Webservice an.

Um den Service nutzen zu können, benötigt man einen Maps-API-Key, den man unter http://code.google.com/intl/de-DE/apis/maps/signup.html erhält.

Mit dem HTTP-Objekt von CONZEPT 16 wird die URL

http://maps.google.com/maps/geo?q=<Adresse>&output=xml&key=<Maps-API-Key>

abgerufen. Das Ergebnis sieht wie folgt aus:

<kml xmlns="http://earth.google.com/kml/2.0">
<Response>
<name>71332 backnang kuchengrund 8</name>
<Status>
<code>200</code>
<request>geocode</request>
</Status>
<Placemark id="p1">
<address>Kuchengrund 8, 71522 Backnang, Deutschland</address>
<AddressDetails xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" Accuracy="8">
<Country>
<CountryNameCode>DE</CountryNameCode>
<CountryName>Deutschland</CountryName>
<AdministrativeArea>
<AdministrativeAreaName>Baden-Württemberg</AdministrativeAreaName>
<SubAdministrativeArea>
<SubAdministrativeAreaName>Rems-Murr-Kreis</SubAdministrativeAreaName>
<Locality>
<LocalityName>Backnang</LocalityName>
<DependentLocality>
<DependentLocalityName>Heiningen</DependentLocalityName>
<Thoroughfare>
<ThoroughfareName>Kuchengrund 8</ThoroughfareName>
</Thoroughfare>
<PostalCode>
<PostalCodeNumber>71522</PostalCodeNumber>
</PostalCode>
</DependentLocality>
</Locality>
</SubAdministrativeArea>
</AdministrativeArea>
</Country>
</AddressDetails>
<ExtendedData>
<LatLonBox north="48.9306890" south="48.9279910" east="9.4434990" west="9.4408010"/>
</ExtendedData>
<Point>
<coordinates>9.4421500,48.9293400,0</coordinates>
</Point>
</Placemark>
</Response>
</kml>

Interessant ist hier das <coordinates>-Tag. Hieraus entnehmen wir die geografischen Koordinaten in Breite (Latitude) und Länge (Longitude).

Den Algorithmus zur Entfernungsberechnung kann man dem Internet entnehmen, z.B. auf der sehr interessanten Seite von Martin Kompf (http://www.kompf.de) aus der die folgenden Bilder, Algorithmen und Formulierungen stammen:

Jeder Punkt auf der Erdoberfläche kann durch diese zwei Koordinaten eindeutig beschrieben werden:

Ein Punkt P auf der Erdoberfläche kann durch sein geografische Länge und Breite identifiziert werden.

Die geografische Breite beschreibt den Winkel, der sich zwischen Erdmittelpunkt, dem gesuchten Punkt P und dem Äquator aufspannt (blaue Fläche). Punkte auf dem Äquator haben immer die Breite 0, während der Nordpol 90 Grad und der Südpol -90 Grad geografische Breite haben. Die Kurve, die durch Punkte gleicher Breite führt, bezeichnet man als Breitenkreis.
Die geografische Länge bezeichnet den Winkel, der sich zwischen Erdmittelpunkt, dem gesuchten Punkt P und dem Nullmeridian ergibt (gelbe Fläche). Ein Meridian oder Längenkreis führt durch Nordpol, Südpol und alle Punkte gleicher Länge. Der Meridian, der durch die alte Greenwicher Sternwarte führt, bekam willkürlich den Wert 0 zugewiesen und ist somit der Nullmeridian. Punkte östlich von Greenwich haben eine Länge zwischen 0 und 180 Grad, westlich davon zwischen 0 und -180 Grad.

Einfache Entfernungsbestimmung

Für kleine Gebiete kann man einfach die Erdoberfläche als Ebene ansehen und zum Satz des Pythagoras greifen:

distance # sqrt(dx * dx + dy * dy);

distance: Entfernung in km

dx # 71.5 * (lon1 - lon2);
dy # 111.3 * (lat1 - lat2);

lat1, lat2, lon1, lon2: Breite, Länge in Grad

Die Konstante 111.3 ist dabei der Abstand zwischen zwei Breitenkreisen in km und 71.5 der durchschnittliche Abstand zwischen zwei Längenkreisen in Europa.

Verbesserte Methode

Während der Abstand zwischen zwei Breitenkreisen immer konstant 111,3 km beträgt, variiert der Abstand zwischen zwei Längenkreisen in Abhängigkeit von der geografischen Breite: Am Äquator ist er ebenfalls 111,3 km, an den Polen hingegen 0. Der Abstand berechnet sich nach der Formel:

111.3 * cos(lat);

Dies lässt sich in die Berechnungsformel mit einarbeiten. Als Wert für lat wird dabei ein Wert gewählt, der genau zwischen lat1 und lat2 liegt.

Bei der Berechnung mittels CONZEPT 16 ist zu bedenken, dass zwar die Kosinusfunktion zur Verfügung steht, diese den Winkel jedoch im Bogenmaß (Radiant) erwartet. Die Umrechnung von Grad in Radiant erfolgt nach der Beziehung:

1° = Pi/180 rad ≈ 0,01745

Die vollständige, verbesserte Prozedur zur Entfernungsberechnung lautet dann:

Sub Entfernung(
  lat1 : float;
  lon1 : float;
  lat2 : float;
  lon2 : float;
) : float
local { dx, dy, lat : float; }
{
   lat # (lat1 + lat2) / 2.0 * 0.01745;
   dx # 111.3 * cos(lat) * (lon1 - lon2);
   dy # 111.3 * (lat1 - lat2);
   return sqrt(dx * dx + dy * dy);
}

Aber Achtung: Diese Methoden versagen bei großen Distanzen, da hier von einem rechtwinkligen Gitternetz ausgegangen wird, die Erde aber eine Kugel ist. Mit Hilfe der sphärischen Trigonometrie könnte man die Berechnung weiter verfeinern. Vielleicht fühlt sich der eine oder andere Leser dazu berufen. Ein Anleitung findet sich auf der oben genannten Seite: http://www.kompf.de/gps/distcalc.html
Quelle: http://www.kompf.de

18 Kommentare

18 Kommentare “Geokodierung mittels Webservices und Entfernungsberechnung”

  1. Mit Geokodierung habe ich nichts zu tun, aber bei den zuletzt angesprochenen Applikationen kann ich etwas beisteuern:

    Wir haben gemerkt, dass C16-Clients auf Terminalserver natürlich stabil auf Tablets laufen, aber eben nicht in Anzeige und Eingabe auf Touchscreens angepasst sind und dadurch keine Akzeptanz haben.

    Der nächste Test ist nun Web-Entwicklung mit C16 als Server und jQuery mobile als Javascript-Framework. Das Framework hat letztlich nichts mit dem Server zu tun, es kümmert sich ja nur um die angepasste Anzeige. Die lang einstellbare Timeout-Zeit des Servers hilft uns dabei auch noch bei schwachen WLAN-Verbindungen.

  2. @tsauter:

    Ja, da habe ich dich falsch verstanden, ein Javascript-Framework wäre eine grossartige Sache. Ein wichtiger Punkt ist m. E. aber die transparente Datenbankbenutzung, fällt die weg, kann ich genausogut zu einem anderen Framework greifen. Also kommt man wohl nicht umhin, Lösungen für die verschiedenen Frameworks zur Verfügung zu stellen, die einen ähnlichen Abstraktionsgrad erreichen, wie der Standard-Client.

    Jedenfalls sollte man trotz oder gerade wegen der aktuellen Situation mit vielen Frameworks, nicht zu zögerlich sein, denn Windows scheint derzeit auf dem mobilen Markt die schlechteste Alternative, wahrscheinlich wäre ein Einstieg in die weniger esoterische Android-Welt (Java statt Objective-C wie in iOS) pragmatisch.

  3. @Edwin:
    Sagen wir mal so: C16 ist ja eigentlich als Framework für die schnelle Entwicklung von Applikationen gedacht. D.h. es verspricht, die Dinge zu erleichtern (und nicht "nur" zu ermöglichen), obwohl es möglich ist, cgi-Skripte in C schreiben, wird es selten gemacht 😉
    Ich betrachte es als Vorteil von C16, dass ich mir beim Entwickeln keine Gedanken über die Datenbankanbindung machen muss. Sobald dieser Vorteil schwindet, kommen dann wieder recht viele teilweise sehr gut ausgearbeitete Alternativen zu C16 in Betracht (oft ohne dass Lizenzkosten entstehen), daher meine Anregung, den ursprünglichen Vorteil weiter auszubauen und dabei die Änderungen in der IT-Welt einzubeziehen (cloud, mobile apps, thin clients, rich internet applications und was weiss ich noch alles…), ein Javascript-Framework, wie von Thomas vorgeschlagen wäre z.B. eine gute Sache.
    Lizenzen: Wenn’s dort kein Problem gibt, umso besser, ich dachte an steigende Kosten in folge steigender Benutzerzahlen oder so…

  4. @Kilian

    Fragt sich nur für welche Plattformen: Android, iOS und …
    Wäre da webbasierend nicht besser, plattformunabhängiger?
    Eine andere Lösung wäre Zugriff über eine Terminalserver-Session (dagegen sprechen sicher die Lizenzkosten).

    Vielleicht wäre ja ein Javascript-Framework von vectorsoft
    und ein cloud computing-Lizenzmodell die Lösung ….

  5. @Kilian
    Mit dem SOA-Service lassen sich mobile Anwendungen hervorragend lösen. Auch sehen wir bei der Lizenzierung in diesem Fall kein Problem. Falls jemand hier ein Problem hat, dann kann er mit uns individuelle Lösungen besprechen.

  6. @tsauter

    Nur kurz als Antwort zum Thema mobile Anwendungen: Webbasierend in irgendeiner Form geht immer, oder? Allerdings brauche ich dazu eher kein C16, höchstens auf der Serverseite, als Datenbank. Es sprechen momentan aber viele Gründe dagegen, wenn man ehrlich ist: Lizenz-Kosten (steigend?), Hosting-Probleme, relativ hoher Aufwand bei der Anbindung auf der Client-Seite.

    Die Lösung wäre also entweder gänzlich ohne C16 oder mit C16 auf Client- und Server-Seite und einem an mobile Apps und cloud computing angepasstem Lizenzmodel. Da Letzteres momentan nicht möglich ist, bleibt eigentlich nur "ohne C16" und das kann ja nicht im Interesse von vectorsoft und der C16-Entwicklergemeinde sein.

  7. @ Tsauter
    Danke für den interessanten Artikel. Wir planen in der Zukunft eine sehr einfache Geokodierung um Fotos die mit GPS-Daten versehen sind automatisch bestimmten Gebäude-Datensätzen zuzuordnen.
    Hierbei ist Ihr Artikel sehr hilfreich. Ich versuche übrigens täglich den Blog zu lesen und finde die Beiträge fast immer sehr interessant. (manchmal klappt es aber mit dem "täglich" nicht ganz 😉

    Christian Stoldt – (ALCO Computer Dienstleistungs GmbH)

  8. @Kilian

    Du hast sicher Recht mit der Größe der Community. Aber ich
    höre dauernd (auch von meinen Mitarbeitern), ich schau doch
    jeden Tag rein und es ist sehr interessant. Sagtes doch mit einem
    kurzen Statement, muss ja nicht immer und bei jedem Beitrag
    sein … davon lebt halt ein Blog!

    Mobile Anwendungen sind auch für uns ein grosses Thema.
    Wie könnte man das angehen? Webbasierend?

    Danke für Deine Antwort!

  9. Und weiter:
    Geo-Daten und C16 ist für uns auch interessant, allerdings arbeite ich nicht in diesem Bereich und kann daher momentan nichts inhaltlich Interessantes beisteuern. Einen Mangel, den ich in einem grossen Zusammenhang sehe, ist die Kopplung des C16-Clients an Windows, würde die abgeschafft, könnte man vielleicht auch Applikationen etwa für Linuxbasierte Mobilgeräte programmieren (Android usw.)

    Ob man wohl die Beschränkung auf 1000 Zeichen für Kommentare aufheben könnte?

  10. Ich denke es gibt zwei simple Gründe für die Frequenz und die Menge der Kommentare im aktuellen Stadium des Blogs:
    – die Grösse der Community, Conzept 16 ist nicht Java und weniger Leute geben insgesamt weniger Kommentare ab, insbesondere muss man bedenken, dass ja immer nur ein Bruchteil der Leute, die mit einem gegebenen Projekt zu tun hat auch in der Onlinegemeinde aktiv wird
    – Zeit, es braucht immer etwas Zeit, bis sich eine aktive Nutzergemeinde etabliert hat.

    Ich bin überzeugt davon, dass sich die Menge der aktiven Blog-Nutzer mit der Zeit vergössern wird und der Blog dadurch stetig interessanter wird.

    Die Anregung zusätzlich ein Forum zu eröffnen, möchte ich unterstützen, dort könnte man sich ggf. in Detaildiskusiionen stürzen, die im Blog vielleicht stören oder so. Einen weiteren Vorschlag in Sachen C16-Online-Gemeinde werde ich noch als Kommentar im Suuport-Artikel unterbringen.

  11. @George

    Du brauchst dich nicht bedanken, Du kannst den Beitrag auch
    blöd finden. Es wäre einfach schön, die Gedanken anderer zu
    einem Thema zu erfahren.

    Sind wir Entwickler einfach zu introvertiert? Anderswo klappt
    das doch auch!

    Den Gedanken mit einem Forum finde ich gut. Doch warum
    sollte sich vectorsoft den Aufwand machen, wenn nicht
    einmal der Blog angenommen wird?

    Jedenfalls herzlichen Dank für Deinen Beitrag!

  12. @Andros

    Glaube mir, als Geschäftsführer und aktiver Entwickler habe
    auch ich genügend zu tun, die 2 Minuten am Tag finde ich
    immer Zeit in den Blog zu schauen.

    Vielleicht ist ja auch mal was dabei, das Dir Zeit in der
    täglichen Arbeit spart … könnte ja sein.

    Daß Du jetzt meinen Beitrag nicht kommentiert hast, sehe
    ich Dir gerne nach, aber IRGENDEIN Beitrag wird Dich doch
    auch betreffen, und es wäre einfach schön, wenn Du dem
    Autor ein Feedback geben könntest.

    Jedenfalls vielen Dank für Deine Gedanken zu diesem Thema.
    Das schon mal ein Anfang!

  13. Ich weiss nicht, wie es den Kollegen hier geht, aber ich seitze nicht täglich gelangweilt rum und lese permanent Blogs!
    Wir haben (gerade auch zum Jahresabschluss) extremst viel im normalen Tagesgeschäft zu tun. Ich bin dann froh, wenn ich wenigstens ein mal die Woche die Zeit finde den C16-Blog zu überfliegen.
    Das war gerade eben und hier nun mein Kommentar dazu. 🙂

    Generell finde ich es gut, dass wir uns hier austauschen könnten und das nun ein erster Entwickler macht. Zu dem speziellen Thema Geokoordinaten hab ich/wir aber nix gross zuzufügen oder tiefere Fragen, weil es für unsere Anwendung in nöchste rZeit kein Thema ist… Und warum soll man sich beruflich in ein Thema auseinandersetzen, wofür man im Moment eben keine Verwendung hat, wenn man einen Berg von ganz konkreter anderer Arbeit hat?

    Bin aber gespannt, ob es weiteres Feedback hier geben wird 🙂

  14. Hallo Herr Sauter,

    Ihre Enttäuschung ist nachvollziehbar und ich bedanke mich an dieser Stelle stellvertretend für den von Ihnen und dem Vectorsoft-Team erbrachten Aufwand.
    Ich für meinen Teil lese täglich den Blog und finde viele Beiträge sehr interessant und zumindestens bewerte ich einige "facebook-artig", so ich nicht auch kommentiere.
    Ich glaube, daß viele C16-Entwickler hier genauso reinschauen und Informationen mitnehmen, aber m.E. nach könnte über eine Kommentarfunktionalität hinaus ein reger Austausch der C16-Gemeinde in einer Forumform stattfinden.

    Viele Communitys bündeln das Wissen und dazugehörige Hilfestellung innerhalb von Foren…

    Ich denke, einen Versuch – so seitens Vectorsoft unterstützt – ist es Wert.

    Viele Grüße

  15. Wie lange wird vectorsoft diesen Blog aufrecht erhalten
    (trotz aller Beteuerungen) , wenn KEINE Reaktion kommt?

    Alles im stillen Kämmerlein nur gut zu finden reicht halt nicht,
    ab und zu muß man halt auch etwas tun!

    Wenn ich die Communities anderer Softwareprodukte anschaue,
    frage ich mich mit Grausen, ist Conzept 16 schon tot, oder
    seid Ihr es nur?

  16. Hallo liebe Vertriebspartnerkollegen,

    gibt es noch Leben da draußen?

    Ich bin echt enttäuscht! Ich habe mir Mühe gegeben, um Euch
    Informationen zu überlassen, die wir uns in mehreren Manntagen
    erarbeitet haben.

    Wenigstens EINEN Kommentar (egal mit welchem Tenor) hätte
    ich mir schon erwünscht.

    Warum ist das so?

    Ist der Inhalt des Conzept16-Blogs kalter Kaffee für Euch?
    Langweilt das alles?

    Habt Ihr kein Interesse Euch mit anderen Conzept16 Usern
    auszutauschen?

    Schaut jeder nur auf sein Tagesgeschäft und hat Angst
    Informationen oder Meinungen preiszugeben?

    Ist das Internet-Zeitalter noch nicht bei Euch angekommen?

    Oder ist es nur die allgemeine gesellschaftliche Tendenz
    alles mitzunehmen, das geht, ohne selbst eine Gegenleistung
    zu erbringen und sei es nur 1 Minute Eurer Zeit?

Kommentar abgeben