ラスターの面積を計算するより正確な方法


11

私の日常業務では、30秒の解像度での地理的投影でグローバルラスターデータセットの面積を計算するように常に求められます。これらのデータセットは通常、Combine操作の結果です(典型的な例は、国のレイヤーと組み合わせた植生クラスです)。これを行うために、ユニットは、地理投影の各ピクセルの面積が30アーク秒のラスタデータセットを作成しました。このエリアグリッドを使用して、各クラスのエリアを合計するためにzonalstatが実行されます。この面積グリッドがどのように作成されたのかわからないので、このアプローチが等面積投影でラスターを再投影するだけの方が正確であるかどうかを常に疑問に思っていました(簡単なテストから、2つの方法の結果は似ています)。誰か同じような状況を経験しましたか?


@radouxjuあなたが私が引用したBugayevskiy&Snyderのマニュアルが信頼できるものでも公式のものでもないことを示唆しているようです。(それどころか、特に米国とロシアで世界的に認められた当局の協力の結果であると考えて!)その懐疑主義の根拠は何ですか?さらに何をお探しですか?また、これらの計算は完全に正確であることに注意してください。精度は、楕円パラメーターが与えられる精度と計算の精度によってのみ制限されます。これ以上の精度は不可能です。
whuber

@whuber私はあなたの引用が信頼できないことを示唆していませんでした。賞金に関する私のコメントは、あなたが答える前に行われました。私が最後にサイトに来たとき、賞金を授与するには早すぎました。
radouxju 14

@radouxju説明ありがとうございます!答えを投稿してから数時間後まで、私は賞金に気づきませんでした。
whuber

回答:


14

緯線(緯度線)と経線(経度線)で囲まれた球形の四角形の面積については、比較的単純で正確な公式があります。楕円を生成するためにその短軸を中心に回転される楕円(長軸aおよび短軸bの)の基本プロパティを使用して、簡単に導出できます。(この導出は、微積分積分の演習になりますが、このサイトではほとんど関心がないと思います。)

式は、計算を基本的なステップに分割することにより簡素化されます。

まず、東と西の境界(子午線l0とl1)間の距離は、q =(l1-l0)/ 360(子午線が度で測定される場合)または1 =( l1-l0)/(2 * pi)(子午線がラジアンで測定される場合)。平行線f0とf1の間にあるスライス全体の面積を求め、それにqを掛けます。

次に、赤道(f0 = 0)と緯度f(= f1)で囲まれた楕円体の水平スライスの面積の式を使用します。任意の2つの緯度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)

(これはとにかく緯線の近似値にすぎない測地線を使用した計算よりもはるかに簡単です。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の値と異なります。(ウィキペディアの計算は少し外れていると思います:-)。

追加のチェックとして、これらの式のバージョンを使用して、付録4および5を、Lev M. BugayevskiyおよびJohn P. Snyder、Map Projections:A Reference Manual(Taylor&Francis、1995)で再現しました。付録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最初の工程で得られた(= 1/720 0.5 / 360に等しいですたとえば、30 'セル幅の場合)。これは、値に正確な値が含まれるグリッドになります各セルの領域(グリッドの数値精度まで)。緯度をサイン関数で期待される形式で表現するようにしてください。多くのラスター計算機は座標を度単位で提供しますが、トリガー関数ではラジアンを期待します!


記録のために、赤道から極までのWGS 84楕円体上の30 '×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、...は急速に小さくなり、各項でさらに小数点以下2桁以上の精度が追加されます。yを完全に無視すると、式は半径bの球の面積になります。残りの用語は、地球の赤道の膨らみを補正するものとして理解できます。


編集

面積の測地線距離の計算がこれらの正確な式とどのように比較されるかに関して、いくつかの質問が提起されました。測地線距離法は、各四角形を、その​​コーナーを水平に接続する平行線ではなく測地線で近似し、台形のユークリッド公式を適用します。30 'クワッドなどの小さな四角形の場合、これはわずかに低くバイアスされ、6〜10 ppmの相対精度を持ちます。WGS 84(または、その点で妥当な地球楕円体)のエラーのプロットは次のとおりです。

図2

したがって、(1)測地線距離の計算に簡単にアクセスでき、(2)ppmレベルの誤差を許容できる場合、それらの測地線計算を使用し、その結果に1.00000791を掛けてバイアスを修正することを検討できます。小数点以下2桁の精度の場合、補正係数からpi / 2 * cos(2f)/ 10 ^ 6を引きます。結果は0.04 ppm以内の精度になります。


1
システムがatanh関数を提供する場合、log(zp / zm)を2 * atanh(e * sin(f))に置き換えると、わずかに正確な結果(丸めなし)が得られます。
cffk 14

@cffkそれは良い点です。私は元々atanhの式を取得しましたが、(a)ほとんどのGISユーザーはこの関数に不慣れであり、(b)多くのユーザーはそれが提供されているシステムにアクセスできないことを期待して対数に変換しました。精度の低下は潜在的な懸念事項ですが、離心率の大きさをすばやく確認すると、地球の楕円体を操作するときにほとんど失われないことが示されます。おそらく、小数点以下2桁以上です。読者が望めば可能な限り最高の精度を達成できるように、パワーシリーズを提供しました。
whuber

3

radouxjuの質問に対する答えは、楕円体に投影されたときのピクセルの形状に依存します。ラスタの座標系が経度と緯度である場合、ピクセルは行線の長方形であり、whuberの答えを使用できます。より一般的には、エッジが行線であるポリゴンの数式を使用できます。座標系が大規模正角図法(UTM、状態平面など)である場合、測地線でエッジを近似し、測地線ポリゴンの式を使用する方がより正確です。測地線ポリゴンは一般的な使用に最適です。これは、横線ポリゴンとは異なり、極の近くで「適切に動作する」ためです。

測地線および横線ポリゴンの数式の実装は、ライブラリGeographicLibによって提供されます。測地線エリアはいくつかの言語で利用可能です。ラムライン領域はC ++のみです。こちらからオンラインバージョン(測地線+横線)を入手できます。これらの計算の精度は通常、0.1平方メートルよりも優れています。

信頼できる/公式に判断する必要があります...測地線の公式は、測地線下のエリア(ダニエルセン、1989年、サブスクリプションが必要)、および測地線のアルゴリズム(カーニー、2013年、オープンアクセス)で導出されます。ここにラムラインの式が与えられています


(+1)質問(または報奨金)を実際に扱っていないにも関わらず、有用な情報のためにこの投稿を支持しています。どちらも地理座標系のラスターに関するものです。
whuber

1

WGS84ピクセルの面積の式を決定しようとしたときに、この質問に出くわしました。@whuberの答えにはこの情報が含まれていますが、指定された緯度での平方ピクセルの面積の式を取得するのは、まだいくらかの作業でした。これを1つの呼び出しに抽象化する、以下に記述したPython関数を含めました。全ラスターの面積に関するポスターの質問に直接答えることはできませんが(すべてのピクセルの面積を合計することはできますが)、同様の計算を探している人にとってはまだ有用な情報だと思います。

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])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.