2010-04-12 3 views
10

I Postleitzahl in meiner großen Datenbank haben, die Werte wie SL5 9JH, LU1 3TQ usw.Fetch Breite Länge von Postleitzahlen zu maps.google.com mit Javascript vorbei

Nun enthält, wenn ich oben bin Postleitzahl einfügen zu maps.google.com zeigt auf einen perfekten Standort.

Meine Anforderung ist, dass ich Postleitzahlen an maps.google.com weiterleiten möchte und einen entsprechenden Längen- und Breitengrad des angegebenen Ortes angeben soll in meiner Datenbank speichern.

Also, wahrscheinlich sollte es einige Javascript, für das sein ... Wenn jemand eine andere Idee hat in Bezug auf, dass es bitte geben ..

Vielen Dank im Voraus ...

Antwort

10

Der Fachbegriff für den Prozess, den Sie beschreiben, heißt reverse geocoding. Google bietet die The Google Geocoding Web Service New working Google Geocoding Link, wo Sie Geocodierung auf der Server-Seite anstelle von JavaScript auf der Client-Seite umkehren können.

Zum Beispiel, wenn Sie die folgenden URLs in Ihrem Browser versuchen, würden Sie die geografische Breite und Länge der Postleitzahl im q Parameter übergeben zurück, im CSV-Format:

http://maps.google.com/maps/geo?q=SL59JH,+UK&output=csv&sensor=false 

http://maps.google.com/maps/geo?q=LU13TQ,+UK&output=csv&sensor=false 

Dies ist, wie würden Sie der Lage sein, geocode Ihre Postleitzahlen in pHP rückgängig zu machen, zum Beispiel:

$url = 'http://maps.google.com/maps/geo?q=SL59JH,+UK&output=csv&sensor=false'; 

$data = @file_get_contents($url); 

$result = explode(",", $data); 

echo $result[0]; // status code 
echo $result[1]; // accuracy 
echo $result[2]; // latitude 
echo $result[3]; // longitude 

Beachten Sie, dass als Pekka suggested in another answer, die Google Maps API Terms of Use-prohibit the storage of the results erscheinen, es sei denn, der Speicher dient als Cache für Daten das wird u sed in Google Maps. Möglicherweise möchten Sie sich mit Google in Verbindung setzen und unter der Google Maps API Premier nach flexibleren Nutzungsbedingungen für Ihre Geocodierungsanforderungen suchen.

+0

@Daniel ... Vielen Dank für Ihr Feedback .. Ich werde mit Ihren gegebenen Lösungen trainieren und werde zu Ihnen zurückkommen ... – Nirmal

+0

Funktioniert das immer noch mit den obigen Beispielen in meinem Browser bekomme ich 610,0,0,0 zurück. Egal welche Postleitzahl ich probe, immer 610,0,0,0? – QFDev

+0

Ich denke, das liegt daran, dass die Beispiele in dieser Antwort eine alte Version der Karten-API verwenden. Ein neues Beispiel wäre wie folgt: http://maps.googleapis.com/maps/api/geocode/json?address=SL59JH,+UK&sensor=false. Offensichtlich müsste die Abfrage zum Extrahieren von lat/lng geändert werden, da die Ausgabe jetzt JSON statt CSV zurückgibt. – Dan

2

Die Google Geocoding API tut, obwohl Wenn ich mich richtig erinnere, verbieten ihre Nutzungsbedingungen die lokale Speicherung der Geocoding-Ergebnisse.

+0

Ich habe eine Anwendung einmal basierend darauf und ich erinnere mich nicht daran, diese Einschränkung. Ich denke gegen Logik, die Ergebnisse nicht zu speichern, da sie sich im Laufe der Zeit nicht ändern und so einen zukünftigen Ping auf Google speichern. –

+0

@Elzo Sie haben Recht, es ist erlaubt, die Ergebnisse "zwischenzuspeichern", wenn sie in einer Google Maps App verwendet werden: 10.3 http://code.google.com/intl/en-DE/apis/maps/terms.html –

+0

Weiß jemand, ob es eine https-Version gibt, um lang und latt nach Postleitzahl zu bekommen? – AngularM

9

Die Ordnance Survey haben released the postcode locations auf einer Creative Commons-Lizenz (CC-BY v3, IIRC). Es wäre viel weniger Aufwand (und viel klarer legal), das stattdessen zu verwenden.

Es gibt sogar eine Version mit WGS84 (auch bekannt als GPS) Koordinaten gespiegelt durch mySociety

+0

+1 ein Link zu den Ordnance Survey Data Dump wäre auch nett, wenn Sie es griffbereit hätten. –

+0

sein link nach link nach link, kann keine 20mb zip-Datei sehen, wie es auf der ersten Seite verspricht. Nach 5 Minuten schaue ich auf. – brux

+0

