12

目标:我想要一个自定义搜索(地理编码)功能,并且能够列出并单击每个结果并将其显示在地图上。

需要:相应地调整地图边界/缩放级别,即搜索“MA, USA”应该放大地图以让我看到整个马萨诸塞州,而搜索“Boston, MA, USA”应该放大波士顿地区。列出多个结果时,单击结果时也应如此。

问题:我可以将geometry.bounds 对象与fitBounds 一起使用-但是-您使用地理编码器获得的某些结果没有该geometry.bounds 对象。

一个简单的例子:搜索“波士顿”返回

美国马萨诸塞州
波士顿 美国印第安纳州
波士顿 美国肯塔基州
波士顿 美国乔治亚州波士顿 31626 美国
弗吉尼亚州塞勒姆波士顿 22713 美国
纽约州波士顿 14025

“Boston, KY”和“Boston NY 14025”都没有界限。

问题:是否有可靠的方法以适当的缩放级别在地图上显示任何地理编码器结果?

现在我正在使用类似的东西,但我觉得这很难看,它不能解决缩放问题

if (results[0].geometry.bounds) {

    map.fitBounds(results[0].geometry.bounds);

} else {

    map.setCenter(results[0].geometry.location);
    // eventually set zoom here to some middle-range value (ugly)
}
4

2 回答 2

20

对。在尝试了两种方法和测试之后,结果是:

  1. 正如文档所说,该geometry.bounds对象是“可选返回的”
  2. 我们不完全知道geometry.bounds对象基于什么
  3. geometry.bounds“可能与推荐的视口不匹配”并且通常不匹配
  4. geometry.bounds返回任何大小和形状的正方形或矩形,而视口函数始终返回具有相同纵横比(大约 1.43)的矩形,无论您的地图容器尺寸是多少,据我测试。

以下是文档中提到的加利福尼亚州旧金山的示例。
红色使用geometry.bounds视口功能,蓝色使用视口功能。

加利福尼亚州旧金山

该解决方案足够简单且可靠。

var resultBounds = new google.maps.LatLngBounds(

    results[0].geometry.viewport.getSouthWest(), 
    results[0].geometry.viewport.getNorthEast()
);

map.fitBounds(resultBounds);
于 2012-02-29T21:15:35.600 回答
1

视口对象具有制作边界对象所需的信息。像这样的东西:

var bounds = new google.maps.LatLngBounds(
    new google.maps.LatLng(results[0].geometry.viewport.southwest.lat, results[0].geometry.viewport.southwest.lng),
    new google.maps.LatLng(results[0].geometry.viewport.northeast.lat, results[0].geometry.viewport.northeast.lng)
);

然后您可以在该新边界对象上使用 fitBounds ,就像您对返回的边界对象所做的那样。像这样:

map.fitBounds(bounds);
于 2012-02-29T17:45:06.220 回答