2011-01-14 8 views
0

Hier ist mein aktueller Code, wie ich verschiedene Komponenten bekomme.Google Reverse-Geocode - Holen Sie sich die Postleitzahl

function getGeocodeFull($address) 
{ 
    if (empty($address)) return false; 

    $_geocode = false; 

    if (($_geocode = $this->getCache($address)) === false) // check if address is has a cache 
    { 
     if (($results = $this->geoGetCoordsFull($address)) !== false) 
     { 
      // sloooooooooopppy.. yes these can all be combined, i know. 
      if (!isset($results->results[0]->geometry->location->lat)) return false; 
      if (!isset($results->results[0]->geometry->location->lat)) return false; 
      if (!isset($results->results[0]->formatted_address))  return false; 
      if (!isset($results->results[0]->address_components))  return false; 

      $_geocode['lat']  = $results->results[0]->geometry->location->lat; 
      $_geocode['lon']  = $results->results[0]->geometry->location->lng; 
      $_geocode['address'] = $results->results[0]->formatted_address; 

      foreach ($results->results[0]->address_components as $component) 
      { 
       if (isset($component->types)) 
       { 
        foreach ($component->types as $type) 
        { 
         switch ($type) 
         { 
          case 'route': 
           $_geocode['street'] = $component->long_name; 
           break; 
          case 'locality': 
           $_geocode['city'] = $component->long_name; 
           break; 
          case 'administrative_area_level_2': 
           $_geocode['county'] = $component->long_name; 
           break; 
          case 'administrative_area_level_3': 
           $_geocode['area'] = $component->long_name; 
           break; 
          case 'postal_code': 
           $_geocode['zip'] = $component->short_name; 
           break; 
         }  
        } 
       }  
      } 

      $this->putCacheFull($address, $_geocode['lat'], $_geocode['lon'], $_geocode['address'], $_geocode['street'], $_geocode['city'], $_geocode['county'], $_geocode['area'], $_geocode['zip']); 
     } 
    } 

    return $_geocode; 
} 

geoGetCoordsFull() verwendet einfach file_get_contents auf der Google-Karte api geocode Seite, decodiert dann die Ergebnisse dann gibt sie.

Ich bin nicht ein großer Fan von dem, wie das aussieht. Es scheint, dass es sehr inkonsequent sein kann. Gibt es noch andere bessere Lösungen, um alle Daten von Google oder einem anderen Dienst zu erhalten?

Ich würde einen anderen Dienst bevorzugen, der Anfragen nicht beschränkt (oder ist es illegal, mehrere Geocode-Dienste wie Bing/Yahoo/etc) zu verwenden ?? (Entschuldigung für das Einwerfen einer anderen Frage)

Wie auch immer, viel Hilfe würde sehr geschätzt werden!

Antwort

1

Ich ging einen anderen Weg, ich habe ein bisschen Code für die Kürze entfernt, aber im Grunde hatte ich einen Tisch mit etwa 16'000 Standorten (alle Standorte in Australien) und durchschlug sie alle, um sie auf Google zu finden Karten, rufen Sie die lat lange Informationen und speichern Sie zurück in der Tabelle, so dass es nie wieder nachgeschlagen werden musste

$ Zeile enthält eine Reihe von Details für den Ort, den ich suche, wie die Adresse, Postleitzahl, Vorort und Zustand

Sie müssen auch einen API-Schlüssel von Google Maps für diesen Code, wie es v2 verwendet. Ich glaube nicht, dass Sie mehr brauchen für v3

define("MAPS_HOST", "maps.google.com"); 
define("KEY", "YOU_KEY_HERE"); 

// Initialize delay in geocode speed 
$delay = 0; 
$lat = ''; 
$lng = ''; 
$base_url = "http://" . MAPS_HOST . "/maps/geo?output=xml" . "&key=" . KEY; 

    $geocode_pending = true; 
    while ($geocode_pending) { 

    flush(); 

    $address = $row['suburb'] . ' ' . $row['postcode'] . ', ' . $row['state'] . ' Australia'; 
    $request_url = $base_url . "&q=" . urlencode($address); 
    $xml = simplexml_load_file($request_url) or die("url not loading"); 

    $status = $xml->Response->Status->code; 
    if (strcmp($status, "200") == 0) { 
     // Successful geocode 
     $geocode_pending = false; 
     $coordinates = $xml->Response->Placemark->Point->coordinates; 
     $coordinatesSplit = split(",", $coordinates); 

     // Format: Longitude, Latitude, Altitude 
     $lat = $coordinatesSplit[1]; 
     $lng = $coordinatesSplit[0]; 

    } else if (strcmp($status, "620") == 0) { 
     // sent geocodes too fast, have a breather and try again soon 
     echo("Google says no... increase the delay to ".($delay/1000000)." seconds<br />\n"); 
     $delay += 100000; 
    } else { 
     // failure to geocode 
     $geocode_pending = false; 
     echo "Address " . $address . " failed to be geocoded. "; 
     echo "Received status " . $status . "<br /> 
\n"; 
    } 
    usleep($delay); 
    } 
    echo("Lat long found for " . $address . "<br />\n"); 
    echo("Lat: " . $lat . "<br />\n"); 
    echo("Long: " . $lng . "<br />\n"); 
+0

Danke, aber ich kann leicht lat/lon von Adressen mit V3 bekommen. Die einzige Sache ist alles andere als lat/lon ... (aka die Arten von Bereichen ... etc) – Jordan

+0

Ich weiß, das ist ein bisschen alt, aber um etwas Zeit/Mühe für diejenigen, die dies finden, zu speichern, seien Sie sich bewusst von Google aktuelle Nutzungsbedingungen (Hinweis: Die Geocodierungs-API darf nur in Verbindung mit einer Google-Karte verwendet werden; Geokodierungsergebnisse sind nicht zulässig, wenn sie nicht auf einer Karte angezeigt werden.) https://developers.google.com/maps/documentation/geocoding/ – puddleglum

Verwandte Themen