Більш точний спосіб розрахунку площі растру


11

У своїй щоденній роботі мені постійно пропонується обчислити області глобальних растрових наборів даних у географічній проекції з роздільною здатністю 30 дуг. Ці набори даних, як правило, є результатом комбінованої операції (типовий приклад - це рослинні класи в поєднанні з шаром країни). Для цього наш підрозділ створив растровий набір даних з площею кожного пікселя в географічній проекції на 30 дугових секунд. З цією сіткою області виконується зональний стан для підсумовування площ для кожного класу. Оскільки я не впевнений, як була створена ця обласна сітка, я завжди замислювався над тим, чи є такий підхід точнішим лише перепрограмуванням растру в проекції на рівну площу (з простих тестів результати двох методів схожі). Хтось переживав подібну ситуацію?


@radouxju Ви начебто припускаєте, що керівництво Bugayevskiy & Snyder, яке я цитую, не є ні достовірним, ні офіційним. (Навпаки, це і те, і інше - особливо враховуючи, що це було результатом співпраці всесвітньо визнаних владних структур у США та Росії!) Що лежить в основі цього скептицизму? Що б більше ви шукали? Зауважте також, що ці розрахунки є абсолютно точними. Точність обмежується лише точністю, з якою задані параметри еліпсоїда, і точністю ваших обчислень: більш висока точність неможлива.
whuber

@whuber Я не припускав, що ваша цитата не є достовірною. Мій коментар з винагородою був зроблений перед тим, як ви відповіли, і коли я востаннє зайшов на сайт, було зарано нагороджувати ще рано.
radouxju

@radouxju Дякую за ваше пояснення! Я не дізнався про щедрість лише години після того, як опублікував відповідь.
whuber

Відповіді:


14

Існує відносно проста точна формула для площі будь-якого сферичного чотирикутника, обмеженого паралелями (лініями широти) та меридіанами (лініями довготи). Це можна отримати прямо, використовуючи основні властивості еліпса (основної осі а та другорядної осі b ), який обертається навколо своєї другорядної осі для отримання еліпсоїда. (Виведення робить приємне вправне обчислення, але я вважаю, що це мало би зацікавило цей сайт.)

Формула спрощується шляхом розбиття обчислення на основні етапи.

По-перше, відстань між східною та західною межами - меридіанами l0 та l1 - це частка цілого кола, що дорівнює q = (l1 - l0) / 360 (коли меридіани вимірюються в градусах) або 1 = ( l1 - l0) / (2 * pi) (коли вимірюються меридіани в радіанах). Знайдіть площу всього зрізу, розташованого між паралелями f0 та f1, і просто помножте його на q .

По-друге, будемо використовувати формулу для площі горизонтального зрізу еліпсоїда, обмеженого екватором (при f0 = 0), і паралелі на широті f (= f1). Площа зрізу між будь-якими двома широтами f0 та f1 (лежить на одній півкулі) буде різницею між більшою та меншою площею.

Нарешті, за умови, що модель справді є еліпсоїдом (а не сферою), площа такого зрізу між екватором і паралеллю на широті f задається

area(f) = pi * b^2 * (log(zp/zm) / (2*e) + sin(f) / (zp*zm))

де aі b- довжини головної та другорядної осей генеруючого еліпса, відповідно,

e = sqrt(1 - (b/a)^2)

- це його ексцентричність, і

zm = 1 - e*sin(f); zp = 1 + e*sin(f)

(Це набагато простіше, ніж обчислення з геодезикою, яка все одно є лише наближенням до паралелей. Будь ласка, зверніть увагу на коментар @cffk щодо способу обчислення log(zp/zm)таким чином, щоб уникнути втрати точності на малих широтах.)

Малюнок

