Якщо у мене є багатокутники в географічних координатах (WGS84), як я вимірюю загальну площу, яку кожен займає на поверхні землі, враховуючи кривизну землі?
Якщо у мене є багатокутники в географічних координатах (WGS84), як я вимірюю загальну площу, яку кожен займає на поверхні землі, враховуючи кривизну землі?
Відповіді:
PostGIS 1.5 представив новий тип GEOGRAPHY . GEOGRAPHY
Типу дозволяє unprojected координат на сфероид , щоб бути збережені у вигляді таблиці PostGIS, і деякі функції аналізу повинні бути виконані на них.
ST_Area
запити можуть виконуватися на полігонах типу GEOGRAPHY, щоб обчислити їхню площу в квадратних метрах.
Наступний запит виводить область всіх полігонів, що використовують сфероїд (на даний момент підтримується лише WGS-84
сфероїд), припускаючи, що вони зберігаються за GEOGRAPHY
типом:
SELECT ST_Area(the_geom) FROM table_of_polygons;
Алгоритм, що використовується для обчислення площі сфероїда, може бути отриманий з вихідного коду .
Ось посилання на якийсь код, який дасть площу простого багатокутника (спочатку від Всесвітнього форуму вітру): http://forum.worldwindcentral.com/showthread.php?t=20724 . Це вирішує проблему у сфері, орієнтовно на основі взаємозв'язку:
S = площа багатокутника; тета - сума внутрішніх кутів у радіанах; n - кількість вершин; r - радіус сфери.
Дивіться також (джерело зображення формули): http://www.geom.uiuc.edu/docs/reference/CRC-formulas/node59.html
Я був би радий побачити посилання та / або код для полігонової області на сплетеному сфероїді.
Ось джерело для спрощеного розрахунку, яке ми робимо у OpenLayers. Цей метод походить від "Деякі алгоритми для полігонів на сфері" (Роберт Г. Чемберлен та Вільям Х. Дюкет, публікація NASA 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 просто перетворює градуси в радіани (град * PI / 180).
Вам потрібно буде перетворити географічні координати в проекцію, яка має систему координат, яка дозволяє використовувати декартову математику для обчислення площі.
Я вважаю, що UTM є прийнятою стандартною проекцією, оскільки дуже просто вибрати зону виходячи з вашої широти та довготи, а також спотворення є мінімальним, навіть у різних зонах. Отже, якщо у вас багатокутник розміром Техасу, ви можете використовувати UTM Zone 14 N, і він все ще буде досить точним.
Якщо ваші багатокутники знаходяться над північним або південним полюсом, тоді вам слід використовувати UPS , оскільки проекції UTM менш точні над полюсами, і ви швидко пройдете їх, оскільки межі стануть меншими (оскільки вони слідують лініям довготи)
Після того, як ваші точки знаходяться в декартовій системі, яка відповідає системі координат, ви можете ставитися до них як до багатокутників на сітці та обчислювати площу.
Клас PolygonArea був доданий до GeographicLib у 2011-07 роках. Тут обчислюється справжня еліпсоїдальна площа багатокутника, краї якого геодезичні. На відміну від PostGIS, метод не передбачає чисельної інтеграції. Про документування (та посилання на папір, з якої виведені формули) див
http://geographiclib.sf.net/html/classGeographicLib_1_1PolygonAreaT.html
(Посилання зафіксовано для відображення узагальнення PolygonArea до шаблонного класу.)