래스터 영역을 계산하는보다 정확한 방법


11

일상적인 작업에서 저는 30arc 해상도의 지리적 투영에서 전역 래스터 데이터 집합의 영역을 지속적으로 계산해야합니다. 이 데이터 세트는 일반적으로 결합 작업의 결과입니다 (일반적인 예는 국가 계층과 결합 된 초목 클래스입니다). 이를 위해 우리 유닛은 30 arc sec의 지리적 투영에서 각 픽셀의 면적으로 래스터 데이터 세트를 만들었습니다. 이 영역 그리드를 사용하면 각 클래스의 영역을 합하기 위해 zonalstat가 수행됩니다. 이 영역 격자가 어떻게 만들어 졌는지 확실하지 않기 때문에,이 방법이 래스터를 등면 투영법으로 재 투영하는 것보다 더 정확한지 항상 궁금했습니다 (간단한 테스트에서 두 방법의 결과가 비슷 함). 비슷한 상황을 경험 한 사람이 있습니까?


@radouxju 내가 인용 한 Bugayevskiy & Snyder 매뉴얼은 신뢰할 만하거나 공식적인 것이 아니라고 제안하는 것 같습니다. (반대로, 그것은 특히 미국과 러시아의 세계적으로 인정 된 당국의 협력으로 인한 것이라고 생각합니다!) 그 회의론의 기초는 무엇입니까? 무엇을 더 찾고 싶습니까? 또한 이러한 계산은 완벽하게 정확합니다. 정밀도는 타원체 매개 변수가 제공되는 정밀도와 계산의 정밀도에 의해서만 제한됩니다. 더 높은 정밀도는 불가능합니다.
whuber

@ whuber 나는 당신의 인용이 신뢰할만한 것이 아니라고 제안하지 않았습니다. 바운티에 대한 나의 의견은 당신이 대답하기 전에 이루어졌으며, 내가 사이트에 마지막으로 왔을 때 바운티를 수여하기에는 너무 이르다.
radouxju

@radouxju 설명해 주셔서 감사합니다! 나는 답변을 게시 한 후 몇 시간이 될 때까지 현상금을 알지 못했습니다.
whuber

답변:


14

평행선 (위 도선)과 자오선 (경도선)으로 둘러싸인 구면 사각형의 영역에 대해 비교적 간단한 정확한 공식 이 있습니다. 타원체를 생성하기 위해 단축을 중심으로 회전 하는 타원 (주축 a 및 부축 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))

생성 타원의 장축과 단축의 위치 ab길이는 각각

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

편심입니다.

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

(이것은 어쨌든 평행선에 대한 근사치 인 측지학으로 계산하는 것보다 훨씬 간단합니다. log(zp/zm)낮은 위도에서 정밀도 손실을 피하는 방식으로 계산하는 방법에 관한 @cffk의 주석을 참고하십시오 .)

그림

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 'x 30'사각형의 면적은 3077.2300079129 평방 킬로미터이고, 30 'x 30'사각형은 극 (실제 삼각형에 해당)에 닿는 면적은 13.6086152 사각형입니다. 킬로미터.

확인으로 지구 표면을 덮고있는 720 x 360 그리드의 모든 셀에 적용된 공식은 총 표면적이 4 * pi * (6371.0071809) ^ 2 제곱 킬로미터이며, 지구의 정 반경 은 6371.0071809 킬로미터 여야합니다. 이것은 마지막 유효 숫자 (약 10 분의 1 밀리미터)에서만 위키 백과 값과 다릅니다. (나는 Wikipedia의 계산이 약간 벗어났다고 생각한다 :-).

