Порядок результатов геокодирования Google Maps - PullRequest
0 голосов
/ 23 февраля 2019

Я использую API геокодирования Карт Google для отправки частичных адресов и получения полной информации об адресе.

API Google не согласуется с тем, как он возвращает результаты на основе данных, которые он может сопоставить по частичному адресу,в частности, количество объектов в поле «address_components» (например: иногда оно не будет содержать «administrator_area_level_2», в данном случае «Kings County»).

Есть ли способ для меня получить определенные данные 'address_component'используя поле «типы» в качестве идентификатора?В противном случае, мне кажется, что я должен выполнить большую серию ручных проверок, чтобы определить, сколько адресных_компонентов вернул Google и какие именно.

Интересующая меня часть ответа JSON:

{
"results":[  
  {  
     "address_components":[  
        {  
           "long_name":"125",
           "short_name":"125",
           "types":[  
              "street_number"
           ]
        },
        {  
           "long_name":"Court Street",
           "short_name":"Court St",
           "types":[  
              "route"
           ]
        },
        {  
           "long_name":"Brooklyn",
           "short_name":"Brooklyn",
           "types":[  
              "political",
              "sublocality",
              "sublocality_level_1"
           ]
        },
        {  
           "long_name":"Kings County",
           "short_name":"Kings County",
           "types":[  
              "administrative_area_level_2",
              "political"
           ]
        },
        {  
           "long_name":"New York",
           "short_name":"NY",
           "types":[  
              "administrative_area_level_1",
              "political"
           ]
        },
        {  
           "long_name":"United States",
           "short_name":"US",
           "types":[  
              "country",
              "political"
           ]
        },
        {  
           "long_name":"11201",
           "short_name":"11201",
           "types":[  
              "postal_code"
           ]
        }
     ],

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019
<?php

$addr = json_decode('{json here..}', true);


/**
 * @param string $name
 * @param string $type
 * @param array  $from
 * @return string|array|null
 */
function getByType($name, $type, array $from)
{
    foreach($from as $values) {
        if (in_array($type, $values['types'])) {
            return $values[$name] ?: $values;
        }
    }

    return null;
}


var_dump(getByType('long_name', 'route', $addr['results'][0]['address_components']));

3v4l здесь

0 голосов
/ 23 февраля 2019

Вы можете написать функцию для извлечения объекта компонента данного типа.Примерно так:

$components = ...; // The JSON decoded "address_components" array

/**
 * Get a component by type.
 *
 * @param  {string} $type The component type. E.g. 'street_number'.
 * @return {null|object} The desired component or null in case there's no
 *                       component for the given type.
 */
$componentByType = function ($type) use ($components) {
    $found = array_filter($components, function ($component) use ($type) {
        return in_array($type, $component->types);
    });
    return reset($found);
};

Используя ответ на ваш вопрос, следующий код ...

$component = $componentByType('route');
echo $component->long_name;

... выведет:

Корт-стрит

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...