将城市和国家/地区转换为协调点

时间:2012-03-09 16:59:35

标签: php

是否有相当快的PHP代码将城市+国家/地区转换为纬度和经度坐标。我有一个位置列表,我需要将它们转换为坐标。我尝试在javascript中执行此操作,但我遇到了一些问题,试图将结果返回到php以将其存储在我的JSON文件中。那么有没有高效的PHP代码呢?

感谢。

1 个答案:

答案 0 :(得分:0)

在我的应用中,我使用以下功能使用Google服务对地理位置进行地理编码。该函数将一个参数 - location用于地理代码(例如“Boston,USA”或“SW1 1AA,United Kingdom”)并返回带有Lat / Lon的关联数组。如果发生错误或无法确定位置,则返回FALSE。

请注意,在许多情况下,city + country将无法唯一地确定位置。例如,仅美国就有100个城市名为斯普林菲尔德。此外,在将国家/地区传递给地理编码服务时,请确保使用完整的国家/地区名称而不是2个字母的代码。我发现这很难:我正在通过'CA'换取“加拿大”并且得到了奇怪的结果。显然,谷歌认为“CA”的意思是“加利福尼亚”。

function getGeoLocationGoogle($location)
{
    $url = "http://maps.googleapis.com/maps/api/geocode/xml?address=". urlencode($location) . "&sensor=false";
    $userAgent = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 FirePHP/0.4";

    //Setup curl object and execute
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_USERAGENT, $userAgent);
    curl_setopt($curl, CURLOPT_FAILONERROR, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($curl);

    $req = $location;

    //Process response from Google servers
    if (($error = curl_errno($curl)) > 0)
    {
        return FALSE;
    } 

    $geo_location = array();
    //Try to convert XML response into an object
    try
    {
        $xmlDoc = new DOMDocument();
        $xmlDoc->loadXML($result);
        $root = $xmlDoc->documentElement;

        //get errors
        $status = $root->getElementsByTagName("status")->item(0)->nodeValue;
        if($status != "OK")
        {
            $error_msg = "Could not determine geographical location of $location - response code $status";
        }
        $location = $root->getElementsByTagName("geometry")->item(0)->getElementsByTagName("location")->item(0);
        if(!$location)
        {
            return FALSE;
        }

        $xmlLatitude = $location->getElementsByTagName("lat")->item(0);
        $valueLatitude = $xmlLatitude->nodeValue;
        $geo_location['Latitude'] = $valueLatitude; 

        //get longitude
        $xmlLongitude = $location->getElementsByTagName("lng")->item(0);
        $valueLongitude = $xmlLongitude->nodeValue;
        $geo_location['Longitude'] = $valueLongitude;

        //return location as well - for good measure
        $geo_location['Location'] = $req;
    }
    catch (Exception $e)
    {
        return FALSE;
    }       

    return $geo_location;
}