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

时间:2012-07-05 01:23:38

标签: google-maps google-maps-api-3

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

刚刚开始实施谷歌地图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)。

如果有人输入国家名称,我想缩小更多。如果它是一个城市,我想放大更多等等。

我唯一能想到的是为每个城市和国家找出合适的缩放比例,将它们存储在一些哈希值中,然后尝试找出正在使用的缩放比例,以通过适当的缩放。

也许谷歌想到了更聪明的方法?

3 个答案:

答案 0 :(得分:7)

地理编码器返回"recommended" viewport

您可以在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);
        }
      });
   }
 }

答案 1 :(得分:1)

地理编码结果为查询提供了包含Address component typesaddress_components数组。

从我非常有限的测试中,查询中添加的信息越多,此address_components数组的时间就越长。进入" France"时,只有以下内容:

> Object
long_name: "France"
short_name: "FR"

types: Array[2]
> 0: "country"
> 1: "political"

添加城市后,会出现名为" locality"的类型。因此,您可以遍历此数组,检查long_names与用户输入的内容之间是否匹配,如果只键入城市或国家/地区,则很容易,但有很多可能的变体,例如Rome / Roma Italy(拼写差异),如果用户同时输入了城市和国家,则必须优先考虑城市。

最后,它听起来像一个非常模糊的搜索和匹配,即使你构建了自己的哈希来匹配用户输入到可能的地方表示。

这是我的懒惰方法:

创建var mapZoom = 13;(假设它是一个城市)

检查整个用户输入是否实际上是国家/地区名称:如果它与long_name匹配且条目类型为" country",则将mapZoom降低为5.

使用此mapZoom变量应用setCenter。

答案 2 :(得分:0)

另一个(有时是有问题的)解决方案是计算address_components数组的长度。

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



        }
    }
}

此方法似乎可以正常工作。在澳大利亚地址上测试我发现一些郊区有一个邮政编码而一些没有 - 改变了数组的长度。那些没有邮政编码的人似乎在人口较少的地区,但是那些缩放比例适合我的目的。