Google maps 放大谷歌地图API-城市与国家不同

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

所以。。 我遇到了一个可能很常见的问题

刚刚开始实施google maps api,下面是我将城市解析为lat/lang并将地图居中的代码:

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));
            }



        }
    }
}

这个方法似乎很管用。在澳大利亚地址上测试时,我发现一些郊区有邮政编码,而一些没有——改变了数组的长度。没有邮政编码的似乎是在人口较少的地区,但对于我来说,这些地区的缩放比例较低是合适的。

结果中还返回了一个边界,文档将其描述为“此地理编码结果的精确边界,如果适用”。它可能(如果存在)比“推荐”视口更接近缩放。