Проблема с форматом геокодирования Google. Получение неопределенной ошибки смещения - PullRequest
0 голосов
/ 26 марта 2020

Я получаю это PHP Примечание: неопределенное смещение: 0 в строке 9. Это касается API Google Geocode в приведенном ниже коде.

При попытке сослаться на значение массива в позиции 0 возникает неопределенная ошибка смещения, но эта позиция не существует. Я предполагаю, что API геокодирования Google изменился за последний год. Так как он должен возвращать другую структуру результата, чем та, которая была изначально запрограммирована. Однако, хотя я знаю это, я не могу найти ничего плохого в коде. Кто-нибудь знает, неправильный ли формат моего кода?

Приведенный ниже код извлекает поля страны и города из формы ввода. Геокод Google определяет широту и долготу города, а затем передает его в API часового пояса для расчета часового пояса. Я скрыл свой ключ API в целях безопасности. Любая помощь приветствуется. Спасибо.

<?php
$town = urldecode($_GET['town']);
$country = urldecode($_GET['country']);

if(!empty($_GET['state'])){
  $state = urldecode($_GET['state']);
}

$location = json_decode(@file_get_contents('https://maps.googleapis.com/maps/api/geocode/json?key=API_KEY_HERE&address='.urlencode($town.', '.(!empty($state) ? $state.', ' : '').$country)), true)['results'][0]['geometry']['location'];



$timezone = json_decode(@file_get_contents('https://maps.googleapis.com/maps/api/timezone/json?key=API_KEY_HERE&location='.$location['lat'].','.$location['lng'].'&timestamp='.date('U')), true);



$time = $timezone['rawOffset'] / 60 / 60;



echo $time;
?>

1 Ответ

0 голосов
/ 26 марта 2020

В этой части вашего кода проблема заключается в следующем:

)['results'][0]['geometry']['location']

Вы предполагаете, что всегда будет результат в позиции 0 (первый элемент). В случае ошибки массив результатов будет пустым, и, следовательно, результат в позиции 0.

Структура результатов API не изменилась. Google не сделал бы этого, поскольку это сломало бы МНОГО приложений. Скорее всего, определенный набор входных данных, например, неверный адрес, выдает сообщение об ошибке.

Посмотрите документацию здесь . Обратите внимание на поле "status", которое содержит различные коды состояния . Вы должны изменить свой код на только попытаться получить элемент из результата, если статус "OK".

Что касается часового пояса, вы должны проверить там код состояния также. ( Вот документы. ) Тогда в большинстве случаев вы должны взять timeZoneId вместо rawOffset. Вы можете использовать этот идентификатор со встроенными функциями часового пояса PHP (DateTime, DateTimeZone классы и т. Д. c. ).

...