Ответы:
PostGIS 1.5 представила новый тип географии . GEOGRAPHY
Типа позволяет unprojected координат на сфероид , чтобы быть сохранены в виде таблице PostGIS, и некоторые функции анализа должны быть выполнены на них.
ST_Area
запросы могут выполняться по полигонам типа GEOGRAPHY, чтобы вычислить их площадь в квадратных метрах.
Следующий запрос выводит область всех полигонов, использующих сфероид (в настоящее время WGS-84
поддерживается только сфероид), предполагая, что они хранятся с использованием GEOGRAPHY
типа:
SELECT ST_Area(the_geom) FROM table_of_polygons;
Алгоритм, используемый для расчета площади на сфероиде, может быть получен из исходного кода .
Вот ссылка на некоторый код, который даст область простого многоугольника (первоначально с World Wind Forum): http://forum.worldwindcentral.com/showthread.php?t=20724 . Это решает проблему в сфере, примерно на основе отношений:
S = площадь многоугольника; тета - сумма внутренних углов в радианах; n - количество вершин; r - радиус сферы.
См. Также (источник изображения формулы): http://www.geom.uiuc.edu/docs/reference/CRC-formulas/node59.html.
Я был бы рад видеть ссылки и / или код для области многоугольника на сжатом сфероиде.
Вот источник для упрощенного расчета, который мы делаем в OpenLayers. Этот метод взят из «Некоторые алгоритмы для многоугольников на сфере» (Роберт Г. Чемберлен и Уильям Х. Дюкетт, публикация НАСА JPL 07-03). Код, указанный выше, предназначен для определения площади линейного кольца (с географическими координатами). Области для полигонов и мультиполигонов суммируются из колец.
var area = 0.0;
var len = ring.components && ring.components.length;
if (len > 2) {
var p1, p2;
for (var i=0; i<len-1; i++) {
p1 = ring.components[i];
p2 = ring.components[i+1];
area += OpenLayers.Util.rad(p2.x - p1.x) *
(2 + Math.sin(OpenLayers.Util.rad(p1.y)) +
Math.sin(OpenLayers.Util.rad(p2.y)));
}
area = area * 6378137.0 * 6378137.0 / 2.0;
}
Компоненты кольца - это двухэлементные массивы координат x, y (lon, lat) в приведенном выше коде. Метод OpenLayers.Util.rad просто конвертирует градусы в радианы (deg * PI / 180).
Вам нужно будет преобразовать ваши географические координаты в проекцию, имеющую систему координат, которая позволяет вам использовать декартову математику для вычисления площади.
Я считаю, что UTM является принятой стандартной проекцией, поскольку очень просто выбрать зону на основе вашей широты и долготы, а также искажения минимальны даже для разных зон. Итак, если у вас есть многоугольник размером с Техас, вы можете использовать UTM Zone 14 N, и он все равно будет достаточно точным.
Если ваши полигоны находятся над северным или южным полюсом, вам следует вместо этого использовать ИБП , поскольку проекции UTM менее точны по полюсам, и вы будете быстро пересекать их по мере того, как границы будут уменьшаться (поскольку они следуют по линиям долготы)
Как только ваши точки окажутся в дружественной декартовой системе координат, вы можете рассматривать их как многоугольники на сетке и вычислять площадь.
Класс PolygonArea был добавлен в GeographicLib в 2011-07 году. Это вычисляет истинную эллипсоидальную площадь многоугольника, ребра которого являются геодезическими. В отличие от PostGIS, метод не предполагает численного интегрирования. Для документирования (и ссылки на документ, где формулы получены), см.
http://geographiclib.sf.net/html/classGeographicLib_1_1PolygonAreaT.html
(Ссылка исправлена, чтобы отразить обобщение PolygonArea для класса шаблона.)