【发布时间】: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