Forma más precisa de calcular el área de rásteres

11

En mi trabajo diario, constantemente me piden que calcule áreas de datasets ráster globales en proyección geográfica a una resolución de 30 segundos de arco. Estos conjuntos de datos son normalmente el resultado de una operación Combinar (un ejemplo típico es una clase de vegetación combinada con una capa de país). Para hacer esto, nuestra unidad creó un dataset ráster con el área de cada píxel en proyección geográfica a 30 segundos de arco. Con esta cuadrícula de área, se realiza un zonalstat para sumar las áreas de cada clase. Como no estoy seguro de cómo se creó esta cuadrícula de área, siempre me pregunté si este enfoque es más preciso de simplemente reproyectar el ráster en una proyección de área igual (a partir de pruebas simples, los resultados de los dos métodos son similares). ¿Alguien ha experimentado una situación similar?

Gianluca Franceschini
fuente
@radouxju Parece estar sugiriendo que el manual de Bugayevskiy y Snyder que cito no es creíble ni oficial. (Por el contrario, son ambos, ¡especialmente considerando que fue el resultado de una colaboración de autoridades reconocidas mundialmente en los Estados Unidos y Rusia!) ¿Cuál es la base de ese escepticismo? ¿Qué más estarías buscando? Tenga en cuenta también que estos cálculos son perfectamente precisos. La precisión está limitada solo por la precisión en la que se dan los parámetros elipsoidales y por la precisión de sus cálculos: no es posible una precisión más alta.
whuber
@whuber No estaba sugiriendo que tu cita no fuera creíble. Mi comentario con la recompensa se realizó ANTES de que respondiera, y cuando visité el sitio por última vez, era demasiado pronto para otorgar la recompensa.
radouxju
@radouxju ¡Gracias por tu explicación! No me di cuenta de la recompensa hasta horas después de que publiqué la respuesta.
whuber

Respuestas:

14

Existe una fórmula exacta relativamente simple para el área de cualquier cuadrángulo esférico delimitado por paralelos (líneas de latitud) y meridianos (líneas de longitud). Puede ser derivado rodeos usando propiedades básicas de la elipse (de eje mayor a y eje menor b ) que se hace girar alrededor de su eje menor para producir la elipsoide. (La derivación es un buen ejercicio de cálculo integral, pero creo que sería de poco interés en este sitio).

La fórmula se simplifica dividiendo el cálculo en pasos básicos.

Primero, la distancia entre los límites este y oeste, los meridianos l0 y l1, es una fracción de un círculo entero igual a q = (l1 - l0) / 360 (cuando los meridianos se miden en grados) o 1 = ( l1 - l0) / (2 * pi) (cuando los meridianos se miden en radianes). Encuentre el área de la porción completa ubicada entre los paralelos f0 y f1 y simplemente multiplique eso por q .

En segundo lugar, emplearemos una fórmula para el área de un corte horizontal del elipsoide delimitado por el ecuador (en f0 = 0) y un paralelo en la latitud f (= f1). El área del corte entre dos latitudes f0 y f1 (que se encuentran en el mismo hemisferio) será la diferencia entre el área más grande y la más pequeña.

Finalmente, siempre que el modelo sea realmente un elipsoide (y no una esfera), el área de tal corte entre el ecuador y el paralelo en la latitud f viene dada por

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

donde ay bson las longitudes de los ejes mayor y menor de la elipse generadora, respectivamente,

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

es su excentricidad, y

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

(Esto es mucho más simple que calcular con geodésicas, que de todos modos son solo aproximaciones a los paralelos. Tenga en cuenta el comentario de @cffk sobre una forma de calcular log(zp/zm)de manera que evite la pérdida de precisión en latitudes bajas).

Figura

