[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите правильно изменить код
diwert
Доброго времени суток, уважаемые форумчане!
Прошу помощи у знающих людей:
Имеется PHP скрипт, его функция - геокодирование данных взятых из БД MySQL через службу геокодирования maps.google.com (получить географические координаты из имеющихся адресов).
Ввиду того, что точность геоинформации уважаемой корпорации Google в нашей необъятной родине оставляет желать лучшего, появилась здравая мысль - заменить службу геокодирования уважаемой корпорации Google, на службу геокодирования не менее уважаемой корпорации Яндекс.
В коде скрипта запрашивается геоинформация в формате CSV, и соответственно, скрипт извлекает информацию в из файла в формате CSV. Служба геокодирования Яндекса не может выводить запрашиваемую информацию в этом формате, а только в XML или JSON. В этом собственно и проблема, мои знания PHP крайне малы, и я не смог изменить скрипт таким образом, что бы он получал и извлекал информацию из файла в формате XML или CSV.

Фрагмент вышеописанного PHP скрипта (скрипт не мой, комментарии мои, но я чайник в PHP, так что возможно они неправильные):

<?php
function
GeoCodeSobi2Entry($idSobi, &$idNoAdr, &$idErr){
//http-запрос в службу геокодирования (меняется на 'http://geocode-maps.yandex.ru/1.x/?geocode=')
$server = "http://". $this->m_ggmServer . "/maps/geo?output=csv&" ;

//получение адресов для геокодирования из БД, или координат, если требуется обратное геокодирование (координаты -> адреса)
$adresse = null ;
if ($this->m_glReverseGeocode == 1){
$adresse = $this->getCoord($idSobi) ;
$adresse = "&ll=" . urlencode($adresse) ;
}
else {
$adresse = $this->GetAdress($idSobi) ;
$adresse = "&q=" . urlencode($adresse) ;
}
if (!$adresse)
return ;
//сам запрос
$urlRequest = $server . $adresse . "&key=".$this->config->getValueFromDB("google","googleMapsApiKey") ;
//вообще не понял что это...
$delay = 0 ;
$geocodePending = true ;
//и дальше тоже не чего не понял...
while($geocodePending){
if(function_exists('curl_init')) $csv = $this->curl_get_file_contents($urlRequest) or die ("url ".$urlRequest." not loading") ;
else if(function_exists('file_get_contents')) $csv = file_get_contents($urlRequest) or die ("url ".$urlRequest." not loading") ;
else {
return "curl_init problem : 1. If this is a Windows based system, CURL can be enabled by uncommenting the curl extension line in the php.ini file - extension=php_curl.dll and restarting the web server. 2. If this is Unix/Linux, PHP must be compiled with CURL support and the libcurl library must be installed." ;
exit ;
}
//Вот где-то здесь, я так понял, начинается получение информации из ответа геокодера и разбор её "по полочкам" (по массивам)
$csvSplit = split(',', $csv) ;
$status = $csvSplit[0];
if (strcmp($status, "200") == 0){
$geocodePending = false ;
if ($this->m_glReverseGeocode == 1){
$split = split(',', $csv) ;
$add = array() ;
for($is = 2 ; $is<count($split) ; $is++)
$add[] = $split[$is] ;
$this->Sobi2FieldUpdate($idSobi, $this->m_glFullAddress, implode(', ', $add)) ;
} else{
$lat = $csvSplit[2];
$lng = $csvSplit[3];
if ($this->m_pgl_precision == 1){
$val = (rand(-100,100)/50000);
$lat += $val ;
$lng += $val ;
} else if ($this->m_pgl_precision == 2){
$val = (rand(-100,100)/10000);
$lat += $val ;
$lng += $val ;
}
//а это, наверное, обновление данных в БД после получения геоинформации
$this->Sobi2FieldUpdate($idSobi, $this->m_ggmLatField, $lat) ;
$this->Sobi2FieldUpdate($idSobi, $this->m_ggmLngField, $lng) ;
}
return "IdSobi: {$idSobi}: OK: {$status}: "._PEC_GL_OK_GG_ADR ;
}
else if (strcmp($status, "620") == 0){
$delay += 100000 ;
}
else if ((strcmp($status, "601") == 0) OR (strcmp($status, "602") == 0) OR (strcmp($status, "603") == 0)){
$geocodePending = false ;
$idNoAdr[] = $idSobi ;
return "IdSobi: {$idSobi}: "._PEC_GL_ERR_GOOGLE.": {$status}: "._PEC_GL_ERR_GG_ADR ;
}
else {
$geocodePending = false ;
$idErr[] = $idSobi ;
return "IdSobi {$idSobi} : "._PEC_GL_ERR_GOOGLE.": {$status}" ;
}
usleep($delay) ;
}} ?>


В то же время, есть фрагмент кода из другого, аналогичного PHP скрипта, в котором именно такая ситуация - извлечение геоинформации из ответа Яндекса в формате XML:

<?php
$url = 'http://geocode-maps.yandex.ru/1.x/?geocode='.urlencode($addr);
$results = file($url);
if($results && is_array($results) && count($results)) {
$data=implode("", $results);
if(preg_match("#<pos>([0-9\\.]*) ([0-9\\.]*)</pos>#i", $data, $out)) {
$lng=floatval(trim($out[1]));
$lat=floatval(trim($out[2]));
}} ?>


Но вот как их совместить, что бы PHP скрипт отправлял запрос на геокодер Яндекса и получал данные из ответа не в формате CSV, а в формате XML или JSON?

P.S. Прошу прощения, за такой длиииинный вопрос.



Спустя 3 часа, 16 минут, 47 секунд (27.07.2012 - 09:59) DarkLynx написал(а):
Я что то не очень понял, откровенно говоря.
Вам нужно от яндекса получить XML?

Спустя 5 часов, 21 минута, 55 секунд (27.07.2012 - 15:21) diwett написал(а):
Ну да, получить XML, извлечь коордтнаты, внести координаты в БД. Все это скрипт и так делает, но получая данные из CSV.
Я тупо не разобрался какую часть кода заменить, что бы скрипт обрабатывал XML.

P.S. Блин, чего-то я перемудрил...

Спустя 2 минуты, 43 секунды (27.07.2012 - 15:24) DarkLynx написал(а):
Так код который вы привели вторым, получает данные от яндекса данные в формате XML и там же парсит.. В чем проблема я не понимаю никак.

Спустя 11 минут, 41 секунда (27.07.2012 - 15:35) Гость_diwert написал(а):
Проблема, откровенно говоря в том, что я не знаю как вставить код получающий данные от Яндекса в скрипт. Я пытался заменить строки кода, но не понимая что именно меняешь - разумеется не чего не заработает. Вот у меня и не работает.
P.S. Маленькийагмент кода из аналогичного PHP скрипта, но он так сказать ручной - щелкнул раз - получил геоинформацию и ручками вноси её в БД. Второй же скрипт - пакетный, обрабатывает сразу несколько сотен записей и сам заносит данные в БД. Вот я И пытаюсь его заставить работать через Яндекс

Спустя 40 минут, 9 секунд (27.07.2012 - 16:15) diwert написал(а):
Вот, добрался до ноутбука, а то с телефона неудобно писать.
Суть в следующем - скрипт отправлят http-запрос на maps.google.com, например так:
http://maps.google.ru/maps/geo?output=csv&q=moscow
В ответ получает координаты объекта в формате CSV (на самом деле просто координаты объекта в одну строку, 3 и 4 столбец - это широта и долгота) и умеет их оттуда извлекать. Далее скрипт разбивает полученные данные на массивы (если я все правильно понимаю), назначает переменные и дальше ими оперирует (заносит в БД).

я пытаюсь сделать следующее:
скрипт должен отправлять http-запрос на http://geocode-maps.yandex.ru/, например так:
http://geocode-maps.yandex.ru/1.x/?geocode=москва или так http://geocode-maps.yandex.ru/1.x/?format=...&geocode=москва и в ответ получать файл XML или же JSON, далее скрипт должен извлекать данные (полученные координаты) из этого файла, и делать то же самое что он делал в первом случае - разбивать на массивы, назначать переменные и далее ими оперируя (заносить в БД).

Но кроме фрагмета кода с регулярным выражением, который извлекает координаты из XML файла - у меня не чего нет. Даже знаний, как изменить код, что бы он обрабатывал данные из XML а не CSV.

Для того что бы полностью понять ситуацию, можно смоделировать другую - представте что PHP скрипт, фрагмент которого я предоставил отлично работает, но вдруг просто Google перестает представлять информацию в формате CSV, а только в формате XML. Так вот, как мне изменит скрипт, что бы он смог и дальше работать с ответом в виде файла XML?

P.S. Простите меня, если я допустил грубейшие ошибки в PHP, во время своих рассуждений. Я даже не новичок в PHP, я в PHP никто. Просто появилась необходимость для своего проекта переделать этот скрипт (это кстати единственный скрипт, который я не смог исправить сам), вот и прошу помощи и совета у знатоков.

Спустя 1 час, 39 минут, 27 секунд (27.07.2012 - 17:55) diwert написал(а):
Сейчас выяснил интересную деталь - мало того, что Google вообще в упор не понимает наших российских адресов вида: дом 10с5 (10 строение 5), вл12 (владение 12), к200а (Корпус 200 а) и т.д., так он ещё и с русским языком работает через раз, отсюда и все проблемы - Google просто не понимает половину адресов на русском языке.

Заменить Google на Яшу теперь стало жесткой необходимостью...

Попробовал так (подозреваю что это супер мега глупость, на которую способен только я, но, тем не менее, попытка не пытка):


<?php
function
GeoCodeMoscow2Entry($idMoscow, &$idNoAdr, &$idErr){
$server = "http://geocode-maps.yandex.ru/1.x/?geocode=Россия,+" ;

//получение адресов для геокодирования из БД, или координат, если требуется обратное геокодирование (координаты -> адреса)
$adresse = null ;
if ($this->m_glReverseGeocode == 1){
$adresse = $this->getCoord($idMoscow) ;
$adresse = /* "&ll=" . */ urlencode($adresse) ;
}
else {
$adresse = $this->GetAdress($idMoscow) ;
$adresse = /* "&q=" . */ urlencode($adresse) ;
}

if (!$adresse)
return ;

//сам запрос
$urlRequest = $server . $adresse /* . "&key=".$this->config->getValueFromDB("google","googleMapsApiKey&a mp;a mp;a mp;q uot;) */ ;

$delay = 0 ;
$geocodePending = true ; //не понимаю что это и зачем оно нужно
//дальше моя попытка получить данные из XML

if($urlRequest && is_array($urlRequest) && count($urlRequest)) {
$data=implode("", $urlRequest);

//вообще это работает, проверенно на другом скрипте
if(preg_match("#<pos>([0-9\\.]*) ([0-9\\.]*)</pos>#i", $data, $out)) {

$lng=floatval(trim($out[1]));
$lat=floatval(trim($out[2]));

//а вот это видимо уже не работает...
if($lng>0 && $lat>0) {
$this->Moscow2FieldUpdate($idMoscow, $this->m_ggmLatField, $lat) ;
$this->Moscow2FieldUpdate($idMoscow, $this->m_ggmLngField, $lng) ;
}

return "IdMoscow: {$idMoscow}: OK: {$status}: "._PEC_GL_OK_GG_ADR ;
}
else {
return "IdMoscow {$idMoscow} : "._PEC_GL_ERR_GOOGLE.": {$status}" ;
}
usleep($delay) ;
}
}

?>


Не заработало, скрипт выдает - неизвестный адрес (то есть в ответе он не нашел координат на данный адрес).

Спустя 6 часов, 36 секунд (27.07.2012 - 23:55) diwert написал(а):
Проблему решил не знанием PHP, а чисто логикой.
Пусть даже получилось коряво, но работает!
Я перенаправил запрос скрипта на страницу своего же сайта, оттуда отправил запрос на геокодер Яндекса, получил ответ, извлек координаты и вернул их со своей страницы скрипту, в понятном ему формате (в таком же, как у геокодера Google).
В итоге - скрипт работает, точность геоинформации у Яндекса значительно выше, чем у Google, и суточных ограничений на запросы к геокодеру Яндекса нет ни каких (у Google 2500 запросов в 24 часа, далее жесткий бан).

Нагрузка на сервер небольшая, так как операция выполняется разово (пусть и по 10000 записей за раз), потом данные сохраняются в БД.

Большое всем спасибо за внимание! =)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.