Получение точного адреса маркера — Google Maps V3

#javascript #json #google-maps-api-3 #street-address

#javascript #json #google-maps-api-3 #street-address

Вопрос:

Я использую API Google Maps V3. Всякий раз, когда пользователь сбрасывает pin-код на улице (или, возможно, в нескольких метрах / ярдах от улицы), он должен получить компоненты адреса, которые я использую для извлечения из сброшенного маркера.

Что меня беспокоит, так это то, что когда я добавляю pin-код на улицу, иногда он возвращает номер / название дома, хотя он всегда должен возвращать список как:

  • Название улицы;
  • Город;
  • Состояние;
  • Округ;
  • затем страна

Я просматриваю компоненты адреса с помощью пользовательского интерфейса, который возвращает полный ответ JSON, сгенерированный из Google Maps API:

 getAddress(pinLocation, function(addressobj)
{
    for(i = 0; i < addressobj[0].address_components.length; i  )
    {
        var addressComp = addressobj[0].address_components[i].long_name;
        $('input[type=text][address=comp]:eq('   i   ')').val(addressComp);
    }
});
  

Таким образом, когда данные возвращаются, они возвращают результаты, и каждый компонент адреса (из списка выше) попадает в поле ввода. Вот какие ожидаемые результаты возвращаются:

  • Улица Сан-Антонио-Вэлли (street name)
  • Ливермор (city)
  • Диапазон Diablo (state)
  • Санта-Клара (county)
  • Калифорния (country)

Это идеальный ответ, но из некоторых мест при падении на улице (в основном, на людных улицах) Я получаю что-то вроде:

  • 2920 (should be Dalarna Ct)
  • Dalarna Ct (should be Turlock)
  • Turlock (this is okay, but is omitted)
  • Turlock (should be Stanislaus)
  • Stanislaus (should be California)

Я понятия не имею, как я могу создать надежный адресный компонент, который не отображает номер дома и должен всегда возвращать информацию, касающуюся списка (первого), потому что данные всегда меняются при удалении маркеров на улице, когда мне это нужно для получения тех же результатов, что и список.

Комментарии:

1. Можно ли показать, как вы извлекаете JSON? И возможно ли предоставить ссылку на приложение, чтобы мы могли увидеть это поведение в действии?

2. Почему «идеальный ответ» для Калифорнии (штат) должен заканчиваться в поле country, а для Diablo Range (не штат) — в поле state? Разве штатом не должна быть Калифорния, а страной — Соединенные Штаты? Это просто опечатка?

Ответ №1:

Используйте это для своей getAddress функции:

     geocode2FormFields = {'route':0,
                          'locality':1,
                          'sublocality':1,
                          'administrative_area_level_1':2,
                          'administrative_area_level_2':3,
                          'country':4};

    for(i = 0; i < addressobj[0].address_components.length; i  ) { 
        for(j = 0; j < addressobj[0].address_components[i].types.length; j  ) {
            formFieldIndex = geocode2FormFields[addressobj[0].address_components[i].types[j]];
            if (typeof formFieldIndex !== 'undefined') {
                var addressComp = addressobj[0].address_components[i].long_name;
                $('input[type=text][address=comp]:eq('   formFieldIndex   ')').val(addressComp);
            }
        }
    }
  

Как говорится в документации Google, «Обратное геокодирование не является точной наукой». Тем не менее, я считаю, что это должно обеспечить приемлемые результаты для большинства мест в Соединенных Штатах. Ваши имена полей (например, «state»), похоже, предполагают местоположение Соединенных Штатов, поэтому я предполагаю, что это будет соответствовать вашим потребностям или, по крайней мере, будет ближе к идеалу, чем то, что у вас есть сейчас.

Если вы когда-нибудь обнаружите, что хотите или вам нужно изменить содержимое geocode2FormFields, различные типы описаны в разделе «Типы компонентов адресов» наhttp://code.google.com/apis/maps/documentation/javascript/services.html.

Комментарии:

1. Это не только для США. Приложение будет использоваться глобально со всего мира. Вот что я подразумеваю под состоянием: en.wikipedia.org/wiki/Nation_state

2. Мой код должен быть легко модифицируемым, чтобы соответствовать любой вашей ситуации. Просто просмотрите раздел Типы компонентов адреса в связанном документе и переходите оттуда. Я бы скорректировал его с учетом вашей ситуации, за исключением того, что то, что вы описываете, не имеет для меня большого смысла. Если вы думаете о «государстве» как о «национальном государстве», почему «Диапазон Диабло» должен быть правильным ожидаемым результатом в вашем первом примере? Для меня это не имеет никакого смысла. И я не могу придумать разумную ситуацию, в которой «страной» должна быть Калифорния, а не Соединенные Штаты …. Независимо от того, попробуйте мой код в любом случае!

3. Хммм. Наше мнение отличается, я не могу винить ни вас, ни себя за это, потому что я гражданин Великобритании, и у нас разные взгляды, когда речь заходит о типах местоположения, таких как классификация штата / страны местоположения. Я попробовал ваш код, он довольно хорош, и ваша награда будет присуждена через 5 часов.

4. Интересно! Действительно, вероятно, неизбежно, что все это потребует некоторой настройки, когда вы пересечете национальные границы. Интересно, предпринимаются ли какие-либо усилия по стандартизации форматов адресов / номенклатуры по всему миру.

Ответ №2:

Каждый из этих address_contents, в дополнение к свойству «long_name», имеет свойство «types», которое представляет собой массив, ну, типов. Вот некоторые из типов: street_number маршрут (название улицы) postal_code и многие другие.

Взгляните на http://code.google.com/apis/maps/documentation/places/#PlaceDetails

Комментарии:

1. Я тоже пробовал это. Хотя это кажется ненадежным. Я получаю неправильные ответы, которые я сопоставил с типами.