area(f) es el área del corte opaco desde el ecuador hasta la latitud f (alrededor de 30 grados al norte en la ilustración. X e Y son ejes de coordenadas cartesianas geocéntricas que se muestran como referencia.

Para el elipsoide WGS 84, use los valores constantes

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

que implica

e = 0.08181919084296

(Para un modelo esférico con a = b , la fórmula se vuelve indefinida. Debe tomar un límite como e -> 0 desde arriba, que luego se reduce a la fórmula estándar 2 * pi * a^2 * sin(f)).

De acuerdo con estas fórmulas, un cuadrángulo de 30 'por 30' basado en el ecuador tiene un área de 3077.2300079129 kilómetros cuadrados, mientras que un cuadrángulo de 30 'por 30' que toca un poste (que en realidad es solo un triángulo) tiene un área de solo 13.6086152 cuadrado kilómetros

Como verificación, las fórmulas aplicadas a todas las celdas de una cuadrícula de 720 por 360 que cubre la superficie de la Tierra dan un área de superficie total de 4 * pi * (6371.0071809) ^ 2 kilómetros cuadrados, lo que indica que el radio autálico de la Tierra debe ser de 6371.0071809 kilómetros. Esto difiere del valor de Wikipedia solo en la última cifra significativa (aproximadamente una décima de milímetro). (Creo que los cálculos de Wikipedia están un poco apagados :-).

Como comprobaciones adicionales, utilicé versiones de estas fórmulas para reproducir los Apéndices 4 y 5 en Lev M. Bugayevskiy y John P. Snyder, Map Projections: A Reference Reference (Taylor & Francis, 1995). El Apéndice 4 muestra longitudes de arco de secciones de meridianos y paralelos de 30 pies de largo, dados al metro más cercano. Una verificación puntual de los resultados mostró un acuerdo perfecto. Luego recreé la tabla con incrementos de 0.0005 ', en lugar de incrementos de 0.5', e integré numéricamente las áreas cuadrangulares como se estima con estas longitudes de arco. El área total del elipsoide se reprodujo con precisión a más de ocho cifras significativas. Apéndice 5 muestra los valores de area(f)para f = 0, 1/2, 1, ..., 90 grados, multiplicado por 1 / (2 * pi). Estos valores se dan al kilómetro cuadrado más cercano. Una verificación visual de valores cercanos a 0, 45 y 90 grados mostró un acuerdo perfecto.


Esta fórmula exacta se puede aplicar usando álgebra ráster que comienza con una cuadrícula que da las latitudes de los límites superiores de cada celda y otra que da las latitudes de los límites inferiores. Cada uno de estos es, esencialmente, una cuadrícula de coordenadas y. (En cada caso, es posible que desee crear sin(f)y luego zmy zpcomo resultados intermedios). Reste los dos resultados, tome el valor absoluto de eso y multiplíquelo por la fracción q obtenida en el primer paso (igual a 0.5 / 360 = 1/720 para un ancho de celda de 30 ', por ejemplo). Esta será una cuadrícula cuyos valores contienen exactamenteáreas de cada celda (hasta la precisión numérica propia de la cuadrícula). Solo asegúrese de expresar las latitudes en la forma esperada por la función seno: ¡muchas calculadoras ráster le darán coordenadas en grados pero esperan radianes para sus funciones trigonométricas!


Para el registro, aquí están las áreas exactas de las celdas de 30 'por 30' en el elipsoide WGS 84 desde el ecuador hasta un poste, en intervalos de 30 ', a 11 cifras (el mismo número utilizado para el radio menor 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

Los valores están en kilómetros cuadrados.


Si desea aproximar estas áreas o simplemente comprender mejor su comportamiento, la fórmula se reduce a una serie de potencia que sigue este patrón:

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

dónde

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

(Una fórmula equivalente aparece en Bugayevskiy y Snyder, op. Cit. , Ecuación (2.1).)

Como e ^ 2 es muy pequeño (alrededor de 1/150 para todos los modelos elipsoidales de la Tierra) y z se encuentra entre 0 y 1, y también es pequeño. Por lo tanto, los términos y ^ 2, y ^ 3, ... se hacen más pequeños rápidamente, agregando más de dos decimales de precisión con cada término. Si nos vamos a ignorar y por completo, la fórmula sería la de la zona de una esfera de radio b . Los términos restantes pueden entenderse como correctores de la protuberancia ecuatorial de la tierra.


Editar

Se han planteado algunas preguntas sobre cómo un cálculo de distancia geodésica del área se compara con estas fórmulas exactas. El método de distancia geodésica aproxima cada cuadrángulo por las geodésicas, en lugar de los paralelos, que conectan sus esquinas horizontalmente, y aplica la fórmula euclidiana para un trapecio. Para los cuadrángulos pequeños, como los quads de 30 ', esto está sesgado ligeramente bajo y tiene una precisión relativa entre 6 y 10 partes por millón. Aquí hay una gráfica del error para WGS 84 (o cualquier elipsoide de tierra razonable, para el caso):

Figura 2

Por lo tanto, si (1) tiene fácil acceso a los cálculos de distancia geodésica y (2) puede tolerar un error de nivel de ppm, podría considerar usar esos cálculos geodésicos y multiplicar sus resultados por 1.00000791 para corregir el sesgo. Para dos decimales más de precisión, reste pi / 2 * cos (2f) / 10 ^ 6 del factor de corrección: el resultado será exacto dentro de 0.04 ppm.

whuber
fuente
1
Si su sistema proporciona una función atanh, puede obtener resultados ligeramente más precisos (menos redondeo) reemplazando log (zp / zm) por 2 * atanh (e * sin (f)).
cffk
@cffk Ese es un buen punto. Obtuve las fórmulas originalmente en términos de atanh, pero las convertí en logaritmos esperando que (a) la mayoría de los usuarios de SIG no estuvieran familiarizados con esta función y (b) muchos usuarios no tendrían acceso a los sistemas en los que se proporciona. Aunque la pérdida de precisión es una preocupación potencial, una comprobación rápida de la magnitud de la excentricidad muestra que se pierde poco cuando se trabaja con elipsoides terrestres, quizás un poco más de dos decimales. Proporcioné la serie de potencia en parte para permitir a los lectores lograr la mayor precisión posible si lo desean.
whuber
3

La respuesta a la pregunta de radouxju depende de la forma del píxel cuando se proyecta sobre el elipsoide. Si el sistema de coordenadas del ráster es la longitud y la latitud, entonces el píxel es un rectángulo de línea de rumbo y se puede usar la respuesta de Whuber, o, más generalmente, puede usar la fórmula para un polígono cuyos bordes son líneas de rumbo. Si el sistema de coordenadas es una proyección conforme a gran escala (UTM, plano de estado, etc.), sería más preciso aproximar los bordes por geodésicas y usar la fórmula para un polígono geodésico. Los polígonos geodésicos son probablemente los mejores para uso general, ya que, a diferencia de los polígonos de línea de rumbo, se "comportan bien" cerca de los polos.

Las implementaciones de las fórmulas para los polígonos de línea geodésica y de rumbo son proporcionadas por mi biblioteca GeographicLib . El área geodésica está disponible en varios idiomas; el área de la línea de rumbo es solo C ++. Hay una versión en línea (línea geodésica + rumbo) disponible aquí . La precisión de estos cálculos suele ser mejor que 0.1 metro cuadrado.

Tendrás que juzgar sobre la credibilidad / oficial ... Las fórmulas geodésicas se derivan en el área bajo la geodésica (Danielsen, 1989, se requiere suscripción), y Algoritmos para geodésicas (Karney, 2013, acceso abierto). Las fórmulas de la línea de rumbo se dan aquí .

cffk
fuente
(+1) Estoy votando esta publicación por la información útil que contiene, a pesar de que realmente no aborda la pregunta (o la recompensa), las cuales son específicamente sobre rásteres en sistemas de coordenadas geográficas .
whuber
1

Me encontré con esta pregunta al intentar determinar una fórmula para el área de un píxel WGS84. Si bien la respuesta de @ whuber contiene esta información, todavía fue un trabajo obtener una fórmula para el área de un píxel de grado cuadrado en una latitud dada. He incluido una función de Python que escribí a continuación que resume esto en una sola llamada. Si bien no responde directamente a la pregunta del póster sobre el área de un ráster COMPLETO (aunque se podrían sumar las áreas de todos los píxeles), creo que sigue siendo información útil para alguien que pueda estar buscando un cálculo similar.

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

    Adapted from: /gis//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])
Rico
fuente