传单绘制 确定一个多边形是否包含另一个多边形

Leaflet Draw figure out if a polygon includes another one

本文关键字:多边形 一个 包含 另一个 是否 单绘制 绘制      更新时间:2023-09-26

我有一个问题与传单绘制插件有关。当我绘制多边形或标记时,我能够确定多边形内部是否包含标记,或者标记是否放置在多边形内:

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

正在寻找任何做类似事情的例子,我想知道当我画一个多边形时,它是否接触,或者里面有另一个多边形,或者与另一个多边形相交。

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

谢谢大家的时间。最好!

尽管 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 做这些事情(方法布尔包含)

Leaflet 没有进行此类计算的功能。您可以使用像GeoScript这样的库。几何。几何类有一个包含方法,可以计算一个几何是否包含另一个几何。它还有一个完全相反的 in 方法和一个相交方法。几乎所有你需要的东西,然后是一些:封面,十字架,重叠和触摸。