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 }, 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)。

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

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

也许谷歌想到了一种更智能的方法?

4

3 回答 3

8

地理编码器返回“推荐”视口

您可以在 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);
        }
      });
   }
 }
于 2012-07-05T02:37:13.047 回答
1

地理编码结果提供了包含查询的地址组件类型address_components的数组。

从我非常有限的测试来看,查询中添加的信息越多,这个 address_components 数组就越长。进入“法国”时,只有以下几点:

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

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

添加城市时,有一个名为“locality”的类型。因此,您可以遍历此数组,检查 long_names 与用户输入的内容之间是否匹配,如果只输入城市或国家,这很容易,但可能有很多变化,例如罗马/罗马意大利(拼写差异) ,如果用户同时输入了城市和国家,则必须优先输入城市。

最后,这听起来像是一个非常模糊的搜索和匹配,即使您构建了自己的哈希来将用户输入与可能的地点表示相匹配。

这是我的懒惰方法:

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

检查整个用户输入是否实际上是一个国家名称:如果它匹配一个 long_name 并且条目的类型是“国家”,则将 mapZoom 降低到 5。

使用此 mapZoom 变量应用 setCenter。

于 2012-07-05T01:46:00.243 回答
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));
            }



        }
    }
}

这种方法似乎工作正常。在澳大利亚地址上对其进行测试,我发现一些郊区有邮政编码,而有些则没有——改变了数组的长度。那些没有邮政编码的人似乎在人口较少的地区,但因此对这些人进行较低的缩放对我的目的来说是合适的。

于 2013-08-05T11:45:05.533 回答