我正在使用Google地理编码器进行lat和lon,我的问题是,有没有办法可以找到纬度和经度的邮政编码?
答案 0 :(得分:8)
[删除了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); });
答案 1 :(得分:8)
值得注意的是,Google地图自推出此解决方案以来已推出新版本。
参考:https://developers.google.com/maps/documentation/geocoding/?csw=1#ReverseGeocoding
以下是Google Maps v3的更新示例。它使用了JIssak上面提到的地址组件。我应该注意到没有后退。如果找不到邮政编码,它什么都不做。这可能对您的脚本很重要,也可能不重要。
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);
}
});
答案 2 :(得分:7)
我认为你要找的是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
}
}
答案 3 :(得分:2)
Yahoo PlaceFinder API提供了一种通过lat / lng查找位置数据的好方法:
http://developer.yahoo.com/geo/placefinder/
以下是他们使用的示例网址:
http://where.yahooapis.com/geocode?q=38.898717,+-77.035974&gflags=R
答案 4 :(得分:1)
看起来似乎是这样:
地理编码是转换地址的过程(如“1600” Amphitheatre Parkway,Mountain View,CA“)进入地理坐标 (如纬度37.423021和经度-122.083739),您可以使用 放置标记或定位地图。 Google地理编码API 提供通过HTTP请求访问地理编码器的直接方式。 此外,该服务允许您执行逆向操作 (将坐标转换为地址);这个过程被称为 “反向地理编码。”
您还应该查看此文档,其中包含一些示例代码: Reverse Geocoding
答案 5 :(得分:0)
我做了一个通用函数来查找您想要的类型。并非总是address_component具有邮政编码,国家等,如果它们并非始终位于同一索引中。有时,您的数组长度为8、6或其他。我是在Typescript中完成的,只是做了一些改动以使其成为Vanilla 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;
}
OR
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');