我有一个问题与Leaflet Draw插件一起使用。 我能够确定一个多边形是否包含里面的标记,或者当我绘制多边形或标记时,标记是否放置在多边形内:
polygon.getBounds().contains([latitude, longitude])
我正在寻找任何类似的例子,我想知道当我触摸多边形时,或者内部有另一个多边形,或者与另一个多边形相交。
¿有没有办法以简单的方式做到这一点?
谢谢大家的时间。 最好成绩!
答案 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方法,可以计算几何是否包含另一个几何。它还有一个完全相反的内部方法和一个交叉方法。几乎所有你需要的东西,然后一些像:覆盖,十字架,重叠和触摸。