使用JavaScript

时间:2018-12-04 00:49:41

标签: javascript geometry polygon area

我一直在研究的方法是实现正弦投影以获取x,y坐标,然后使用函数来计算平面中不规则多边形的面积。 下面是我一直在处理的代码(points变量是在程序的其他位置定义的Cesium Cartesian点的数组)。

https://stackoverflow.com/a/4682656/7924630这是一个非常有用的答案,它帮助我解决了这个问题

function polygonArea(X, Y, numPoints) {
  let area = 0;         // Accumulates area in the loop
  let 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;
}


let xpoints = [];
let ypoints = [];
let lat_dist = (6371009 * Math.PI) / 180;
var i;
for (i = 0; i < points.length; i++) {
    let cartoPoint = Cesium.Cartographic.fromCartesian(points[i]);
    let lng = cartoPoint.longitude;
    let lat = cartoPoint.latitude;
    xpoints[i] = lng * lat_dist * Math.cos(lat);
    ypoints[i] = lat * lat_dist;
};
surfaceArea = polygonArea(xpoints, ypoints, xpoints.length);

由于某种原因,该区域返回的值非常小,我不明白为什么。例如,我在矩形区域上对此进行了测试。面积应约为45平方米,但返回面积为0.0137平方米。我已经尝试了以下其他实现,但是还没有找到对本机Javascript有用的任何东西。

1 个答案:

答案 0 :(得分:0)

您将shoelace formula用于多边形区域,此处它给出了球形多边形的近似值。最后添加Math/abs,以独立获得遍历方向的结果,并注意赤道和第0个子午线的坐标符号变化。

但是由于此问题,计算不正确:

Cesium.Cartographic.fromCartesian函数返回结果坐标in radians

将它们视为度数(快速检查:45/(57*57)=0.0138)。

因此足以进行更正:

 let lat_dist = 6371009;