Google maps 放大谷歌地图API-城市与国家不同
所以。。 我遇到了一个可能很常见的问题 刚刚开始实施google maps api,下面是我将城市解析为lat/lang并将地图居中的代码:Google maps 放大谷歌地图API-城市与国家不同,google-maps,google-maps-api-3,Google Maps,Google Maps Api 3,所以。。 我遇到了一个可能很常见的问题 刚刚开始实施google maps api,下面是我将城市解析为lat/lang并将地图居中的代码: function SetMapAddress(address) { // "London, UK" for example var geocoder = new google.maps.Geocoder(); if (geocoder) { geocoder.geocode({ 'address': address }, functi
function SetMapAddress(address) { // "London, UK" for example
var geocoder = new google.maps.Geocoder();
if (geocoder) {
geocoder.geocode({ 'address': address }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var loc = results[0].geometry.location;
document.map.setCenter(new google.maps.LatLng(loc.lat(),loc.lng(), 13));
}
问题是我正在传递一个静态缩放(13)
如果有人键入一个国家的名称,我想缩小更多。如果它是一个城市,我想放大更多等等
我能想到的唯一一件事就是为每个城市和国家计算出适当的缩放,将它们存储在一些散列中,并尝试找出正在使用的,以通过适当的缩放
也许谷歌想到了一个更聪明的方法 地理编码结果提供了
地址\u组件
数组,其中包含用于查询的
根据我有限的测试,在查询中添加的信息越多,这个address\u components数组就变得越长。当进入“法国”时,只有以下内容:
> Object
long_name: "France"
short_name: "FR"
types: Array[2]
> 0: "country"
> 1: "political"
当添加一个城市时,会有一个名为“Location”的类型。因此,您可以遍历该数组,检查长_名称与用户输入的名称是否匹配,如果只键入一个城市或国家,这很容易,但可能有许多变体,例如罗马/罗马-意大利(拼写差异),如果用户同时输入一个城市和国家,则必须优先考虑该城市
最后,这听起来像是一个非常模糊的搜索和匹配,即使您构建了自己的哈希来匹配用户输入和可能的位置表示
以下是我的懒惰方法:
创建var-mapZoom=13代码>(假设它是一个城市)
检查整个用户输入是否实际上是一个国家名称:如果它匹配一个长名称并且条目的类型是“国家”,则将mapZoom降低到5
使用此mapZoom变量应用setCenter。地理编码器返回一个
您可以在SetMapAddress函数中使用它,如下所示:
function SetMapAddress(address) { // "London, UK" for example
var geocoder = new google.maps.Geocoder();
if (geocoder) {
geocoder.geocode({ 'address': address }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
document.map.fitBounds(results[0].geometry.viewport);
}
});
}
}
另一个(有时有问题的)解决方案是计算地址数组的长度
正如Tina CG Hoehr在另一个回答中提到的,places对象有一个address_components数组。数组保存地址的不同部分
您可以测试address_components数组的长度,并适当设置缩放级别
基于您的代码示例
function SetMapAddress(address) { // "London, UK" for example
var geocoder = new google.maps.Geocoder();
if (geocoder) {
geocoder.geocode({ 'address': address }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var loc = results[0].geometry.location;
// Test address_components
var ac_length = results[0].address_components.length;
if (ac_length == 1) {
// Assume country
document.map.setCenter(new google.maps.LatLng(loc.lat(),loc.lng(), 3));
} else if (ac_length == 2) {
// Assume city
document.map.setCenter(new google.maps.LatLng(loc.lat(),loc.lng(), 7));
} else {
// Everything else can have a standard zoom level
document.map.setCenter(new google.maps.LatLng(loc.lat(),loc.lng(), 13));
}
}
}
}
这个方法似乎很管用。在澳大利亚地址上测试时,我发现一些郊区有邮政编码,而一些没有——改变了数组的长度。没有邮政编码的似乎是在人口较少的地区,但对于我来说,这些地区的缩放比例较低是合适的。结果中还返回了一个边界,文档将其描述为“此地理编码结果的精确边界,如果适用”。它可能(如果存在)比“推荐”视口更接近缩放。