Cách chính xác hơn để tính diện tích của raster


11

Trong công việc hàng ngày, tôi liên tục được yêu cầu tính toán các khu vực của bộ dữ liệu raster toàn cầu trong phép chiếu địa lý ở độ phân giải 30 cung giây. Các bộ dữ liệu này thường là kết quả của hoạt động Kết hợp (một ví dụ điển hình là các lớp thực vật kết hợp với lớp quốc gia). Để làm điều này, đơn vị của chúng tôi đã tạo ra một bộ dữ liệu raster với diện tích của mỗi pixel trong phép chiếu địa lý ở 30 cung giây. Với lưới khu vực này, một zonalstat được thực hiện để tính tổng các khu vực cho mỗi lớp. Vì tôi không chắc chắn cách tạo lưới khu vực này, tôi luôn tự hỏi liệu cách tiếp cận này có chính xác hơn không khi chỉ định lại raster trong phép chiếu diện tích bằng nhau (từ các thử nghiệm đơn giản, kết quả của hai phương pháp là tương tự nhau). Có ai trải qua một tình huống tương tự?


@radouxju Dường như bạn đang gợi ý rằng hướng dẫn sử dụng Bugayevskiy & Snyder mà tôi trích dẫn là không đáng tin cũng không chính thức. (Ngược lại, đó là cả hai - đặc biệt là xem xét kết quả từ sự hợp tác của các cơ quan được thế giới công nhận ở Mỹ và Nga!) Cơ sở của sự hoài nghi đó là gì? Bạn sẽ tìm kiếm gì hơn nữa? Lưu ý, những tính toán này là hoàn toàn chính xác. Độ chính xác chỉ bị giới hạn bởi độ chính xác trong đó các tham số ellipsoidal được đưa ra và bởi độ chính xác của các tính toán của bạn: không thể có độ chính xác cao hơn.
whuber

@whuber Tôi không cho rằng trích dẫn của bạn không đáng tin. Nhận xét của tôi về tiền thưởng đã được thực hiện TRƯỚC KHI bạn đã trả lời, và khi tôi mới vào trang web thì còn quá sớm để trao giải thưởng.
radouxju

@radouxju Cảm ơn bạn đã giải thích! Tôi đã không nhận thức được tiền thưởng cho đến nhiều giờ sau khi tôi đăng câu trả lời.
whuber

Câu trả lời:


14

Có một công thức chính xác tương đối đơn giản cho diện tích của bất kỳ tứ giác hình cầu nào được giới hạn bởi các vĩ tuyến (đường vĩ độ) và kinh tuyến (đường kinh độ). Nó có thể được suy ra một cách đơn giản bằng cách sử dụng các thuộc tính cơ bản của hình elip (của trục chính a và trục phụ b ) được xoay quanh trục nhỏ của nó để tạo ra hình elip. (Đạo hàm tạo ra một bài tập Giải tích hợp tuyệt vời nhưng tôi tin rằng sẽ ít được quan tâm trên trang web này.)

Công thức được đơn giản hóa bằng cách chia nhỏ tính toán thành các bước cơ bản.

Đầu tiên, khoảng cách giữa ranh giới phía đông và phía tây - kinh tuyến l0 và l1 - là một phần của toàn bộ vòng tròn bằng q = (l1 - l0) / 360 (khi kinh tuyến được đo bằng độ) hoặc 1 = ( l1 - l0) / (2 * pi) (khi kinh tuyến được đo bằng radian). Tìm diện tích của toàn bộ lát nằm giữa vĩ tuyến f0 và F1 và chỉ cần nhân số đó với q .

Thứ hai, chúng tôi sẽ sử dụng một công thức cho diện tích của một lát cắt ngang của ellipsoid giới hạn bởi Xích đạo (tại f0 = 0) và song song ở vĩ độ f (= f1). Diện tích của lát cắt giữa hai vĩ độ bất kỳ là 0,2 và F1 (nằm trên cùng một bán cầu) sẽ là sự khác biệt giữa diện tích lớn hơn và nhỏ hơn.

Cuối cùng, với điều kiện mô hình thực sự là một hình elip (chứ không phải hình cầu), diện tích của một lát cắt như vậy giữa Xích đạo và vĩ tuyến ở vĩ độ f được cho bởi

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

trong đó ablà độ dài của trục chính và trục phụ của hình elip tạo ra, tương ứng,

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

là sự lập dị của nó, và

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

(Đây là nhiều đơn giản hơn máy tính với trắc địa, mà chỉ là xấp xỉ với sự tương đồng nào. Xin lưu ý những nhận xét của @cffk liên quan một cách để tính toán log(zp/zm)theo một cách mà tránh mất độ chính xác ở những vĩ độ thấp.)

Nhân vật

