2011-01-14 105 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

相关问题