Koordinaten zu einer Adresse (und umgekehrt) dank Google Maps

Eine kleine Schnupperkunde wie man die Entfernung von zwei Adressen mit der Hilfe von Python und der Google Maps API ausrechnet…

Bevors losgeht müsst ihr euch einen (sorry!) Google Account erstellen und einen API-Key anfordern. Das kostet natürlich nichts (außer dass ihr eure Seele an Google verkauft…).
Der Key taugt dann für 2.500 Requests alle 24 Stunden.

Habt ihr einen Key? Gut. Dann gehts weiter!
Jetzt braucht ihr (neben Python Version 3) noch das Python Modul ‚json‘ (das sollte schon dabei sein), ‚requests‘ (sollte man sowieso haben) und ‚geopy‘.
(solltet ihr etwas nachinstallieren müssen, unter Ubuntu ist die Installationsfolge:
‚apt-get install python3-pip‘, ‚pip3 install requests‘ und ‚pip3 install geopy‘)

Wir möchten also wissen wie weit es von der Polizeiinspektion Süd in Nürnberg () zur Sparkasse in der Nähe ist (). Und zwar mit dem Auto und Luftlinie.
(Google Maps kann uns leider nicht miteinberechnen ob man mit Blaulicht schneller fährt 🙂 )

Werft also Python an und lasst euch die geparste Adresse und die Koordinaten der beiden Punkte ermitteln. (Google korrigiert hier sogar Rechtschreibfehler!)

#!/usr/bin/python3

import geopy
import json
import requests
import geopy.distance

key = 'AIzaxxxxxxxxxxxxxxxxxxxxxxxxxxGZQ'

add1 = 'Opeler Str. 229, 90473 Nürnberg'
add2 = 'Weterseinstraße 45, 90471 Nürnberg'

# Geocoordinaten holen (geopy Modul) (nutzt intern die Google Maps Geocoding API)
gc = geopy.geocoders.GoogleV3(api_key = key)
add1coords = gc.geocode(add1)
add2coords = gc.geocode(add2)
print(add1coords.address + ': ' + str(add1coords.latitude) + ', ' + str(add1coords.longitude))
print(add2coords.address + ': ' + str(add2coords.latitude) + ', ' + str(add2coords.longitude))

Nun wollen wir die Luftdistanz berechnen lassen, auch das kann das geopy Modul:

# Die Luftdistanz mithilfe der Vincenty Formel und dem Koordinaten Format WGS84 in Meter holen (geopy Modul)
point1 = (add1coords.latitude, add1coords.longitude)
point2 = (add2coords.latitude, add2coords.longitude)
print(str(geopy.distance.vincenty(point1, point2).m) + ' Meter')

Leider kann das Geopy Modul nicht die Google Maps Distance API verwenden – diese müssen wir also direkt mittels dem Requests Modul abfragen:

# Wie lange dauert es mit dem Auto? Die Google Maps Distance API hilft
coords1 = str(add1coords.latitude) + ',' + str(add1coords.longitude)
coords2 = str(add2coords.latitude) + ',' + str(add2coords.longitude)
type = 'driving'
targeturl = 'https://maps.googleapis.com/maps/api/distancematrix/json?key=' + key + '&origins=' + coords1 + '&destinations=' + coords2 + '&mode=' + type

mydata = requests.get(targeturl)
erg = json.loads(mydata.text)
print('Mit dem Auto ' + str(erg['rows'][0]['elements'][0]['distance']['text']) + ': ' + str(erg['rows'][0]['elements'][0]['duration']['text']))

Und das Ergebnis? Wie gewünscht:

Oppelner Str. 229, 90473 Nürnberg, Germany: 49.4002214, 11.1362912
Wettersteinstraße 45, 90471 Nürnberg, Germany: 49.4114197, 11.121273
1655.0341517643415 Meter
Mit dem Auto 2.4 km: 6 mins

Ich war überrascht wie einfach das ist.
Und wenn jetzt noch jemand wissen will wie wir da eine Google Map mit verschiedenen Adressen markiert basteln, oder aber diese Daten in eine Datenbank bringen, dann meldet euch in den Kommentaren 🙂

 