area(f) là diện tích của lát mờ từ đường xích đạo lên đến vĩ độ f (khoảng 30 độ bắc trong hình minh họa. X và Y là các trục tọa độ Cartesian địa tâm được hiển thị để tham khảo.

Đối với ellipsoid WGS 84, sử dụng các giá trị không đổi

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

đòi hỏi

e = 0.08181919084296

(Đối với mô hình hình cầu có a = b , công thức trở nên không xác định. Bạn phải lấy giới hạn là e -> 0 từ trên, sau đó giảm xuống công thức chuẩn 2 * pi * a^2 * sin(f).)

Theo các công thức này, một tứ giác 30 'x 30' dựa trên Xích đạo có diện tích 3077,2300079129 km2, trong khi tứ giác 30 'x 30' chạm vào một cực (mà thực sự chỉ là một hình tam giác) có diện tích chỉ 13,6086152 cây số

Khi kiểm tra, các công thức được áp dụng cho tất cả các ô của lưới 720 x 360 bao phủ bề mặt trái đất có tổng diện tích bề mặt là 4 * pi * (6371.0071809) ^ 2 km2, cho thấy bán kính tự động của trái đất phải là 6371.0071809 km. Điều này khác với giá trị Wikipedia chỉ trong con số đáng kể cuối cùng (khoảng một phần mười của một milimét). (Tôi nghĩ rằng tính toán của Wikipedia không được nhiều :-).

Khi kiểm tra bổ sung, tôi đã sử dụng các phiên bản của các công thức này để sao chép các Phụ lục 4 và 5 trong Lev M. Bugayevskiy & John P. Snyder, Dự đoán bản đồ: Cẩm nang tham khảo (Taylor & Francis, 1995). Phụ lục 4 cho thấy chiều dài vòng cung của các đoạn kinh tuyến và vĩ tuyến dài 30 ', được đưa cho đồng hồ gần nhất. Một kiểm tra tại chỗ của kết quả cho thấy thỏa thuận hoàn hảo. Sau đó, tôi đã tạo lại bảng với số gia 0,0005 ', thay vì 0,5' và tích hợp số lượng các khu vực hình tứ giác như ước tính với các độ dài cung này. Tổng diện tích của ellipsoid được sao chép chính xác để tốt hơn tám con số đáng kể. Phụ lục 5 show các giá trị của area(f)cho f = 0, 1/2, 1, ..., 90 độ, nhân với 1 / (2 * pi). Những giá trị này được đưa ra cho km vuông gần nhất. Kiểm tra trực quan các giá trị gần 0, 45 và 90 độ cho thấy thỏa thuận hoàn hảo.


Công thức chính xác này có thể được áp dụng bằng cách sử dụng đại số raster bắt đầu bằng một lưới cho các vĩ độ giới hạn trên của mỗi ô và một vĩ độ khác cho các vĩ độ của các giới hạn dưới. Mỗi cái trong số đó, về cơ bản là một lưới tọa độ y. (Trong mỗi trường hợp, bạn có thể muốn tạo sin(f)và sau đó zmzplàm kết quả trung gian.) Trừ hai kết quả, lấy giá trị tuyệt đối của giá trị đó và nhân với phân số q thu được trong bước đầu tiên (bằng 0,5 / 360 = 1/720 ví dụ như chiều rộng ô 30 '). Đây sẽ là một lưới có các giá trị chứa chính xáccác khu vực của mỗi ô (chính xác đến số chính xác của lưới). Chỉ cần đảm bảo biểu thị các vĩ độ theo dạng mong đợi của hàm sin: nhiều máy tính raster sẽ cung cấp cho bạn tọa độ theo độ nhưng mong đợi radian cho các hàm trig của chúng!


Đối với bản ghi, đây là các khu vực chính xác của các ô 30 'x 30' trên ellipsoid WGS 84 từ Xích đạo đến cực, trong các khoảng 30 ', đến 11 hình (cùng số được sử dụng cho bán kính phụ 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

Các giá trị được tính bằng km vuông.


Nếu bạn muốn ước tính gần đúng các khu vực này hoặc hiểu đơn giản hơn về hành vi của chúng, công thức sẽ giảm xuống một chuỗi lũy thừa theo mô hình này:

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

Ở đâu

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

(Một công thức tương đương xuất hiện trong Bugayevskiy & Snyder, op. Cit. , Phương trình (2.1).)

Vì e ^ 2 quá nhỏ (khoảng 1/150 cho tất cả các mô hình elip của trái đất) và z nằm trong khoảng từ 0 đến 1, y cũng nhỏ. Do đó, các thuật ngữ y ^ 2, y ^ 3, ... nhanh chóng trở nên nhỏ hơn, thêm chính xác hơn hai chữ số thập phân với mỗi thuật ngữ. Nếu chúng ta bỏ qua y hoàn toàn, công thức sẽ là diện tích của một hình cầu bán kính b . Các thuật ngữ còn lại có thể được hiểu là sửa chữa cho phình xích đạo của trái đất.


Biên tập

Một số câu hỏi đã được đặt ra liên quan đến cách tính diện tích khoảng cách trắc địa của khu vực so với các công thức chính xác này. Phương pháp khoảng cách trắc địa xấp xỉ mỗi tứ giác bằng trắc địa, chứ không phải song song, kết nối các góc của nó theo chiều ngang và áp dụng công thức Euclide cho hình thang. Đối với các hình tứ giác nhỏ, chẳng hạn như tứ giác 30 ', độ lệch này hơi thấp và có độ chính xác tương đối từ 6 đến 10 phần triệu. Dưới đây là một biểu đồ lỗi cho WGS 84 (hoặc bất kỳ ellipsoid trái đất hợp lý nào, cho vấn đề đó):

Hình 2

Do đó, nếu (1) bạn có quyền truy cập dễ dàng vào các phép tính khoảng cách trắc địa và (2) có thể chịu được lỗi mức ppm, bạn có thể cân nhắc sử dụng các phép tính trắc địa đó và nhân kết quả của chúng với 1,00000791 để sửa sai lệch. Đối với hai vị trí thập phân chính xác hơn, trừ pi / 2 * cos (2f) / 10 ^ 6 khỏi hệ số hiệu chỉnh: kết quả sẽ chính xác trong vòng 0,04 ppm.


1
Nếu hệ thống của bạn cung cấp hàm atanh, thì bạn có thể kết quả chính xác hơn một chút (ít làm tròn hơn) thay thế nhật ký (zp / zm) bằng 2 * atanh (e * sin (f)).
cffk

@cffk Đó là một điểm tốt. Tôi đã nhận được các công thức ban đầu theo atanh, nhưng đã chuyển đổi chúng thành logarit với hy vọng rằng (a) hầu hết người dùng GIS sẽ không quen với chức năng này và (b) nhiều người dùng sẽ không có quyền truy cập vào các hệ thống được cung cấp. Mặc dù mất độ chính xác là một mối quan tâm tiềm năng, nhưng việc kiểm tra nhanh độ lớn của độ lệch tâm cho thấy rất ít bị mất khi làm việc với ellipsoids trái đất - có lẽ nhiều hơn hai chữ số thập phân. Tôi đã cung cấp chuỗi sức mạnh một phần để cho phép người đọc đạt được độ chính xác cao nhất có thể nếu họ muốn.
whuber

3

Câu trả lời cho câu hỏi của radouxju phụ thuộc vào hình dạng của pixel khi chiếu lên ellipsoid. Nếu hệ tọa độ của raster là kinh độ và vĩ độ, thì pixel là một hình chữ nhật đường thẳng và câu trả lời của người đánh bóng có thể được sử dụng, hoặc nói chung hơn, bạn có thể sử dụng công thức cho một đa giác có các cạnh là các đường thẳng. Nếu hệ tọa độ là một phép chiếu tuân thủ quy mô lớn (UTM, mặt phẳng trạng thái, v.v.), sẽ chính xác hơn để ước tính các cạnh bằng trắc địa và sử dụng công thức cho đa giác trắc địa. Đa giác trắc địa có lẽ là tốt nhất cho sử dụng thông thường, vì, không giống như đa giác dòng rhumb, chúng "hoạt động tốt" gần với các cực.

Việc triển khai các công thức cho đa giác dòng trắc địa và rhumb được cung cấp bởi thư viện GeographicLib của tôi . Khu vực trắc địa có sẵn trong một số ngôn ngữ; khu vực đường thẳng là C ++. Có một phiên bản trực tuyến (trắc địa + dòng rhumb) có sẵn ở đây . Độ chính xác của những tính toán này thường tốt hơn 0,1 mét vuông.

Bạn sẽ phải đánh giá về độ tin cậy / chính thức ... Các công thức trắc địa có nguồn gốc trong Khu vực theo trắc địa (Danielsen, 1989, yêu cầu đăng ký) và Thuật toán cho trắc địa (Karney, 2013, truy cập mở). Các công thức dòng rhumb được đưa ra ở đây .


(+1) Tôi đang nâng cấp bài đăng này cho thông tin hữu ích trong đó, mặc dù nó không thực sự giải quyết câu hỏi (hoặc tiền thưởng), cả hai đều đặc biệt về các raster trong hệ thống tọa độ địa lý .
whuber

1

Tôi đã chạy qua câu hỏi này khi cố gắng xác định công thức cho khu vực của pixel WGS84. Mặc dù câu trả lời của @ whuber có chứa thông tin này, nhưng vẫn có một số công việc để có được một công thức cho diện tích của một pixel độ vuông ở một vĩ độ nhất định. Tôi đã bao gồm một hàm Python mà tôi đã viết bên dưới tóm tắt điều này thành một cuộc gọi. Mặc dù nó không trả lời trực tiếp câu hỏi của người đăng về khu vực của raster ENTIRE (mặc dù người ta có thể tính tổng diện tích của tất cả các pixel), tôi nghĩ đó vẫn là thông tin hữu ích cho ai đó có thể đang tìm kiếm một phép tính tương tự.

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])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.