如何让 Google 地图显示整个多边形?

How do I get Google Maps to show a whole polygon?

提问人:Simon 提问时间:2/1/2010 最后编辑:John CondeSimon 更新时间:12/25/2022 访问量:28182

问:

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

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

我希望会有一个地图API调用,就像...

myMap.makeSureYouCanSeeAllThisPolygon(aPolygon);

但我一直找不到。

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

谷歌地图 gpolygon

评论


答:

2赞 James Goodwin 2/1/2010 #1

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

要获得缩放级别,您可以使用然后将其与方法一起使用。myMap.getBoundsZoomLevel(aPolygon.getBounds());myMap.setZoom()

评论

12赞 Benjamin 9/11/2014
这不再是真的!Maps v3 放弃了 getBounds() 方法。
2赞 Pradeep shyam 3/5/2015
选中此链接以扩展多边形以获取边界(Google Map V3),tutorialspots.com/...
82赞 Kevin James 6/14/2011 #2

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

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;
}

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

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

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

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());

评论

0赞 Derek 12/22/2011
这对我不起作用。控制台显示未定义“p”。我注意到谷歌随机更改了它的变量名称,这可能是发生了什么吗?
0赞 Shef 1/26/2012
@Derek应该是 .path = paths.getAt(p);path = paths.getAt(i);
2赞 Johnny Oshika 12/6/2013
这真的很有效。我建议您在 getBounds() polyfill 周围添加一个条件,以防 Google 将来选择本地添加它。类似:if (!google.maps.Polygon.prototype.getBounds)
0赞 pmrotule 2/14/2014
这是一个很好的解决方案,谢谢!我还添加了 JohnnyO 的条件
0赞 intotecho 9/15/2015
在回答另一个问题时发布了类似的解决方案
1赞 infojdem 7/20/2012 #3

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

2赞 user1416526 12/15/2013 #4

认为他想到:

map.fitBounds(myPolygon.my_getBounds());

工作是一种享受。

5赞 Doug 1/14/2016 #5

我写了一个函数来添加到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;
}

评论

0赞 Javi Marzán 1/21/2021
正是我需要的。但是,所有的循环和这些东西都可以在一行中完成:你只需要第一行(),然后是上面的代码,最后是:)行forpolygonsArray.forEach(polygon => polygon.getPaths().forEach(path => path.forEach(latLng => bounds.extend(latLng))));let bounds = new google.maps.....return bounds;
1赞 molhamaleh 9/5/2021 #6

用 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());