Kommentare

6 Antworten zu „Koordinaten zu einer Adresse (und umgekehrt) dank Google Maps“

  1. Schöner Artikel 🙂 Wobei man auch bedenken sollte, das GMaps auch nicht super akkurat bei Adressen ist. Das betrifft gerade ländliche Regionen. Aber natürlich hat z.B. OpenStreetMap auch solche Probleme…

    1. Thomas

      Hallo MM,

      du hast natürlich Recht. Ich habe Openstreetmap ganz ausgelassen.

      Hier also der Programmcode um mit OSM Adressen zu selektieren:

      import requests
      import json

      address = ‚Oppelner Str. 229, 90473 Nürnberg‘
      targeturl = ‚https://nominatim.openstreetmap.org/search?format=json&q=‘ + address

      mydata = requests.get(targeturl)
      erg = json.loads(mydata.text)
      address = str(erg[0][‚display_name‘])
      coords = str(erg[0][‚lat‘]) + ‚, ‚ + str(erg[0][‚lon‘])
      osm_id = str(erg[0][‚osm_id‘])
      print(address + ‚: ‚ + coords)

      Das Ergebnis wie gewünscht:

      Polizeiinspektion Nürnberg-Süd, 229, Oppelner Straße, Langwasser, Worzeldorf, Nürnberg, Mittelfranken, Bayern, 90473, Deutschland: 49.4001935, 11.1363561138878

      Ich werde eventuell mal noch einen Beitrag machen wie man Openstreetmap Daten in einer Postgres-Datenbank bringt und diese dann Abfragen kann. Ist nicht sonderlich schwer und man kann coole Sachen damit machen.
      (z.B. herausfinden wie weit der nächste Kentucky Fried Chicken von einem entfernt ist – bei mir sind es leider 63 km – sehr traurig!)

      Thomas

      PS: ACHTUNG: Da Openstreetmap ein kostenloser Service ist müsst ihr auf jeden Fall die Nutzungsbedingungen beachten!
      (Maximal ein Request pro Sekunde, Ein eindeutiger HTTP-Referer oder User-Agent muss mitgegeben werden (auf einer anderen Seite heißt es eine Email-Adresse muss für Kontaktzwecke mitgegeben werden), ein Hinweis auf die Herkunft der Daten muss angebracht werden!)

      PPS: Im empfehle eine Spende an OSM – meine Wenigkeit hat schon gespendet!

      PPPS: Solltet ihr wirklich die Daten massiv benötigen empfehle ich einen eigenen Postgres-Server zu nutzen. Das ist nicht schwer und ihr könnt ihn unter Feuer setzen wie ihr mögt.

      1. Technisch ist das wohl richtig, allerdings verstößt du damit auch massiv gegen die Nutzungsrichtlinie:
        https://wiki.openstreetmap.org/wiki/Nominatim_usage_policy
        Gerade bei einem Projekt, das seine Dienste ausschließlich auf Spenden aufbaut, sollte fairness bei der Nutzung oberstes Gebot sein.

        1. Thomas

          Hallo MM,

          du hast natürlich vollkommen Recht, eindeutig ein Fauxpas von mir.
          Oft betrachte ich am Anfang einfach nur die technische Seite und die rechtliche erst wenn ich das tatsächlich produktiv nutzen mag.

          Ich habe die Nutzungsbedingungen oben nochmal deutlich gemacht.

          Thomas

          1. Kein Problem, das passiert ja nicht nur dir 😉
            Leider greifen die Leute oft für ihre eigenen Sachen direkt auf die OSM Infrastruktur zu, weil sie den Aufwand scheuen diese Dienste selbst mit OSM Daten zu betreiben. Und das skaliert natürlich ganz schlecht bei einem Projekt, was ja eigentlich nur die Daten sammeln will….

  2. Danke für Deinen Beitrag, hat sehr geholfen. 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Time limit is exhausted. Please reload CAPTCHA.