Рассчитать площадь многоугольника, используя долготу и широту, используя JavaScript - PullRequest
0 голосов
/ 04 декабря 2018

Подход, над которым я работал, заключается в реализации синусоидальной проекции, чтобы получить координаты x, y, а затем использовать функцию для вычисления площади неправильного многоугольника на плоскости.Ниже приведен код, над которым я работал (переменная points представляет собой массив декартовых точек Цезия, который определен в другом месте программы).

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 голосов
/ 04 декабря 2018

Вы используете формула шнурка для площади многоугольника, здесь она дает приближение для сферического многоугольника.В конце добавьте Math/abs, чтобы получить результат независимо от направления обхода и остерегайтесь изменения знака координат на экваторе и 0-м меридиане.

Но из-за этой проблемы вычисления неверны:

Cesium.Cartographic.fromCartesianфункция возвращает координаты результата в радианах

, а вы рассматриваете их как градусы (быстрая проверка: 45/(57*57)=0.0138).

Так что достаточно внести поправку:

 let lat_dist = 6371009;
...