我正在使用 Google Maps V3 API。每当用户将图钉放在街道上(或者可能离街道几米/码远)时,它应该得到我用来从掉落的标记中检索的地址组件。
令我困扰的是,当我在街道上放置图钉时,有时它会返回门牌号/名称,但它应该始终返回列表如下:
- 街道名称;
- 城市;
- 状态;
- 县;
- 然后国家
我通过返回从 Google Maps API 生成的整个 JSON 响应的定制浏览地址组件:
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
(街道名称)
- 利弗莫尔
(城市)
- 暗黑破坏神范围
(状态)
- 圣克拉拉
(县)
- 加利福尼亚
(国家/地区)
这是完美的回应,但从某些地方掉落在街道上(主要是拥挤的街道)时,我得到这样的信息:
- 2920
(应该是 Dalarna Ct)
- Dalarna Ct
(应该是 Turlock)
- Turlock
(没关系,但被省略了)
- 特洛克
(应该是斯坦尼斯劳斯)
- Stanislaus
(应该是加州)
我不知道如何制作一个不显示门牌号的万无一失的地址组件,并且应该总是返回有关列表(第一个)的信息,因为数据在删除时总是变化的当我需要它以产生与列表相同的结果时在街道上的标记。
最佳答案
将此用于您的 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 .
关于javascript - 获取标记的精确地址 - Google Maps V3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6130387/