Google Maps API,获取用户城市/最近的城市/一般区域



我一直在试图编码一个返回一个人在或附近的最合理,最适中城市/城镇/地区的函数。

Yik Yak之类的应用程序使用了这样的算法将人们分组在一起。是否有现有的alogorithims来执行此操作?目前,我正在使用:

 geocoder.geocode({'latLng': latlng}, function (results, status) {
        var city = 'Unknown';
        if (status == google.maps.GeocoderStatus.OK) {
            var details = results[0].address_components;
            for (var i = details.length-1; i >= 0; i--) {
                for (var j=0; j<details[i].types.length;j++) {
                    if (details[i].types[j] == 'locality') {
                        city = details[i].long_name;
                    } else if (details[i].types[j] == 'sublocality') {
                        city = details[i].long_name;
                    } else if (details[i].types[j] == 'neighborhood') {
                        city = details[i].long_name;
                    }
                }
            }

这不是最好的。我刚刚尝试输入这些坐标:{纬度:53.4808,经度:-2.7426}

尚不清楚。当返回地理编码器返回结果时,我看到圣海伦斯将是将该用户放入的最合理规模的组。如果不存在,我也会看到erseysid也是返回的,这将是下一个最好的事情。

在我看来,圣海伦斯和默西德都来自反向地理编码器。

反向地理编码器结果:

[
  {"long_name":"Unnamed Road","short_name":"Unnamed Road","types":["route"]},
  {"long_name":"Saint Helens","short_name":"Saint Helens","types":["postal_town"]},
  {"long_name":"Merseyside","short_name":"Merseyside","types":["administrative_area_level_2","political"]},
  {"long_name":"England","short_name":"England","types":["administrative_area_level_1","political"]},
  {"long_name":"United Kingdom","short_name":"GB","types":["country","political"]},
  {"long_name":"WA11","short_name":"WA11","types":["postal_code","postal_code_prefix"]}
]

如果将这些类型添加到if语句中,则将出现在结果中:

  for (var i = details.length-1; i >= 0; i--) {
    for (var j=0; j<details[i].types.length;j++) {
      if (details[i].types[j] == 'locality') {
        city = details[i].long_name;
      } else if (details[i].types[j] == 'sublocality') {
        city = details[i].long_name;
      } else if (details[i].types[j] == 'neighborhood') {
        city = details[i].long_name;
      } else if (details[i].types[j] == 'postal_town') {
        city = details[i].long_name;
      } else if (details[i].types[j] == 'administrative_area_level_2') {
        city = details[i].long_name;
      }
    }
  }
  console.log("city="+city);
}

概念证明小提琴

代码段:

var geocoder;
var map;
function initialize() {
  var map = new google.maps.Map(
    document.getElementById("map_canvas"), {
      center: new google.maps.LatLng(53.4808, -2.7426),
      zoom: 12,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });
  var marker = new google.maps.Marker({
    map: map,
    position: map.getCenter(),
  });
  geocoder = new google.maps.Geocoder();
  geocoder.geocode({
    'latLng': new google.maps.LatLng(53.4808, -2.7426)
  }, function(results, status) {
    var city = 'Unknown';
    if (status == google.maps.GeocoderStatus.OK) {
      var details = results[0].address_components;
      console.log(JSON.stringify(details));
      for (var i = details.length - 1; i >= 0; i--) {
        for (var j = 0; j < details[i].types.length; j++) {
          if (details[i].types[j] == 'locality') {
            city = details[i].long_name;
          } else if (details[i].types[j] == 'sublocality') {
            city = details[i].long_name;
          } else if (details[i].types[j] == 'neighborhood') {
            city = details[i].long_name;
          } else if (details[i].types[j] == 'postal_town') {
            city = details[i].long_name;
            console.log("postal_town=" + city);
          } else if (details[i].types[j] == 'administrative_area_level_2') {
            city = details[i].long_name;
            console.log("admin_area_2=" + city);
          }
        }
      }
      console.log("city=" + city);
      document.getElementById('city').innerHTML = "city=" + city;
    }
  })
}
google.maps.event.addDomListener(window, "load", initialize);
html,
body,
#map_canvas {
  height: 100%;
  width: 100%;
  margin: 0px;
  padding: 0px
}
<script src="https://maps.googleapis.com/maps/api/js"></script>
<div id="city"></div>
<div id="map_canvas"></div>

最新更新