Leaflet如果多边形包含另一个多边形,则绘制出来

时间:2014-11-20 10:35:23

标签: javascript maps leaflet

我有一个问题与Leaflet Draw插件一起使用。 我能够确定一个多边形是否包含里面的标记,或者当我绘制多边形或标记时,标记是否放置在多边形内:

polygon.getBounds().contains([latitude, longitude])

我正在寻找任何类似的例子,我想知道当我触摸多边形时,或者内部有另一个多边形,或者与另一个多边形相交。

¿有没有办法以简单的方式做到这一点?

谢谢大家的时间。 最好成绩!

2 个答案:

答案 0 :(得分:2)

虽然iH8是正确的,而且Leaflet没有支持检查多边形是否包含在另一个多边形中,但我可以通过后面的示例提供更好的答案。

是的,GeoScript提供的方法可以用来检查多边形是否包含在另一个多边形中,但我觉得它很复杂,文档不完整而且不那么直观。

这就是为什么我总是使用JTS(或它的JavaScript端口JSTS)这些事情。要使用那里的传单或谷歌地图坐标,你首先需要将它们转换为简单的JSTS坐标:

function _leafletLatLng2JTS (polygon) {
        var coordinates = [];
        var length = 0;
        if (polygon && polygon.length) {
            length = polygon.length;
        }
        for (var i = 0; i < length; i++) {
            if (polygon.length) {
                coordinates.push(new jsts.geom.Coordinate(polygon[i].lat, polygon[i].lng));
            }
        }
        return coordinates;
}

现在你只需要生成两个JSTS多边形并检查一个是否包含在另一个中:

function _isWithin (firstLayer, secondLayer) {

        var firstInput = _leafletLatLng2JTS(firstLayer.getLatLngs()[0]),
                secondInput = _leafletLatLng2JTS(secondLayer.getLatLngs()[0]),
                geometryFactory = new jsts.geom.GeometryFactory();
        //add last point to the end to create a closed polygon
        firstInput.push(firstInput[0]);
        secondInput.push(secondInput[0]);

        var firstPolygon = geometryFactory.createPolygon(firstInput),
                secondPolygon = geometryFactory.createPolygon(secondInput);

        var isWithin = firstPolygon.contains(secondPolygon);

        return isWithin;
}

如何使用Leaflet.Draw插件,您可以在我创建的jsFiddle中看到。此示例允许您在地图上仅绘制两个图层(这适用于矩形和多边形),然后检查第二个图层是否包含在第一个图层中。如果删除一个,将删除所有内容,以便您可以从头开始绘制。

更新30.10.2017。

现在您可以使用turf.js来处理这些事情(方法booleanContains

答案 1 :(得分:1)

Leaflet没有进行此类计算的功能。您可以使用GeoScript之类的库。 geom.Geometry类有一个contains方法,可以计算几何是否包含另一个几何。它还有一个完全相反的内部方法和一个交叉方法。几乎所有你需要的东西,然后一些像:覆盖,十字架,重叠和触摸。