So erhalten Sie programmgesteuert (und legal) Längen- und Breitengrade für eine Adresse


Antworten:


70

Der Begriff, den Sie suchen, ist Geokodierung, und ja, Google bietet diesen Dienst an.


1
Ausgezeichnet! Der Abschnitt "Geokodierung über HTTP" scheint das zu sein, wonach ich suche.
Ola Eldøy

3
Stellen Sie nur sicher, dass Sie die Nutzungsregeln einhalten. Ich denke, Google erlaubt die Verwendung nur, wenn Sie die Standorte auf einer Google Map anzeigen. Es ist nicht gestattet, es für andere Zwecke zu verwenden, aber Sie sollten die Lizenz- und Nutzungsregeln überprüfen.
PeSHIr

v2 (seit 2010 veraltet) wird in nur wenigen Monaten (Mai 2013) vollständig heruntergefahren. Empfehlen Sie daher, mit dieser Version nichts Neues mehr zu erstellen!
Funka

Das Abrufen über den Dienst ist zulässig, das Speichern für die spätere Verwendung jedoch nicht. Siehe den Kommentar (unter der Antwort) dazu hier stackoverflow.com/a/30595524/2403881
Nhan

22

Neben dem oben genannten Google-Geokodierungs-Webdienst gibt es auch einen Konkurrenzdienst von Yahoo . In einem kürzlich durchgeführten Projekt, in dem die Geokodierung mit Benutzerinteraktion durchgeführt wird, habe ich Unterstützung für beide aufgenommen. Der Grund dafür ist, dass ich festgestellt habe, dass der Umgang mit dunkeleren Orten, insbesondere außerhalb der USA, sehr unterschiedlich ist. Manchmal hat Google die beste Antwort, manchmal Yahoo.

Ein Punkt, den Sie beachten sollten: Wenn Google wirklich glaubt, nicht zu wissen, wo sich Ihr Standort befindet, wird ein 602-Fehler zurückgegeben, der auf einen Fehler hinweist. Yahoo hingegen gibt den Standort des Zentrums dieser Stadt zurück, wenn es eine Stadt / Provinz / ein Bundesland / usw. aus Ihrer schlechten Adresse herausschälen kann. Sie müssen also auf die Ergebnisse achten, um zu sehen, ob sie wirklich das sind, was Sie wollen. In einigen Ergebnissen gibt es Zusatzfelder, die Sie darüber informieren: Yahoo nennt dieses Feld "Präzision" und Google nennt es "Genauigkeit".


1
Eine jsfiddle mit einem Beispiel für den Ersatz für den Yahoo-Dienst, Nokia Ovimaps: jsfiddle.net/MgjGr
Chris Moschini

15

Wenn Sie dies tun möchten, ohne sich auf einen Dienst verlassen zu müssen, laden Sie die TIGER Shapefiles aus der US-Volkszählung herunter .

Sie sehen die Straße nach, an der Sie interessiert sind und die mehrere Segmente hat. Jedes Segment hat eine Startadresse und eine Endadresse, und Sie interpolieren entlang des Segments, um herauszufinden, wo auf dem Segment Ihre Hausnummer liegt.

Dadurch erhalten Sie ein Lon / Lat-Paar.

Beachten Sie jedoch, dass bei Onlinediensten zahlreiche Adressüberprüfungen und -korrekturen erforderlich sind, die Sie ebenfalls duplizieren müssen, um gute Ergebnisse zu erzielen.

Beachten Sie auch, dass kostenlose Daten zwar nicht so schön sind, aber nicht perfekt - die neuesten Straßen sind nicht vorhanden (möglicherweise in den von Google verwendeten Daten), und die Straßen können aufgrund von Ungenauigkeiten bei der Umfrage um einen gewissen Betrag von ihrem tatsächlichen Standort abweichen. Aber für 98% der Geokodierungsanforderungen funktioniert es perfekt, ist kostenlos und Sie steuern alles, um Abhängigkeiten in Ihrer App zu reduzieren.

