2012-03-09 2 views
0

Есть ли довольно быстрый PHP-код для преобразования координат города + страны в широту и долготу. У меня есть список мест, и мне нужно преобразовать их в координаты. Я попытался сделать это в javascript, но я столкнулся с некоторыми проблемами, пытаясь вернуть результаты на php, чтобы сохранить их в моем файле JSON. Так есть ли эффективный PHP-код для этого?Преобразование города и страны в координатные точки

Спасибо.

+0

Какую услугу вы используете для геокодирования? Google? Yahoo? Bing? Что-то другое? –

ответ

0

В моем приложении я использую следующую функцию для местоположений геокода, используя службу google. Функция принимает один параметр - location в геокод (например, «Бостон, США» или «SW1 1AA, Великобритания») и возвращает ассоциативный массив с Lat/Lon. Если ошибка возникает или местоположение не может быть определено, то она возвращает FALSE.

Обратите внимание, что во многих случаях город + страна не сможет определить местоположение уникальным образом. Например, есть, вероятно, 100 городов, названных Спрингфилдом только в США. Кроме того, при передаче страны службе геокодирования обязательно укажите полное имя страны, а не 2-буквенный код. Я нашел это трудным путем: я проходил «CA» для «Canada» и получал странные результаты. По-видимому, Google предположил, что «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; 
} 
+0

Мне нужно вычислить координаты для нескольких тысяч мест, так что это достаточно быстро, чтобы страница не вышла из строя? – ewein

+0

Если вам нужно сделать это на нескольких тысячах мест, то, скорее всего, ваш дизайн ошибочен. Вам никогда не придется делать так много запросов на геокодирование на лету. Чего вы пытаетесь достичь? –

+0

Я создаю карту соединений между местоположениями. Поэтому у меня есть база данных, где хранятся мои местоположения, и мне нужно преобразовать эти местоположения в координаты и сохранить координаты в файл JSON. – ewein