所以.. 我遇到了一个可能非常常见的问题。
刚刚开始实施谷歌地图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)。
如果有人输入国家名称,我想缩小更多。如果它是一个城市,我想放大更多等等。
我唯一能想到的是为每个城市和国家找出合适的缩放比例,将它们存储在一些哈希值中,然后尝试找出正在使用的缩放比例,以通过适当的缩放。
也许谷歌想到了更聪明的方法?答案 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 types的address_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));
}
}
}
}
此方法似乎可以正常工作。在澳大利亚地址上测试我发现一些郊区有一个邮政编码而一些没有 - 改变了数组的长度。那些没有邮政编码的人似乎在人口较少的地区,但是那些缩放比例适合我的目的。