@brux von dem Link Ich gab, Sie kreuzen die Download-Box für das "Code-Point® Open" -Produkt, gehen Sie zum nächsten, füllen Sie das Formular aus und warten Sie auf die E-Mail mit dem Download-Link. So einfach ist das. –

1

Ich weiß, dass dies eine alte Frage, aber nur Chipping hier mit, wie ich es geschafft, die gleiche Sache (in PHP zu erreichen, sollte aber sei ziemlich einfach):

  1. Ich hatte eine Datenbank mit Tausenden von unterschiedlich formatierten Postleitzahlen. Ich reinigte jede und jeder von ihnen nach oben, gleichmäßig, mit dieser Funktion und Batch-Updates:

    function clean_postcode($postcode) 
    { 
        $out = preg_replace("/[^a-zA-Z0-9]/", '',strtoupper($postcode)); 
    
        if(strlen($out)>3) 
        { 
         $out = substr($out, 0, (strlen($out) -3)).' '.substr($out, -3); 
        } 
    
        return $out; 
    } 
    
  2. Nachdem nun alle Postleitzahlen einheitlich formatiert sind, habe ich heruntergeladen und importiert die Ordnance Survey-Code-Point-Datensatzes (kostenlos) - https://www.ordnancesurvey.co.uk/opendatadownload/products.html

  3. Ich importierte alle ihre CSVs in meine Datenbank in einer separaten codepoint Tabelle. Von jeder CSV importierte ich die Postleitzahl und die Eastings und Northings Werte.

  4. Ich habe die clean_postcode() Funktion wieder im Batch auf allen Ordnance Survey Daten in meiner Datenbank ausgeführt. Etwa 50% der Postleitzahlen haben Leerzeichen in und 50% nicht - danach wurden sie einheitlich gesetzt.

  5. lief ich die folgende PHP-Skript auf jeder und jede Postleitzahl in der codepoint Tabelle und rettete die Breite und Länge Werte in dieser Tabelle zurückgegeben: http://bramp.net/blog/os-easting-northing-to-lat-long

  6. Fertig! Sie können jetzt einen Lat/Lon-Wert basierend auf gut formatierten Postleitzahlen abgleichen und ziehen.

Weiterführende Literatur: http://www.deepbluesky.com/blog/-/converting-os-coodinates-into-longitude-latitude_7/

13

Ein kurzer Hinweis für diejenigen zu finden, das so beantworten. Die Antwort von Daniel Vassallo verwendet die Google Geocoding API V2, die nun veraltet ist. Die neue v3 API verwendet ein Anforderungsformat wie folgt aus:

http://maps.googleapis.com/maps/api/geocode/output?parameters 

Beispiel für eine Postleitzahl Lookup, um die Daten in JSON Format zurückkehr:

http://maps.googleapis.com/maps/api/geocode/json?address=SL59JH,+UK&sensor=false 

Dies gibt eine JSON Array, das die lat enthält und lang in ergebnis-> Geometrie-> Lage-> lat und ergebnis-> Geometrie-> Lage-> lng

Beispiel Antwort:

{ 
"results" : [ 
    { 
    "address_components" : [ 
     { 
      "long_name" : "SL5 9JH", 
      "short_name" : "SL5 9JH", 
      "types" : [ "postal_code" ] 
     }, 
     { 
      "long_name" : "Windsor and Maidenhead", 
      "short_name" : "Windsor and Maidenhead", 
      "types" : [ "administrative_area_level_2", "political" ] 
     }, 
     { 
      "long_name" : "United Kingdom", 
      "short_name" : "GB", 
      "types" : [ "country", "political" ] 
     }, 
     { 
      "long_name" : "Ascot", 
      "short_name" : "Ascot", 
      "types" : [ "postal_town" ] 
     } 
    ], 
    "formatted_address" : "Ascot, Windsor and Maidenhead SL5 9JH, UK", 
    "geometry" : { 
     "bounds" : { 
      "northeast" : { 
       "lat" : 51.39655490000001, 
       "lng" : -0.66024660 
      }, 
      "southwest" : { 
       "lat" : 51.39457330, 
       "lng" : -0.6624574999999999 
      } 
     }, 
     "location" : { 
      "lat" : 51.39539040, 
      "lng" : -0.66096740 
     }, 
     "location_type" : "APPROXIMATE", 
     "viewport" : { 
      "northeast" : { 
       "lat" : 51.39691308029150, 
       "lng" : -0.6600030697084980 
      }, 
      "southwest" : { 
       "lat" : 51.39421511970851, 
       "lng" : -0.6627010302915021 
      } 
     } 
    }, 
    "types" : [ "postal_code" ] 
    } 
], 
"status" : "OK" 
} 

Die API-Spezifikation ist hier verfügbar: https://developers.google.com/maps/documentation/geocoding/

0

Schauen Sie sich ALgolia Plätze here. Super schnell, Open Source und MIT