Я использую геокодер Google для lat и lon, и мой вопрос в том, есть ли способ узнать zipcode с широтой и долготой?
Широта и долгота могут найти почтовый индекс?
Ответ 1
Я думаю, что вы ищете address_components[]
в массиве results
. Может быть, что-то вроде этого будет работать, просто набрав ниже, чтобы в нем могли быть ошибки, но я думаю, вы получите эту идею.
http://code.google.com/apis/maps/documentation/geocoding/#Results
function (request, response) {
geocoder.geocode({ 'address': request.term, 'latLng': centLatLng, 'region': 'US' }, function (results, status) {
response($.map(results, function (item) {
return {
item.address_components.postal_code;//This is what you want to look at
}
}
Ответ 2
Приятно отметить, что Google Maps имеет новую версию с момента ее появления.
Ссылка: https://developers.google.com/maps/documentation/geocoding/?csw=1#ReverseGeocoding
Вот обновленный пример для Google Maps v3. Он использует Компоненты адреса, о которых упоминает JIssak. Я должен отметить, что нет возврата. Если он не находит почтовый индекс, он ничего не делает. Это может быть или не быть важным для вашего script.
var latlng = new google.maps.LatLng(p.coords.latitude, p.coords.longitude);
geocoder = new google.maps.Geocoder();
geocoder.geocode({'latLng': latlng}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
if (results[0]) {
for (j = 0; j < results[0].address_components.length; j++) {
if (results[0].address_components[j].types[0] == 'postal_code')
alert("Zip Code: " + results[0].address_components[j].short_name);
}
}
} else {
alert("Geocoder failed due to: " + status);
}
});
Ответ 3
[Удалено нерабочее решение для Google - см. решение @hblackorby.]
Вот версия, которая использует openstreetmap.org, намного проще, чем Google API - Coffeescript, а затем Javascript:
getZip = (cb) ->
# try to populate zip from geolocation/google geocode api
if document.location.protocol == 'http:' && navigator.geolocation?
navigator.geolocation.getCurrentPosition (pos) ->
coords = pos.coords
url = "http://nominatim.openstreetmap.org/reverse?format=json&lat=#{ coords.latitude }&lon=#{ coords.longitude }&addressdetails=1"
$.ajax({
url: url,
dataType: 'jsonp',
jsonp: 'json_callback',
cache: true,
}).success (data) ->
cb(data.address.postcode)
Здесь скомпилированный JavaScript:
getZip = function(cb) {
if (document.location.protocol === 'http:' && (navigator.geolocation != null)) {
return navigator.geolocation.getCurrentPosition(function(pos) {
var coords, url;
coords = pos.coords;
url = "http://nominatim.openstreetmap.org/reverse?format=json&lat=" + coords.latitude + "&lon=" + coords.longitude + "&addressdetails=1";
return $.ajax({
url: url,
dataType: 'jsonp',
jsonp: 'json_callback',
cache: true
}).success(function(data) {
return cb(data.address.postcode);
});
});
}
};
Используйте это так:
getZip(function(zipcode){ console.log("zip code found:" + zipcode); });
Ответ 4
Yahoo PlaceFinder API предоставляет хорошие данные для поиска в режиме поиска по lat/lng:
http://developer.yahoo.com/geo/placefinder/
Вот пример URL-адреса, который они используют:
http://where.yahooapis.com/geocode?q=38.898717,+-77.035974&gflags=R
Ответ 5
Казалось бы, так:
Источник: Служба API Карт Google
Геокодирование - это процесс преобразования адресов (например, "1600 Amphitheatre Parkway, Mountain View, CA" ) в географические координаты (например, широта 37.423021 и longitude -122.083739), которую вы можете использовать для размещения маркеров или размещения карты. API геокодирования Google обеспечивает прямой способ доступа к геокодеру через HTTP-запрос. Кроме того, служба позволяет выполнять обратную операцию (поворот координат по адресам); этот процесс известен как "обратное геокодирование".
Вы также должны проверить эту документацию, которая содержит пример кода: Обратное геокодирование
Ответ 6
Я сделал универсальную функцию для поиска типа, который вы хотите. Не всегда address_component имеет почтовый индекс, страну и т.д., И если они не всегда находятся в одном индексе. Иногда ваш массив имеет длину 8, 6 или что-то еще. Я сделал это в Typescript, просто изменив несколько вещей, чтобы сделать его ванильным JS.
getPlaceTypeValue(addressComponents: Places[], type: string): string {
let value = null;
for (const [i] of addressComponents.entries()) {
if (addressComponents[i].types.includes(type)) {
value = addressComponents[i].long_name;
break;
}
}
return value;
}
ИЛИ
getPlaceTypeValue(addressComponents: any[], type: string): string {
return (addressComponents.find(({ types }) => types.includes(type)) || {}).long_name || null;
}
Пример использования:
this.placesService.getPlaceTypeValue(address.address_components, 'postal_code');
this.placesService.getPlaceTypeValue(address.address_components, 'country');