Openstreetmaps hat das Ziel, alles auf der Welt abzubilden, obwohl sie nicht ganz da sind, lohnt es sich, den Überblick zu behalten, da sie ihre Daten unter einer CC-Lizenz bereitstellen

Viele (die meisten?) Anderen Länder werden jedoch nur von der Regierung oder von Diensten kartiert, für die Sie eine Gebühr zahlen müssen. Wenn Sie nicht sehr viele Daten geocodieren müssen, reicht es möglicherweise aus, Google, Yahoo oder einige der anderen kostenlosen weltweiten Kartendienste zu verwenden.

Wenn Sie viele Daten geocodieren müssen, können Sie Kartendaten von einem großen Anbieter wie Teleatlas am besten leasen.

-Adam


Dies würde nicht funktionieren (für diese Frage; im Allgemeinen klingt es für die USA gut), da die Frage bereits besagt, dass eine Lösung, die nur für US-Adressen funktioniert, keine akzeptable Lösung wäre.
PeSHIr

1
Das stimmt, aber ursprünglich wurde dies in der Frage nicht angegeben - Änderungen, die der Autor innerhalb von 15 Minuten nach dem ursprünglichen Beitrag vorgenommen hat, gelten nicht als Änderungen. Trotzdem werde ich die Antwort aktualisieren.
Adam Davis


7

Google verlangt, dass Sie eine Google-Karte mit ihren Daten mit maximal 2,5.000 (bisher 25.000) HTTP-Anforderungen pro Tag anzeigen. Nützlich, aber Sie müssen die Nutzung beobachten.

Sie haben

http://groups.google.com/group/Google-Maps-API/web/resources-non-google-geocoders

(Google hat dies inzwischen entfernt. Wenn Sie ein Duplikat oder einen Cache sehen, werde ich darauf verlinken.)

... in dem ich GeoNames gefunden habe, das sowohl eine herunterladbare Datenbank als auch einen kostenlosen Webdienst und einen kommerziellen Webdienst enthält.


1
Leider scheint der Link groups.google.com nicht mehr zu existieren ... Vielen Dank für den Link geonames, sieht jedoch vielversprechend aus!
Funka

1
Korrektur- / Klarstellungspunkt: Die Google "v3" -API erlaubt 2.500 Anfragen pro Tag (pro IP-Adresse!), Nicht 25.000. Siehe developer.google.com/maps/documentation/geocoding/#Limits
Funka

4

Mit den Nutzungsbedingungen von Google können Sie die Geokodierungs-API kostenlos verwenden, wenn Ihre Website wiederum für Verbraucher kostenlos ist. Wenn nicht, müssen Sie eine Lizenz für die Enterprise Maps erwerben.


3

Zur Verwendung mit Drupal und PHP (und leicht zu ändern):

function get_lat_long($address) {
  $res = drupal_http_request('http://maps.googleapis.com/maps/api/geocode/json?address=' . $address .'&sensor=false');
  return json_decode($res->data)->results[0]->geometry->location;
}

Super! Gott sei Dank, lies die ganze Antwort, das ist deine Antwort. Soll ich wissen, gibt es irgendwelche Einschränkungen bei der Verwendung dieser URL in normalen PHP. Wie viele Anfragen pro Tag? @Nate
Rajesh



2

R Code zum Abrufen des Breiten- und Längengrads einer Adresse

# CODE TO GET THE LATITUDE AND LONGITUDE OF A STREET ADDRESS WITH GOOGLE API
addr <- '6th Main Rd, New Thippasandra, Bengaluru, Karnataka'  # set your address here
url = paste('http://maps.google.com/maps/api/geocode/xml?address=', addr,'&sensor=false',sep='')  # construct the URL
doc = xmlTreeParse(url) 
root = xmlRoot(doc) 
lat = xmlValue(root[['result']][['geometry']][['location']][['lat']]) 
long = xmlValue(root[['result']][['geometry']][['location']][['lng']]) 
lat
[1] "12.9725020"
long
[1] "77.6510688"

