Ранее у меня был скрипт геокодирования Google, работающий для извлечения долготы и широты с использованием локальных адресов в базе данных.
За последние 6 месяцев я поменял хосты, и, видимо, Google внедрил новый прямой геокодер. Теперь он просто возвращает ошибку URL не загружается из вызова скрипта xml.
Я перепробовал все, чтобы мой код работал. Даже примеры кодирования с других сайтов не будут работать на моем сервере. Что мне не хватает? Возможно ли настройка на стороне сервера, которая блокирует это выполнение должным образом?
Попытка № 1:
$request_url = "http://maps.googleapis.com/maps/api/geocode/xml?new_forward_geocoder=true&address=1600+Amphitheatre+Parkway,+Mountain+View,+CA";
echo $request_url;
$xml = simplexml_load_file($request_url) or die("url not loading");
$status = $xml->status;
return $status;
Просто возвращает URL не загружается. Я пробовал с и без new_forwad_geocoder. Я также пытался с и без https.
Строка $ request_url возвращает правильные результаты, если вы просто скопируете ее и вставите в браузер.
Также попробовал это просто посмотреть, смогу ли я получить файл для возврата. Попытка 2:
$request_url = "http://maps.googleapis.com/maps/api/geocode/json?new_forward_geocoder=true&address=1600+Amphitheatre+Parkway,+Mountain+View,+CA";//&sensor=true
echo $request_url."<br>";
$tmp = file_get_contents($request_url);
echo $tmp;
Есть идеи, что может быть причиной сбоя соединения?
Я никогда не мог заставить это работать с XML снова, и вызов file_get_contents был виновником, я почти уверен.
Я опубликовал информацию о работе с JSON / Curl (ниже) на случай, если у кого-то возникнут похожие проблемы.
В конечном счете, я думаю, что проблемы, с которыми я столкнулся, были связаны с обновлением нашей версии Apache на сервере; и некоторые настройки по умолчанию, относящиеся к file_get_contents и fopen, являются более строгими. Я не подтвердил это все же.
Этот код работает, хотя:
class geocoder{
static private $url = "http://maps.google.com/maps/api/geocode/json?sensor=false&address=";
static public function getLocation($address){
$url = self::$url.$address;
$resp_json = self::curl_file_get_contents($url);
$resp = json_decode($resp_json, true);
//var_dump($resp);
if($resp['status']='OK'){
//var_dump($resp['results'][0]['geometry']['location']);
//echo "<br>";
//var_dump($resp['results'][0]['geometry']['location_type']);
//echo "<br>";
//var_dump($resp['results'][0]['place_id']);
return array ($resp['results'][0]['geometry']['location'], $resp['results'][0]['geometry']['location_type'], $resp['results'][0]['place_id']);
}else{
return false;
}
}
static private function curl_file_get_contents($URL){
$c = curl_init();
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_URL, $URL);
$contents = curl_exec($c);
curl_close($c);
if ($contents) return $contents;
else return FALSE;
}
}
$Address = "1600 Amphitheatre Parkway, Mountain View, CA";
$Address = urlencode(trim($Address));
list ($loc, $type, $place_id) = geocoder::getLocation($Address);
//var_dump($loc);
$lat = $loc["lat"];
$lng = $loc["lng"];
echo "<br><br> Address: ".$Address;
echo "<br>Lat: ".$lat;
echo "<br>Lon: ".$lng;
echo "<br>Location: ".$type;
echo "<br>Place ID: ".$place_id;
Других решений пока нет …