Как использовать Nominatim API через PHP для получения широты и долготы?

Ниже приведен код, который я сейчас использую, в котором я передаю адрес функции, а 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 не может получить определенные значения и поэтому возвращает ошибку в результате

2

Решение

Ошибки, которые вы упомянули, не связаны с кодом, который вы разместили с учетом переменных. 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-запроса, так и для декодирования / возврата ответа.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]