使用javascript使用经度和纬度计算多边形的面积



我一直在研究的方法是实现正弦投影以获得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);

出于某种原因,这为该区域返回了非常小的值,我不明白为什么。例如,我在一个矩形区域上测试了这个。面积应该大约是45m²,但它返回了0.0137m²。我尝试过其他实现,但没有找到任何对本地Javascript有用的东西。

您使用的是多边形面积的鞋带公式,这里它给出了球形多边形的近似值。最后加上Math/abs,在遍历方向上独立得到结果,注意赤道和0子午线的坐标符号变化。

但由于这个问题,计算不正确:

Cesium.Cartographic.fromCartesian函数返回以弧度为单位的结果坐标

而您将其视为学位(快速检查:45/(57*57)=0.0138(。

因此,进行更正就足够了:

let lat_dist = 6371009;

您可以使用球面几何库这个库从Google Maps Javascript API 中移植了一个很小但很有用的类子集

如何使用

安装库

npm install spherical-geometry-js

在代码中包含库

import { computeArea ,LatLng} from 'spherical-geometry-js/src/index';

进口计算机区域,LatLng

import { computeArea ,LatLng} from 'spherical-geometry-js/src/index';

通过坐标阵列计算面积

getArea(){
var coords = [
{ lat: 12.963340185241163, lng: 77.59504217857734 },
{ lat: 12.963959666837907, lng: 77.5952513908759 },
{ lat: 12.96387994460954, lng: 77.59548340195072 },
{ lat: 12.963263076659977, lng: 77.59528357738415 }
];
//convert coords to latlng
var latLngs = coords.map(function(coord) { 
return new LatLng(coord.lat, coord.lng);
});

return computeArea(latLngs)  //return the area 
}

最新更新