2012-02-08 28 views
15

Scrivo un programma che prevede un numero di punti lat/long e li converto internamente in UTM per eseguire alcuni calcoli in metri.Determinazione della zona UTM (per convertire) da longitudine/latitudine

L'intervallo dei punti lat/long è piuttosto piccolo - circa 200m x 200m. Si può fare affidamento quasi sempre su una singola zona UTM (a meno che non si sia sfortunati e si attraversi il confine di una zona).

Tuttavia, la zona in cui si trova il lat/long non è limitata. Un giorno il programma potrebbe essere condotto per le persone in Australia (e oh, quante zone si trova anche in un singolo stato, e quanto dolore mi ha causato già ...), e un altro giorno per le persone in Messico.

La mia domanda è - c'è un modo per determinare quale zona un particolare long/lat è in modo che possa essere inserito in una libreria di conversione (attualmente utilizzo proj4 e anche il pacchetto R rgdal).

La mia lingua è R, ma la risposta non deve essere - forse è solo un semplice calcolo, o forse posso incorporare una chiamata di sistema al proj exectuable.

evviva.

+0

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

+0

Suggerirei di spostarlo su gis.stackexchange.com. – blindjesse

+0

@AndresT: sono i fusi orari. Voglio le zone UTM. –

risposta

33

Edit: Per il codice (non-R) che funziona per tutte le zone non polari sulla terra, vedi here o here.


A meno che non si tratta di dati da un paio di aree eccezionali (Svalbard and parts of Norway), questo è un calcolo abbastanza semplice che si potrebbe anche solo fare da soli in R. Ecco Wikipedia's description di come longitudine si riferisce a UTM Numero zona:

Il sistema UTM divide la superficie della Terra tra 80 ° S e 84 ° N di latitudine in 60 zone, ciascuna 6 ° di longitudine in larghezza. La zona 1 copre la longitudine 180 ° fino a 174 ° W; la numerazione delle zone aumenta verso est fino alla zona 60 che copre la longitudine da 174 a 180 est.

Quindi, partendo dal presupposto che nei dati longitudini a ovest della Prime Meridian sono codificati come va da -180 a 0 gradi, ecco una versione R-codice di cui sopra:

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 

Quell'espressione potrebbe ovviamente essere semplificata un po ', ma penso che in questa forma la logica alla base della sua costruzione sia più chiara. Il bit %% 60 è lì solo nel caso in cui alcune delle tue longitudini siano maggiori di 180 o inferiori a -180.

+0

Aha, questo era il calcolo che stavo cercando: spendo anni a cercare "come calcolare la zona UTM da latitudine/longitudine" e non ho nemmeno pensato di controllare Wiki. Saluti! –

+0

Sì, ho attraversato lo stesso processo non molto tempo fa. Felice di essere di assistenza. A proposito, se farai molto con i dati spaziali, la lista di [R-sig-geo] (https://stat.ethz.ch/mailman/listinfo/r-sig-geo) serve inestimabile. Recentemente ho fatto una domanda lì e mi sono avvicinato all'aiuto immediato di Roger Bivand stesso, che mi ha dato una risposta che nessuno, a parte lui e alcuni membri del R-core, avrebbe potuto fornire. Saluti! –

+0

@ToolmakerSteve - Grazie per la correzione suggerita (che è stata rifiutata in modo errato dai 3 dei 5 editor SO che l'hanno revisionata). –

2

Non so r-codice, ma suppongo che questo codice PL/SQL può aiutare con le eccezioni:

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; 
Problemi correlati