2

Wenn Sie dies in Python tun möchten:

import json, urllib, urllib2

address = "Your address, New York, NY"

encodedAddress = urllib.quote_plus(address)
data = urllib2.urlopen("http://maps.googleapis.com/maps/api/geocode/json?address=" + encodedAddress + '&sensor=false').read()
location = json.loads(data)['results'][0]['geometry']['location']
lat = location['lat']
lng = location['lng']
print lat, lng

Beachten Sie, dass Google Anforderungen zu drosseln scheint, wenn mehr als eine bestimmte Menge angezeigt wird. Daher möchten Sie in Ihrer HTTP-Anforderung einen API-Schlüssel verwenden.


1

Ich hatte einen Stapel von 100.000 Datensätzen als Geocode und stieß auf das Limit der Google API (und da es sich um eine interne Unternehmens-App handelte, mussten wir auf ihren Premium-Service upgraden, der mehr als 10.000 US-Dollar beträgt).

Also habe ich stattdessen Folgendes verwendet: http://geoservices.tamu.edu/Services/Geocode/BatchProcess/ - sie haben auch eine API. (Die Gesamtkosten betrugen ca. 200 $)


1

Sie können dies in JavaScript für Städte wie Kohat versuchen

var geocoder = new google.maps.Geocoder();
var address = "kohat";
geocoder.geocode( { 'address': address}, function(results, status) {
var latitude = results[0].geometry.location.lat();
var longitude = results[0].geometry.location.lng();
alert(latitude+" and "+longitude);
  } 
});

Geben Sie hier die Bildbeschreibung ein


1

In Python mit Geopy wird PyPI verwendet, um die Breite, Länge, Postleitzahl usw. abzurufen. Hier ist der funktionierende Beispielcode.

from geopy.geocoders import Nominatim

geolocator = Nominatim(user_agent="your-app-id")

location = geolocator.geocode("Your required address ")

if location:
    print('\n Nominatim ADDRESS :',location.address)
    print('\n Nominatim LATLANG :',(location.latitude, location.longitude))
    print('\n Nominatim FULL RESPONSE :',location.raw)
else:
   print('Cannot Find')

In Nominatim - Einige Adressen funktionieren nicht, deshalb habe ich gerade MapQuest ausprobiert .
Es wird korrekt zurückgegeben. Mapquest bietet 15000 kostenlose Transaktionen pro Monat. Es reicht mir.

Beispielcode:

import geocoder
g = geocoder.mapquest("Your required address ",key='your-api-key')

for result in g:
   # print(result.address, result.latlng)
   print('\n mapquest ADDRESS :',result.address,result.city,result.state,result.country)
   print('\n mapquest LATLANG :', result.latlng)
   print('\n mapquest FULL RESPONSE :',result.raw)

Ich hoffe es hilft.


0

Ich weiß, dass dies eine alte Frage ist, aber Google ändert den Weg, um Längen- und Breitengrade regelmäßig zu ermitteln.

HTML Quelltext

<form>
    <input type="text" name="address" id="address" style="width:100%;">
    <input type="button" onclick="return getLatLong()" value="Get Lat Long" />
</form>
<div id="latlong">
    <p>Latitude: <input size="20" type="text" id="latbox" name="lat" ></p>
    <p>Longitude: <input size="20" type="text" id="lngbox" name="lng" ></p>
</div>

JavaScript-Code

<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap" async defer></script>

    <script>
    function getLatLong()
    {
        var address = document.getElementById("address").value;
        var geocoder = new google.maps.Geocoder();
        geocoder.geocode( { 'address': address}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var latitude = results[0].geometry.location.lat();
                document.getElementById("latbox").value=latitude;
                var longitude = results[0].geometry.location.lng();
                document.getElementById("lngbox").value=longitude;
            } 
        });
    }
    </script>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.