Получение точного адреса маркера - Google Maps V3 - PullRequest
4 голосов
/ 26 мая 2011

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

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

  • Название улицы;
  • Город *; 1008 *
  • Состояние;
  • County;
  • тогда Страна

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

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);
    }
});

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

  • San Antonio Valley Rd (street name)
  • Ливермор (city)
  • Diablo Range (state)
  • Санта-Клара (county)
  • Калифорния (country)

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

  • 2920 (should be Dalarna Ct)
  • Даларна Ct (should be Turlock)
  • Терлок (this is okay, but is omitted)
  • Терлок (should be Stanislaus)
  • Станислав (should be California)

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

Ответы [ 2 ]

3 голосов
/ 28 мая 2011

Используйте это для вашей 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: «Обратное геокодирование - не точная наука». Тем не менее, я считаю, что это должно обеспечить разумные результаты для большинства мест в Соединенных Штатах. Ваши имена полей (например, «штат»), по-видимому, предполагают местоположение в Соединенных Штатах, поэтому я предполагаю, что они будут соответствовать вашим потребностям или, по крайней мере, будут ближе к идеалу, чем то, что у вас есть сейчас.

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

0 голосов
/ 27 мая 2011

Каждый из этих address_components, в дополнение к наличию свойства "long_name", имеет свойство "types", которое представляет собой массив типов. Вот некоторые из типов: номер улицы маршрут (название улицы) Почтовый индекс и многое другое.

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

...