추가 점검으로,이 공식의 버전을 사용하여 Lev M. Bugayevskiy & John P. Snyder, Map Projections : A Reference Manual (Taylor & Francis, 1995)의 부록 4와 5를 재현했습니다 . 부록 4는 가장 가까운 미터에 주어진 30 '길이의 자오선과 평행선의 호 길이를 보여줍니다. 결과의 현장 점검은 완벽한 일치를 보여주었습니다. 그런 다음 0.5 '단위가 아닌 0.0005'단위로 테이블을 재생성하고 이러한 호 길이로 추정 된 사각형 영역을 수치 적으로 통합했습니다. 타원체의 총 면적은 8 자리 이상의 수치로 정확하게 재현되었습니다. 부록도 5의 값 area(f)에 대한 F = 0, 1/2, 1, ..., 1 / (2 * PI)를 곱한 90 개도. 이 값은 가장 가까운 제곱 킬로미터에 제공됩니다. 0, 45 및 90도 근처의 값을 육안으로 확인하면 완벽하게 일치하는 것으로 나타났습니다.


이 정확한 공식 은 각 셀의 상한의 위도를 제공하는 그리드로 시작하여 하한의 위도를 제공하는 그리드로 시작 하는 래스터 대수를 사용하여 적용 할 수 있습니다 . 이들 각각은 본질적으로 y 좌표 그리드입니다. (각각의 경우에서는 만들 수도 sin(f)다음과 zm그리고 zp그 절대 값을 가지고, 두 결과를 뺀다. 중간 결과로서), 및 다중 분획하여 Q 첫 단계에서 수득 한 (동일한 0.5 / 360 = 720분의 1 예를 들어 30 '셀 너비의 경우). 이 값은 정확한 값을 포함하는 그리드가됩니다각 셀의 영역 (그리드 자체의 숫자 정밀도까지). 사인 함수에 의해 예상되는 형식으로 위도를 표현하십시오. 많은 래스터 계산기는 좌표를 각도로 표시하지만 삼각 함수에 라디안을 기대합니다!


기록을 위해 다음 은 적도의 WGS 84 타원체에서 30 'x 30'셀 의 정확한 면적 을 극까지, 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.

(등가 공식은 Bugayevskiy & Snyder, op. cit. , 식 (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 ppm 이내로 정확합니다.


1
시스템이 atanh 함수를 제공하는 경우 log (zp / zm)를 2 * atanh (e * sin (f))로 바꾸면 약간 더 정확한 결과 (반올림이 적음)를 얻을 수 있습니다.
cffk

@cffk 좋은 지적입니다. 나는 원래 atanh의 관점에서 공식을 얻었지만 (a) 대부분의 GIS 사용자는이 기능에 익숙하지 않으며 (b) 많은 사용자가 제공된 시스템에 액세스 할 수 없을 것으로 예상하여 로그로 변환했습니다. 정밀도의 상실이 잠재적 인 관심사이지만, 편심의 크기를 신속하게 점검하면 지구 타원체로 작업 할 때 거의 소실 될 수 있습니다 (아마도 소수점 이하 두 자리 이상). 독자들이 원할 경우 최대한의 정밀도를 얻을 수 있도록 파워 시리즈를 제공했습니다.
whuber

3

radouxju의 질문에 대한 대답은 타원체에 투영 될 때 픽셀의 모양에 달려 있습니다. 래스터의 좌표계가 경도와 위도 인 경우 픽셀은 마름모꼴 선 사각형이며 whuber의 답을 사용할 수 있습니다.보다 일반적으로 가장자리가 마름모꼴 인 다각형의 수식을 사용할 수 있습니다. 좌표계가 대규모 등각 투영 (UTM, 상태 평면 등) 인 경우 측지선으로 모서리를 근사화하고 측지선 다각형에 대한 공식을 사용하는 것이 더 정확합니다. 지오 데식 다각형은 일반적으로 사용하기에 가장 적합합니다. 마름모꼴 선 다각형과 달리 극 근처에서 "잘 동작"하기 때문입니다.

측지선과 마름모 선 다각형에 대한 공식 구현은 내 라이브러리 GeographicLib에서 제공합니다 . 측지 영역은 여러 언어로 제공됩니다. 마름모 선 영역은 C ++ 전용입니다. 사용할 수있는 온라인 버전 (측지 +의 나침 방위 라인)있다 여기가 . 이러한 계산의 정확도는 일반적으로 0.1 평방 미터보다 낫습니다.

신뢰할 수있는 / 공식적으로 판단해야합니다 ... 측지선 공식은 측지선 아래 영역 (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])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.