2012-02-08 11 views
15

Piszę program, który oczekuje wielu punktów długości/długości, a ja konwertuję je wewnętrznie na UTM, aby wykonać obliczenia w metrach.Wyznaczanie strefy UTM (do konwersji) z długości/szerokości geograficznej

Zasięg samych punktów długich/długich jest niewielki - około 200 m x 200 m. Można na nich polegać prawie zawsze w obrębie jednej strefy UTM (chyba że otrzymasz pecha i przekroczysz granicę strefy).

Jednak strefa, w której znajdują się lat/longy jest nieograniczona. Któregoś dnia program może być prowadzony dla osób w Australii (i o, ile stref ma nawet jedno państwo, a ile bólu już mnie to spowodowało ...), a kolejny dzień dla ludzi w Meksyku.

Moje pytanie brzmi - czy istnieje sposób na określenie, w której strefie znajduje się konkretny long/lat, aby mógł zostać wprowadzony do biblioteki konwersji (obecnie używam proj4, a także pakietu R rgdal).

Mój język to R, ale odpowiedź nie musi być - może to po prostu prosta kalkulacja, a może mogę wbudować wywołanie systemowe do proj możliwej do wybrania.

okrzyki.

+0

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

+0

Proponuję przenieść to do gis.stackexchange.com. – blindjesse

+0

@AndresT - to strefy czasowe. Chcę stref UTM. –

Odpowiedz

33

Edit: Dla (non-R) kod, który pracuje dla wszystkich obszarach niepolarnych na ziemi, patrz here lub here.


Chyba że masz do czynienia z danymi z kilku obszarów wyjątkowych (Svalbard and parts of Norway), jest to dość proste obliczenie, że równie dobrze można po prostu zrobić samemu w R. Oto Wikipedia's description, jak długość geograficzna dotyczy UTM Numer linii:

System UTM dzieli powierzchnię Ziemi między 80 ° S a 84 ° N szerokości geograficznej na 60 stref, z których każda ma 6 ° szerokości. Strefa 1 obejmuje długość geograficzną od 180 ° do 174 ° W; numeracja stref wzrasta na wschód do strefy 60, która obejmuje długość geograficzną od 174 do 180 E.

Zakładając więc, że w danych geograficzne na zachodzie Prime Meridian są kodowane jako biegnący od -180 do 0 stopni, oto wersja R-kod z powyższego:

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 

Wyrażenie można oczywiście nieco uprościć, ale myślę, że w tej formie logika leżąca u podstaw jej konstrukcji jest najjaśniejsza. Bit %% 60 jest tam na wypadek, gdyby niektóre z twoich długości były większe niż 180 lub mniejsze niż -180.

+0

Aha, to były obliczenia, których szukałem - spędziłem lata na szukaniu w Google "jak obliczyć strefę UTM z szerokości/długości geograficznej" i nawet nie pomyślałem o sprawdzeniu Wiki. Twoje zdrowie! –

+0

Tak, przeszedłem ten sam proces nie tak dawno temu. Cieszę się, że mogę pomóc. Przy okazji, jeśli będziesz dużo robił z danymi przestrzennymi, lista [R-sig-geo] (https://stat.ethz.ch/mailman/listinfo/r-sig-geo) jest nieoceniona. Niedawno zadałem tam pytanie i otrzymałem natychmiastową pomoc od samego Rogera Bivanda, który udzielił mi odpowiedzi, którą mógł dostarczyć tylko on i kilku członków R-core. Twoje zdrowie! –

+0

@ToolmakerSteve - Dzięki za sugerowaną korektę (która została błędnie odrzucona przez 3 z 5 redaktorów SO, którzy ją zrecenzowali). –

2

nie wiem kod R, ale przypuszczam, że ten kod PL/SQL może pomóc wyjątkami:

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; 
Powiązane problemy