area(f) - площа непрозорого зрізу від екватора до широти f (близько 30 градусів на північ на ілюстрації. X і Y - геоцентричні декартові координатні осі, показані для довідки.

Для еліпсоїда WGS 84 використовуйте постійні значення

a = 6 378 137 meters,  b =  6 356 752.3142 meters,

тягне за собою

e = 0.08181919084296

(Для сферичної моделі з a = b формула стає невизначеною. Ви повинні взяти обмеження як e -> 0 зверху, яке потім зводиться до стандартної формули 2 * pi * a^2 * sin(f).)

Відповідно до цих формул, чотирикутник 30 'на 30' на основі екватора має площу 3077,2300079129 квадратних кілометрів, а чотирикутник 30 'на 30', що торкається полюса (який насправді є просто трикутником), має площу всього 13,6686152 квадратних кілометрів.

Для перевірки формули, застосовані до всіх комірок сітки 720 на 360, що охоплюють земну поверхню, дають загальну площу поверхні 4 * пі * (6371.0071809) ^ 2 квадратних кілометри, що вказує на те, що авталійний радіус Землі повинен бути 6371,0071809 кілометрів. Це відрізняється від значення Вікіпедії лише останньою значною цифрою (приблизно десята частина міліметра). (Я думаю, що розрахунки Вікіпедії трохи відключені :-).

В якості додаткових перевірок, я використовував версії цих формул для відтворення Додатки 4 та 5 в Л. М. Bugayevskiy і Джон П. Снайдер, картографічні проекції: Ручний контрольний (Taylor & Francis, 1995). Додаток 4 показує довжину дуги 30-метрів перерізів меридіанів і паралелей, поданих до найближчого метра. Точкова перевірка результатів показала ідеальну згоду. Потім я відтворив таблицю з кроком 0,0005 ', а не 0,5', і числово інтегрував області чотирикутника, як оцінюється з цими довжинами дуги. Загальна площа еліпсоїда була точно відтворена кращою за вісім значущих фігур. У додатку 5 показані значення area(f)для f = 0, 1/2, 1, ..., 90 градусів, помножені на 1 / (2 * pi). Ці значення задаються найближчим квадратним кілометром. Візуальна перевірка значень біля 0, 45 та 90 градусів показала ідеальну згоду.


Цю точну формулу можна застосувати за допомогою растрової алгебри, що починається з сітки, що задає широти верхніх меж кожної клітини, а інша - широт нижньої межі. Кожна з них, по суті, є y-координатною сіткою. (У кожному випадку ви можете створити, sin(f)а потім zmі zpяк проміжні результати.) Відніміть два результати, візьміть абсолютне значення цього і помножте на дріб q, отриманий на першому кроці (рівний 0,5 / 360 = 1/720 наприклад, для ширини комірки 30 '). Це буде сітка, значення якої містять точнообласті кожної комірки (до власної числової точності сітки). Просто переконайтеся, що висловите широти у формі, очікуваній синусоїдою: багато растрових калькуляторів дадуть вам координати в градусах, але очікують радіани на їх тригельні функції!


Для запису тут наводяться точні площі 30 'на 30' комірок на еліпсоїді WGS 84 від екватора до полюса, з інтервалами 30 ', до 11 цифр (те саме число, що використовується для незначного радіусу b ):

3077.2300079,3077.0019391,3076.5458145,3075.8616605,3074.9495164,3073.8094348,3072.4414813,3070.8457347,3069.0222870,3066.9712434,3064.6927222,3062.1868550,3059.4537865,3056.4936748,3053.3066912,3049.8930202,3046.2528597,3042.3864209,3038.2939285,3033.9756204,3029.4317480,3024.6625762,3019.6683833,3014.4494612,3009.0061153,3003.3386648,2997.4474422,2991.3327939,2984.9950800,2978.4346744,2971.6519646,2964.6473522,2957.4212526,2949.9740951,2942.3063230,2934.4183938,2926.3107788,2917.9839636,2909.4384482,2900.6747464,2891.6933866,2882.4949115,2873.0798782,2863.4488581,2853.6024374,2843.5412166,2833.2658109,2822.7768503,2812.0749792,2801.1608571,2790.0351582,2778.6985716,2767.1518013,2755.3955665,2743.4306011,2731.2576543,2718.8774905,2706.2908892,2693.4986451,2680.5015685,2667.3004848,2653.8962347,2640.2896746,2626.4816763,2612.4731271,2598.2649300,2583.8580035,2569.2532818,2554.4517149,2539.4542684,2524.2619238,2508.8756783,2493.2965451,2477.5255533,2461.5637477,2445.4121891,2429.0719545,2412.5441367,2395.8298444,2378.9302026,2361.8463521,2344.5794500,2327.1306692,2309.5011988,2291.6922441,2273.7050264,2255.5407830,2237.2007674,2218.6862492,2199.9985139,2181.1388633,2162.1086151,2142.9091030,2123.5416769,2104.0077025,2084.3085615,2064.4456516,2044.4203864,2024.2341953,2003.8885234,1983.3848318,1962.7245972,1941.9093120,1920.9404843,1899.8196375,1878.5483108,1857.1280585,1835.5604507,1813.8470724,1791.9895239,1769.9894206,1747.8483931,1725.5680867,1703.1501618,1680.5962932,1657.9081707,1635.0874985,1612.1359952,1589.0553936,1565.8474409,1542.5138984,1519.0565410,1495.4771578,1471.7775513,1447.9595378,1424.0249466,1399.9756206,1375.8134157,1351.5402005,1327.1578567,1302.6682785,1278.0733724,1253.3750574,1228.5752643,1203.6759360,1178.6790272,1153.5865040,1128.4003439,1103.1225355,1077.7550785,1052.2999830,1026.7592702,1001.1349711,975.42912705,949.64378940,923.78101904,897.84288636,871.83147097,845.74886152,819.59715539,793.37845851,767.09488512,740.74855748,714.34160569,687.87616739,661.35438752,634.77841811,608.15041795,581.47255240,554.74699308,527.97591765,501.16150951,474.30595754,447.41145586,420.48020351,393.51440422,366.51626611,339.48800143,312.43182627,285.34996030,258.24462644,231.11805066,203.97246162,176.81009042,149.63317034,122.44393648,95.244625564,68.037475592,40.824725575,13.608615243

Значення знаходяться в квадратних кілометрах.


Якщо ви хочете наблизити ці області або просто краще зрозуміти їх поведінку, формула зводиться до ряду потужностей за цією схемою:

area(f) = 2 * pi * b^2 * z * (1 + (4/3)y + (6/5)y^2 + (8/7)y^3 + ...)

де

z = sin(f), y = (e*z)^2.

(Еквівалентна формула з'являється в рівнянні Бугаєвського та Снайдера, цитата , рівняння (2.1).)

Оскільки e ^ 2 настільки малий (приблизно 1/150 для всіх еліпсоїдальних моделей землі), а z лежить між 0 і 1, y також мало. Таким чином, терміни y ^ 2, y ^ 3, ... швидко зменшуються, додаючи в кожний додаток точність ще двох знаків після коми. Якби ми взагалі ігнорували y , формула була б такою, як область сфери радіуса b . Решта термінів можна розуміти як коригування для екваторіального виступу Землі.


Редагувати

Було порушено питання щодо того, як геодезичний розрахунок відстані площі порівнюється з цими точними формулами. Метод геодезичної відстані наближає кожен чотирикутник геодезичними засобами, а не паралелями, які з'єднують його кути по горизонталі, і застосовує евклідову формулу для трапеції. Для невеликих чотирикутників, таких як 30 'квадратики, це зміщення трохи низько і має відносну точність між 6 і 10 частинами на мільйон. Ось графік помилки для WGS 84 (або будь-якого розумного земного еліпсоїда для цього питання):

Малюнок 2

Таким чином, якщо (1) у вас легкий доступ до геодезичних обчислень відстані і (2) ви можете допустити помилки на рівні ppm, ви можете розглянути можливість використання цих геодезичних обчислень та помноження їх результатів на 1.00000791 для виправлення зміщення. Для ще двох десяткових знаків точності віднімайте pi / 2 * cos (2f) / 10 ^ 6 від поправочного коефіцієнта: результат буде точним до 0,04 проміле.


1
Якщо ваша система забезпечує функцію atanh, то ви можете трохи точніші результати (менше округлення) замінивши журнал (zp / zm) на 2 * atanh (e * sin (f)).
cffk

@cffk Це хороший момент. Я отримав формули спочатку з точки зору atanh, але перетворив їх на логарифми, очікуючи, що (a) більшість користувачів ГІС не знайомі з цією функцією, і (b) багато користувачів не матимуть доступу до систем, в яких вона надається. Хоча втрата точності викликає занепокоєння, швидка перевірка величини ексцентриситету показує, що мало що втрачається при роботі із земними еліпсоїдами - можливо, трохи більше двох знаків після коми. Я забезпечив серію потужностей частково, щоб дозволити читачам досягти максимально можливої ​​точності, якщо вони захочуть.
whuber

3

Відповідь на запитання radouxju залежить від форми пікселя при проектуванні на еліпсоїд. Якщо система координат растра - це довгота та широта, то піксель - це прямокутник прямокутника, і відповідь Уабера може бути використана, або, більш загально, ви можете використовувати формулу для багатокутника, ребра якого є прямими ременем. Якщо система координат - конформна проекція великого масштабу (UTM, площина стану тощо), точніше було б наблизити ребра за геодезикою та використовувати формулу для геодезичного багатокутника. Геодезичні багатокутники, мабуть, найкращі для загального використання, оскільки, на відміну від багатокутників, що рухаються, вони «добре поводяться» поблизу полюсів.

Реалізація формул для геодезичних полігонів та ремнів надається моєю бібліотекою GeographicLib . Геодезична зона доступна кількома мовами; область лінії ремви лише для C ++. Там в онлайн - версія (геодезична + локсодроми) доступна тут . Точність цих розрахунків, як правило, краща за 0,1 квадратний метр.

Вам доведеться судити про достовірні / офіційні ... Геодезичні формули виводяться в зоні під геодезикою (Danielsen, 1989, необхідна підписка) та в Алгоритмах геодезики (Karney, 2013, відкритий доступ). Формули Локсодромія наведені тут .


(+1) Я підтримую цю посаду за корисну інформацію, яка міститься в ній, навіть якщо вона не дуже стосується питання (або щедрості), обидва конкретно стосуються растру в географічних системах координат.
whuber

1

Я зіткнувся з цим питанням, намагаючись визначити формулу для області пікселя WGS84. Хоча відповідь @ whuber дійсно містить цю інформацію, все ж була певна робота, щоб отримати формулу для площі пікселя квадратного градуса на заданій широті. Я включив функцію Python, про яку я писав нижче, яка резюмує це в одному дзвінку. Незважаючи на те, що це не відповідає безпосередньо на запитання афіші про площу цілого растру (хоча можна було б підсумовувати площі всіх пікселів), я думаю, що це все ще корисна інформація для того, хто може шукати подібний розрахунок.

def area_of_pixel(pixel_size, center_lat):
    """Calculate m^2 area of a wgs84 square pixel.

    Adapted from: https://gis.stackexchange.com/a/127327/2397

    Parameters:
        pixel_size (float): length of side of pixel in degrees.
        center_lat (float): latitude of the center of the pixel. Note this
            value +/- half the `pixel-size` must not exceed 90/-90 degrees
            latitude or an invalid area will be calculated.

    Returns:
        Area of square pixel of side length `pixel_size` centered at
        `center_lat` in m^2.

    """
    a = 6378137  # meters
    b = 6356752.3142  # meters
    e = math.sqrt(1 - (b/a)**2)
    area_list = []
    for f in [center_lat+pixel_size/2, center_lat-pixel_size/2]:
        zm = 1 - e*math.sin(math.radians(f))
        zp = 1 + e*math.sin(math.radians(f))
        area_list.append(
            math.pi * b**2 * (
                math.log(zp/zm) / (2*e) +
                math.sin(math.radians(f)) / (zp*zm)))
    return pixel_size / 360. * (area_list[0] - area_list[1])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.