Büyücü alanını hesaplamanın daha doğru yolu


11

Günlük çalışmamda sürekli olarak coğrafi ark projeksiyonundaki küresel raster veri kümelerinin alanlarını 30 ark saniyelik çözünürlükte hesaplamam isteniyor. Bu veri kümeleri normalde bir Birleştirme işleminin sonucudur (tipik bir örnek, ülke katmanıyla birleştirilmiş bitki örtüsü sınıflarıdır). Bunu yapmak için, birimimiz 30 ark saniyede coğrafi projeksiyonda her pikselin alanı ile bir raster veri kümesi oluşturdu. Bu alan ızgarasıyla, her sınıfın alanlarını toplamak için bir zonalstat yapılır. Bu alan ızgarasının nasıl oluşturulduğundan emin olmadığımdan, her zaman bu yaklaşımın sadece eşit alanlı bir projeksiyonda raster yeniden projelendirilmesinde daha doğru olup olmadığını merak ettim (basit testlerden iki yöntemin sonuçları benzerdir). Herkes benzer bir durum yaşadı mı?


@radouxju Alıntı yaptığım Bugayevskiy & Snyder el kitabının ne güvenilir ne de resmi olduğunu öne sürüyorsunuz. (Aksine, her ikisi de - özellikle ABD ve Rusya'da dünyaca tanınan otoritelerin işbirliğinden kaynaklandığı düşünüldüğünde!) Bu şüpheciliğin temeli nedir? Daha ne isterdiniz? Ayrıca, bu hesaplamaların kusursuz olduğunu unutmayın . Kesinlik sadece elipsoidal parametrelerin verildiği kesinlik ve hesaplamalarınızın kesinliği ile sınırlıdır: daha yüksek kesinlik mümkün değildir.
whuber

@whuber Alıntılarınızın güvenilir olmadığını önermiyordum. Ödülle ilgili yorumum, siz cevap vermeden ÖNCE yapıldı ve siteye en son geldiğimde ödülü vermek için çok erken oldu.
radouxju

@radouxju Açıklamanız için teşekkür ederiz! Cevabı gönderdikten saatler sonra ödülün farkına varamadım.
whuber

Yanıtlar:


14

Paralellikler (enlem çizgileri) ve meridyenler (boylam çizgileri) ile sınırlanmış herhangi bir küresel dörtgen alanı için nispeten basit bir kesin formül vardır . Elipsoidi üretmek için küçük ekseni etrafında döndürülen elipsin (ana ekseni a ve küçük eksenin b ) temel özellikleri kullanılarak doğrudan türetilebilir . (Türetme güzel bir integral Matematik egzersizi yapar, ancak bu sitede çok az ilgi olacağını düşünüyorum.)

Formül, hesaplamanın temel adımlara bölünmesiyle basitleştirilir.

İlk olarak, doğu ve batı sınırları arasındaki mesafe - l0 ve l1 meridyenleri - bütün dairenin q = (l1 - l0) / 360 (meridyenler derece cinsinden ölçüldüğünde) veya 1 = ( l1 - l0) / (2 * pi) (meridyenler radyan cinsinden ölçüldüğünde). F0 ve f1 paralelleri arasındaki tüm dilim alanını bulun ve bunu q ile çarpın .

İkinci olarak, Ekvator tarafından sınırlanan elipsoidin yatay bir dilimi (f0 = 0'da) ve f enlemi (= f1) için bir formül kullanacağız. Herhangi bir f0 ve f1 enlemi arasındaki dilim alanı (aynı yarımkürede yer alır), daha büyük ve daha küçük alan arasındaki fark olacaktır.

Son olarak, modelin gerçekten bir elipsoid (ve bir küre değil) olması şartıyla, Ekvator ile f enlemindeki paralel arasındaki böyle bir dilimin alanı tarafından verilir.

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

nerede ave bsırasıyla üreten elipsin ana ve küçük eksenlerinin uzunluklarıdır,

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

dışmerkezliği ve

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

(Bu, yine de sadece paralellere yaklaşık olan jeodeziklerle hesaplamaktan çok daha basittir. Lütfen @cffk tarafından log(zp/zm)düşük enlemlerde hassasiyet kaybını önleyecek şekilde hesaplamanın bir yoluyla ilgili açıklamasına dikkat edin .)

şekil

area(f) ekvatordan enlem f'ye kadar olan opak dilimin alanıdır (şekilde yaklaşık 30 derece kuzey. X ve Y referans için gösterilen jeosantrik Kartezyen koordinat eksenleridir.

WGS 84 elipsoid için sabit değerleri kullanın

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

gerektiren

e = 0.08181919084296

( A = b'ye sahip küresel bir model için formül belirsiz hale gelir. Yukarıdan e -> 0 olarak bir sınır almanız gerekir, bu da standart formüle düşer 2 * pi * a^2 * sin(f).)

Bu formüllere göre, Ekvator'a dayalı 30 'x 30' dörtgen, 3077.2300079129 kilometrekarelik bir alana sahipken, 30 'x 30' dörtgen bir direğe dokunan (gerçekten sadece bir üçgen) sadece 13.6086152 karelik bir alana sahiptir. kilometre.

Bir kontrol olarak, dünyanın yüzeyini kaplayan bir 720 x 360 ızgarasının tüm hücrelerine uygulanan formüller, toplam 4 * pi * (6371.0071809) ^ 2 kilometrekarelik bir yüzey alanı verir, bu da dünyanın otoriter yarıçapının 6371.0071809 kilometre olması gerektiğini gösterir. Bu Wikipedia değerinden sadece son önemli rakamdan (milimetrenin onda biri) farklıdır. (Bence Wikipedia'nın hesaplamaları biraz :-).

Ek kontroller olarak, Lev M. Bugayevskiy ve John P. Snyder, Harita Projeksiyonları: Bir Referans El Kitabı'nda Ek 4 ve 5'i çoğaltmak için bu formüllerin versiyonlarını kullandım (Taylor ve Francis, 1995). Ek 4, en yakın metreye verilen meridyenlerin ve paralellerin 30'-uzun bölümlerinin yay uzunluklarını göstermektedir. Sonuçların yerinde kontrolü mükemmel bir uyum gösterdi. Daha sonra tabloyu 0.5 'artışlarla değil 0.0005' artışlarla yeniden oluşturdum ve dörtgen alanları bu yay uzunluklarıyla tahmin edildiği gibi sayısal olarak entegre ettim. Elipsoidin toplam alanı, sekizden fazla anlamlı rakama doğru şekilde yeniden üretildi. Ek Şekil 5 değerleri area(f)için f = 0, 1/2, 1, ..., 1 / (2 * pi) ile çarpılır 90 derece. Bu değerler en yakın kilometrekareye verilir. 0, 45 ve 90 dereceye yakın değerlerin görsel kontrolü mükemmel bir uyum gösterdi.


Bu kesin formül, her hücrenin üst sınırlarının enlemlerini ve diğeri alt sınırların enlemlerini veren bir ızgara ile başlayan raster cebiri kullanılarak uygulanabilir . Bunların her biri esasen bir y koordinat ızgarasıdır. (Her durumda sin(f)ve sonra zmve zpara sonuçlar olarak oluşturmak isteyebilirsiniz .) İki sonucu çıkarın, bunun mutlak değerini alın ve ilk adımda elde edilen kesir q ile çarpın (0,5 / 360 = 1/720'ye eşit) örneğin 30 'hücre genişliği için). Bu, değerleri tam olarak içeren bir ızgara olacaktır.her hücrenin alanları (ızgaranın kendi sayısal hassasiyetine kadar). Enlemleri sinüs fonksiyonunun beklediği biçimde ifade ettiğinizden emin olun: birçok tarama hesaplayıcısı size derece cinsinden koordinatlar verir, ancak trig fonksiyonları için radyanlar bekler!


Kayıt için, WGS 84 elipsoidindeki 30 'hücrelerin 30' hücrelerinin Ekvatordan bir direğe kadar, 30 'aralıklarla 11 şekle (küçük sayı yarıçapı b için kullanılan aynı sayı) kadar olan tam alanlar :

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

Değerler kilometrekare cinsindendir.


Bu alanlara yaklaşmak veya davranışlarını daha iyi anlamak istiyorsanız, formül bu modeli izleyen bir güç serisine düşer:

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

nerede

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

(Eşdeğer bir formül Bugayevskiy & Snyder, age , denklem (2.1) 'de yer almaktadır.)

E ^ 2 çok küçük olduğu için (dünyanın tüm elipsoidal modelleri için yaklaşık 1/150) ve z 0 ile 1 arasındadır, y de küçüktür. Böylece y ^ 2, y ^ 3, ... terimleri hızla küçülür ve her bir terim için iki ondalık basamak daha fazla hassasiyet ekler. Eğer y'yi tamamen görmezden gelseydik, formül, b yarıçapındaki bir alanın formülü olurdu . Geri kalan terimler, dünyanın ekvatoral şişkinliğini düzeltmek olarak anlaşılabilir.


Düzenle

Alanın jeodezik mesafe hesaplamasının bu formüllerle nasıl karşılaştırıldığı konusunda bazı sorular gündeme gelmiştir. Jeodezik mesafe yöntemi, köşeleri yatay olarak bağlayan ve yamuk için Öklid formülünü uygulayan, her dörtgeni paralellikler yerine jeodeziklerle yaklaştırır . 30 'dörtlü gibi küçük dörtgenler için, bu biraz düşük bir eğilime sahiptir ve milyonda 6 ila 10 kısım arasında göreceli bir doğruluğa sahiptir. WGS 84 (veya herhangi bir makul toprak elipsoidi) için hatanın bir çizimi:

şekil 2

Bu nedenle, (1) jeodezik mesafe hesaplamalarına kolay erişiminiz varsa ve (2) ppm düzeyindeki hatayı tolere edebiliyorsa, bu jeodezik hesaplamaları kullanmayı ve sonuçları sapmayı düzeltmek için 1.00000791 ile çarpmayı düşünebilirsiniz. İki ondalık basamak daha hassas yer için, düzeltme faktöründen pi / 2 * cos (2f) / 10 ^ 6 değerini çıkarın: sonuç, 0,04 ppm içinde doğru olacaktır.


1
Sisteminiz bir atanh işlevi sağlıyorsa, günlüğü (zp / zm) 2 * atanh (e * sin (f)) ile değiştirerek biraz daha doğru sonuçlar elde edebilirsiniz (daha az yuvarlama).
cffk

@cffk Bu iyi bir nokta. Formülleri başlangıçta atanh açısından elde ettim, ancak (a) çoğu CBS kullanıcısının bu işleve aşina olmayacağını ve (b) birçok kullanıcının sağlandığı sistemlere erişemeyeceğini düşünerek logaritmalara dönüştürdüm. Hassasiyet kaybı potansiyel bir endişe olsa da, eksantrikliğin büyüklüğünün hızlı bir şekilde kontrol edilmesi, dünya elipsoidleri ile çalışırken çok az kayıp olduğunu gösterir - belki de iki ondalık basamaktan biraz daha fazla. Güç serilerini, okuyucuların istedikleri takdirde mümkün olan en yüksek hassasiyeti elde edebilmeleri için sağladım.
whuber

3

Radouxju'nun sorusunun cevabı, elipsoide yansıtıldığında pikselin şekline bağlıdır. Raster koordinat sistemi boylam ve enlem ise, piksel bir oluk çizgisi dikdörtgeni ve whuber'ın cevabı kullanılabilir veya daha genel olarak, formları kenarları rumb çizgiler olan bir çokgen için kullanabilirsiniz. Koordinat sistemi büyük ölçekli bir uyumlu projeksiyonsa (UTM, durum düzlemi vb.), Kenarları jeodeziklerle yaklaşık olarak tahmin etmek ve bir jeodezik çokgen için formülü kullanmak daha doğru olacaktır. Jeodezik çokgenler genel kullanım için muhtemelen en iyisidir, çünkü düz çizgi çokgenlerinin aksine, kutuplara yakın "iyi davranırlar".

Jeodezik ve rumb hattı çokgenleri için formül uygulamaları, GeographicLib kütüphanem tarafından sağlanmaktadır . Jeodezik alan birkaç dilde mevcuttur; rumb hattı alanı yalnızca C ++ 'dır. Burada çevrimiçi bir sürüm (jeodezik + rumb hattı) var . Bu hesaplamaların doğruluğu genellikle 0.1 metrekareden daha iyidir.

Güvenilir / resmi karar vermeniz gerekecek ... Jeodezik formüller Jeodezik altındaki alanda (Danielsen, 1989, abonelik gereklidir) ve Jeodezikler için Algoritmalar (Karney, 2013, açık erişim) içinde türetilmiştir. Oluk çizgisi formülleri burada verilmektedir .


(+1) Her ikisi de özellikle coğrafi koordinat sistemlerindeki rastlayıcılarla ilgili olan soruyu (veya ödülü) gerçekten ele almasa da, bu gönderiyi yararlı bilgiler için destekliyorum .
whuber

1

Bir WGS84 piksel alanı için bir formül belirlemeye çalışırken bu soruya rastladım. @ Whuber'ın cevabı bu bilgiyi içermekle birlikte, belirli bir enlemde kare dereceli bir pikselin alanı için bir formül elde etmek hala bir işti. Aşağıda yazdığım Python fonksiyonunu tek bir çağrıya ekledim. Posterin bir ENTIRE raster alanı hakkındaki sorusunu doğrudan cevaplamasa da (biri tüm piksellerin alanlarını toplayabilmesine rağmen), benzer bir hesaplama arayan biri için hala yararlı bilgiler olduğunu düşünüyorum.

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])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.