2012-02-08 56 views
15

Tôi đang viết chương trình dự kiến ​​một số điểm lat/long và tôi chuyển đổi chúng thành UTM để thực hiện một số tính toán tính bằng mét.Xác định vùng UTM (để chuyển đổi) từ kinh độ/vĩ độ

Phạm vi của các điểm vĩ độ/dài là khá nhỏ - khoảng 200m x 200m. Chúng có thể dựa vào hầu như luôn luôn nằm trong một vùng UTM (trừ khi bạn không may mắn và đang băng qua biên giới của một vùng).

Tuy nhiên, vùng mà lat/longs đang ở không bị giới hạn. Một ngày nào đó chương trình có thể chạy cho người dân Úc (và ồ, có bao nhiêu khu thậm chí một tiểu bang nằm ngang qua, và bao nhiêu cơn đau đã gây ra cho tôi ...), và một ngày khác cho những người ở Mexico.

Câu hỏi của tôi là - có cách xác định vùng/vĩ độ cụ thể nào để có thể đưa vào thư viện chuyển đổi (tôi hiện đang sử dụng proj4 và gói R rgdal).

Ngôn ngữ của tôi là R, nhưng câu trả lời không phải là - có lẽ đó chỉ là một phép tính đơn giản, hoặc có thể tôi có thể nhúng một cuộc gọi hệ thống tới proj vô cùng.

cổ vũ.

+0

http://stat.ethz.ch/R-manual/R-patched /library/base/html/timezones.html – aatrujillob

+0

Tôi khuyên bạn nên chuyển trang này sang gis.stackexchange.com. – blindjesse

+0

@AndresT - đó là múi giờ. Tôi muốn vùng UTM. –

Trả lời

33

Edit: Đối với mã (R-phi) mà làm việc cho tất cả khu vực không phân cực trên trái đất, xem here hoặc here.


Trừ khi bạn đang đối phó với dữ liệu từ một vài lĩnh vực đặc biệt (Svalbard and parts of Norway), đây là một tính toán đủ đơn giản mà bạn có thể cũng chỉ làm điều đó cho mình trong R. Đây là Wikipedia's description kinh tuyến liên quan đến UTM như thế nào Số vùng:

Hệ thống UTM chia bề mặt trái đất giữa vĩ độ 80 ° S và 84 ° N thành 60 vùng, mỗi 6 ° kinh độ rộng. Vùng 1 bao gồm kinh độ 180 ° đến 174 ° W; đánh số khu vực tăng về phía đông đến khu 60 bao gồm kinh độ 174 đến 180 Đông.

Vì vậy, giả định rằng trong dữ liệu của bạn kinh độ về phía tây của Prime Meridian được mã hóa như chạy từ -180 đến 0 độ, đây là một phiên bản R-code ở trên:

long2UTM <- function(long) { 
    (floor((long + 180)/6) %% 60) + 1 
} 

# Trying it out for San Francisco, clearly in UTM Zone 10 
# in the figure in the Wikipedia article linked above 
SFlong <- -122.4192 
long2UTM(SFlong) 
# [1] 10 

biểu hiện đó rõ ràng là có thể được đơn giản hóa một chút, nhưng tôi nghĩ ở dạng này, logic nằm bên dưới cấu trúc của nó là rõ ràng nhất. Các bit %% 60 là trong đó chỉ trong trường hợp một số kinh độ của bạn lớn hơn 180 hoặc ít hơn -180.

+0

Aha, đây là tính toán tôi đã làm sau - tôi dành nhiều tuổi googling "làm thế nào để tính toán vùng UTM từ vĩ độ/kinh độ" và thậm chí không nghĩ đến việc kiểm tra Wiki. chúc mừng! –

+0

Vâng, tôi đã trải qua một quá trình tương tự cách đây không lâu. Vui mừng khi được hỗ trợ. Bằng cách này, nếu bạn sẽ làm được nhiều với dữ liệu không gian, danh sách dịch vụ [R-sig-geo] (https://stat.ethz.ch/mailman/listinfo/r-sig-geo) là vô giá. Gần đây tôi đã hỏi một câu hỏi ở đó, và nhận được sự hỗ trợ ngay lập tức từ chính Roger Bivand, người đã cho tôi câu trả lời rằng không ai ngoài ông và một vài thành viên R-core có thể đã cung cấp. Chúc mừng! –

+0

@ToolmakerSteve - Cảm ơn bạn đã sửa đổi được đề xuất (bị từ chối không chính xác bởi 3 trong tổng số 5 biên tập viên SO đã xem xét lại). –

2

Tôi không biết r-code nhưng tôi giả sử mã PL/SQL này có thể giúp bạn với các trường hợp ngoại lệ:

UTMZone := Trunc((lon - Zone0WestMeridian)/d); 
    --Special Cases for Norway & Svalbard 
    CASE 
    WHEN (lat > 55) AND (UTMZone = 31) AND (lat < 64) AND (lon > 2) THEN UTMZone := 32; 
    WHEN (lat > 71) AND (UTMZone = 32) AND (lon < 9) THEN UTMZone := 31; 
    WHEN (lat > 71) AND (UTMZone = 32) AND (lon > 8) THEN UTMZone := 33; 
    WHEN (lat > 71) AND (UTMZone = 34) AND (lon < 21) THEN UTMZone := 33; 
    WHEN (lat > 71) AND (UTMZone = 34) AND (lon > 20) THEN UTMZone := 35; 
    WHEN (lat > 71) AND (UTMZone = 36) AND (lon < 33) THEN UTMZone := 35; 
    WHEN (lat > 71) AND (UTMZone = 36) AND (lon > 32) THEN UTMZone := 37; 
    ELSE UTMZone := UTMZone; 
    END CASE;