Ниже приведен код, который я сейчас использую, в котором я передаю адрес функции, а API Nominatim должен возвращать JSON, из которого я могу получить широту и долготу адреса.
function geocode($address){
// url encode the address
$address = urlencode($address);
$url = 'http://nominatim.openstreetmap.org/?format=json&addressdetails=1&q={$address}&format=json&limit=1';// get the json response
$resp_json = file_get_contents($url);
// decode the json
$resp = json_decode($resp_json, true);// get the important data
$lati = $resp['lat'];
$longi = $resp['lon'];
// put the data in the array
$data_arr = array();
array_push(
$data_arr,
$lati,
$longi
);
return $data_arr;
}
Проблема в том, что я всегда получаю Внутреннюю ошибку сервера. Я проверил журналы, и это постоянно повторяется:
[[DATE] America/New_York] PHP Notice: Undefined index: title in [...php] on line [...]
[[DATE] America/New_York] PHP Notice: Undefined variable: area in [...php] on line [...]
В чем может быть проблема здесь? Это из-за _
в New_York
? Я пытался использовать str_replace
поменять это с +
но это, похоже, не работает, и та же ошибка все еще возвращается.
Кроме того, URL работает нормально, так как я проверил его через JavaScript и вручную (хотя {$address}
был заменен реальным адресом).
Буду очень признателен за любую помощь в этом, спасибо!
редактировать
Теперь это было исправлено. Кажется, проблема в том, что Nominatim не может получить определенные значения и поэтому возвращает ошибку в результате
Ошибки, которые вы упомянули, не связаны с кодом, который вы разместили с учетом переменных. title
а также area
нет Я могу оказать некоторую помощь geocode
Функция, которую вы опубликовали.
Основная проблема заключается в том, что вокруг $url
строка — это означает, что $address
не вводится в строку, а запросы относятся к широте / длине «$ address». Использование двойных кавычек решает эту проблему:
$url = "http://nominatim.openstreetmap.org/?format=json&addressdetails=1&q={$address}&format=json&limit=1";
Во-вторых, ответ содержит массив массивов (если бы не limit
параметр более одного результата можно ожидать). Поэтому, когда вы получите подробности из ответа, посмотрите в $resp[0]
а не просто $resp
,
// get the important data
$lati = $resp[0]['lat'];
$longi = $resp[0]['lon'];
Вкратце, с некоторыми сокращениями в конце построения массива для простоты:
function geocode($address){
// url encode the address
$address = urlencode($address);
$url = "http://nominatim.openstreetmap.org/?format=json&addressdetails=1&q={$address}&format=json&limit=1";
// get the json response
$resp_json = file_get_contents($url);
// decode the json
$resp = json_decode($resp_json, true);
return array($resp[0]['lat'], $resp[0]['lon']);
}
Если вы довольны тем, что это работает, я бы порекомендовал добавить некоторую обработку ошибок как для http-запроса, так и для декодирования / возврата ответа.
Других решений пока нет …