#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. Я тоже пробовал это. Хотя это кажется ненадежным. Я получаю неправильные ответы, которые я сопоставил с типами.