20

我有一组 GPolygon 对象,它们附加到我的域模型中的对象并添加到我页面上的地图中。域对象显示在同一页面的列表中,当用户单击其中一个时,我想显示关联的多边形。

我希望显示整个多边形,理想情况下我希望地图以多边形中心为中心。

我希望会有一个地图API调用沿着......

myMap.makeSureYouCanSeeAllThisPolygon(aPolygon);

但我一直没能找到。

如果我必须手动执行此操作,那么我显然可以轻松确定居中,但我如何计算缩放?

4

6 回答 6

81

Google Maps v3 API 本身不支持getBounds()google.maps.Polygon 类的方法。这似乎很奇怪,因为 google.maps.Map 类有一个fitBounds()方法,这正是您正在寻找的。如果您以任何频率使用 Google Maps API,那么这应该在您的技巧包中::

getBounds()google.maps.Polygon 类的方法

google.maps.Polygon.prototype.getBounds = function() {
    var bounds = new google.maps.LatLngBounds();
    var paths = this.getPaths();
    var path;        
    for (var i = 0; i < paths.getLength(); i++) {
        path = paths.getAt(i);
        for (var ii = 0; ii < path.getLength(); ii++) {
            bounds.extend(path.getAt(ii));
        }
    }
    return bounds;
}

有了这种方法,在地图上居中和拟合多边形变得非常简单。

注意:如果您不熟悉getAt()并且getLength()没关系,它们是 google.maps.MVCArray 类独有的方法。当您调用getPaths()多边形的方法时,它会将您的 LatLng 数组作为 LatLng 的可变 MVCArray 返回。您可以在此处准备 MVCArrays - Google Maps v3 API MVCArray class

继续。这是框架,您必须在下一段代码之前的某个地方实现上面的原型方法。

var map = new google.maps.Map(container, opts); // I'll spare the details on this

var coords = [
    new google.maps.LatLng(25.774252, -80.190262)
    ,new google.maps.LatLng(18.466465, -66.118292)
    ,new google.maps.LatLng(32.321384, -64.75737)
    ,new google.maps.LatLng(25.774252, -80.190262)
];

var myPolygon = new google.maps.Polygon({
    paths: coords
    ,strokeColor: "#A80000"
    ,strokeOpacity: 0.8
    ,strokeWeight: 1
    ,fillColor: "#0b2a32"
    ,fillOpacity: 0.12
});

使用舞台设置,您需要做的就是居中并放大这个(或任何)多边形::

map.fitBounds(myPolygon.getBounds());

短而甜。希望有帮助。

——凯文·詹姆斯

于 2011-06-14T05:17:30.610 回答
4

我编写了一个函数来添加到 Kevin James 解决方案中。它需要一个多边形数组并获取地图上所有多边形的边界。你只需要将它们推到一个数组上,然后你就可以调用我的函数来自动缩放地图。

function getArrayBounds(polyArray){
    var bounds = new google.maps.LatLngBounds();
    var path, paths; 
    for(var polys = 0; polys < polyArray.length; polys++) {
        paths = polyArray[polys].getPaths();       
        for (var i = 0; i < paths.getLength(); i++) {
            path = paths.getAt(i);
            for (var ii = 0; ii < path.getLength(); ii++) {
                bounds.extend(path.getAt(ii));
            }
        }
    }
    return bounds;
}
于 2016-01-14T14:38:38.573 回答
2

aPolygon.getBounds().getCenter();您可以通过使用然后使用GLatLng返回的myMap.setCenter()方法来获取多边形的中心点。

要获得缩放级别,您可以使用myMap.getBoundsZoomLevel(aPolygon.getBounds());then 使用 this withmyMap.setZoom()方法。

于 2010-02-01T14:34:38.997 回答
2

他认为:

map.fitBounds(myPolygon.my_getBounds());

工作一种享受。

于 2013-12-15T14:29:03.007 回答
1

该解决方案适用于我已成功添加到地图的多边形。为 google.maps.Polygon 类添加 getBounds() 方法,然后使用 map.fitBounds(myPolygon.getBounds());

于 2012-07-19T22:25:23.667 回答
0

用 ES6 编写的 getBounds 函数的较短版本

google.maps.Polygon.prototype.getBounds = function () {
    let bounds = new google.maps.LatLngBounds();
    this.getPaths().forEach(p => {
        p.forEach(element => bounds.extend(element));
    });
    return bounds;
}

使地图居中

map.fitBounds(poly.getBounds());
于 2021-09-05T08:52:29.293 回答