Determinando a zona UTM (para converter) da longitude / latitude

Eu estou escrevendo um programa que espera um número de pontos lat / long, e eu os converto internamente para UTM para fazer alguns cálculos em metros.

O alcance dos pontos lat / long é bastante pequeno – cerca de 200m x 200m. Eles podem ser invocados quase sempre para estarem dentro de uma única zona UTM (a menos que você tenha azar e esteja do outro lado da fronteira de uma zona).

No entanto, a zona em que os lat / longs estão é irrestrita. Um dia, o programa pode ser dirigido a pessoas na Austrália (e oh, quantas zonas sequer um único estado atravessa, e quanta dor isso já me causou …), e outro dia para pessoas no México.

Minha pergunta é – existe uma maneira de determinar em qual zona um long / lat específico está, de modo que possa ser alimentado em uma biblioteca de conversão (atualmente eu uso o proj4 e também o pacote rgdal ).

Minha linguagem é R, mas a resposta não precisa ser – talvez seja apenas um cálculo simples, ou talvez eu possa incorporar uma chamada de sistema ao projeto executável.

Felicidades.

Edit: Para (não-R) código que funciona para todas as áreas não-polares na terra, veja aqui ou aqui .


A menos que você esteja lidando com dados de algumas áreas excepcionais ( Svalbard e partes da Noruega ), este é um cálculo simples o suficiente para que você faça o mesmo em R. Aqui está a descrição da Wikipedia sobre como a longitude se relaciona com o número da Zona UTM :

O sistema UTM divide a superfície da Terra entre 80 ° S e 84 ° N de latitude em 60 zonas, cada uma com 6 ° de longitude de largura. A zona 1 abrange a longitude de 180 ° a 174 ° W; a numeração de zonas aumenta para o leste até a zona 60, que abrange as longitudes 174 a 180 Leste.

Portanto, supondo que em suas longitudes de dados para o oeste do Meridiano Principal sejam codificadas como de -180 a 0 graus, aqui está uma versão de código R do acima:

 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 

Essa expressão poderia obviamente ser simplificada um pouco, mas acho que dessa forma a lógica subjacente à sua construção é mais clara. O %% 60 bits está lá apenas no caso de algumas de suas longitudes serem maiores que 180 ou menores que -180.

Eu não sei r-code, mas suponho que este código PL / SQL pode ajudá-lo com as exceções:

  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; 
Intereting Posts