2011-01-14 96 views
0

這是我對我如何讓不同組件當前的代碼。谷歌反向地理編碼 - 獲取郵政編碼

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()只是將谷歌地圖API的地址解析頁面上使用的file_get_contents,然後將結果進行解碼,然後返回它們。

我沒有太大的東西,看起來像一個風扇。看起來它可能非常不一致。有沒有其他更好的解決方案來獲取來自谷歌或任何其他服務的所有數據?

我寧願另一種服務,不限制要求(或者是非法使用多種地理編碼服務,如兵/雅虎/等)? (對不起,扔在另一個問題)

反正太大的幫助將是非常讚賞!

回答

1

我去它的另一種方式,我已經刪除了一點的簡碼,但基本上我有一個表,大約16'000位置(在澳大利亞所有的位置),並通過他們全部循環,以找到他們在谷歌地圖,檢索經緯度長的信息,並將其存儲在表格中,因此不必再次查找

$ row包含我正在查找的位置的詳細信息數組,例如地址,郵編,郊區和狀態

您還需要從谷歌地圖API密鑰此代碼,因爲它使用第2版。我不認爲你需要一個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

謝謝,但我可以很容易從地址使用V3獲取經緯度。唯一的東西是一切,但緯度/經度...(又名區域的類型...等) – Jordan 2011-01-14 05:34:13