我用 Leaflet 制作了一个网站,可以在OSM-Map
.
现在我要检查多边形的大小,因为多边形不能超过定义的大小,例如 5 平方公里。
有没有人有一个好主意来检查绘制的多边形的大小?
我使用 Leaflet.draw ( https://github.com/Leaflet/Leaflet.draw ) 来绘制一个多边形。
它具有测地线区域功能。'draw:created' 中的示例。
map.on('draw:created', function (e) {
var type = e.layerType,
layer = e.layer;
if (type === 'polygon')
{
var area = L.GeometryUtil.geodesicArea(layer.getLatLngs())
...
我不知道任何可以为您完成此任务的 Leaflet 插件。然而,这样做的算法并不是非常复杂。查看这个网站:http ://www.mathopenref.com/coordpolygonarea2.html ,其中包含算法,以及许多关于算法实际工作原理的视觉示例。
function polygonArea(X, Y, numPoints)
{
area = 0; // Accumulates area in the loop
j = numPoints-1; // The last vertex is the 'previous' one to the first
for (i=0; i<numPoints; i++)
{ area = area + (X[j]+X[i]) * (Y[j]-Y[i]);
j = i; //j is previous vertex to i
}
return area/2;
}
为了将此算法与 Leaflet 多边形一起使用,您将遍历 Polygonpolygon.getLatLngs()
以获得所有纬度/经度对。将它们放入两个单独的数组中 - 一个用于 X 坐标,一个用于 Y 坐标。将这些用作上述函数的参数,并将其numPoints
交给polygon.getLatLngs().length
正如网页所说,从多边形路径的哪个位置开始并不重要。但是,如果您以逆时针顺序开始,您的结果将是否定的。您可以通过简单地获取此函数返回的任何内容的绝对值来处理所有情况。
您可以GeometryUtil.geodesicArea()
像这样使用获取区域:
let area = L.GeometryUtil.geodesicArea(layer.getLatLngs()[0]);