【问题标题】:Calculate area of a polygon using longitude and latitude using javascript使用javascript使用经度和纬度计算多边形的面积
【发布时间】:2019-05-05 08:36:45
【问题描述】:

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

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 有用的东西。

【问题讨论】:

  • 公式和代码看起来不错。检查坐标 lat 和 lon 的实际值。还要考虑浮点算术中精度损失的可能性(两个大值的小差异(Y[j]-Y[i])
  • 小添加(不影响面积大小,仅在需要时更正符号):return Math.abs(area/2);
  • 我认为@MBo 可能是这种情况,但即使在更大的范围内,该公式仍然返回微小的值。
  • lng and lat 记录到控制台/文件中。对于 45m^2 的区域,我期望像 40.0001-40.0000 这样的值,纬度相差 10 m(111111m=1 度,0.0001 度 = 10 m)
  • 我使用不同的实现解决了它。如果有人需要这方面的帮助,这篇文章给了我实现的想法:mathforum.org/library/drmath/view/73894.html

标签: javascript geometry polygon area


【解决方案1】:

您将shoelace formula 用于多边形区域,这里它给出了球形多边形的近似值。最后加上Math/abs,可以在遍历方向上独立得到结果,注意赤道和0经线坐标符号变化。

但是由于这个问题导致计算不正确:

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

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

所以改正就够了:

 let lat_dist = 6371009;

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 2016-07-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    相关资源
    最近更新 更多