Determinación de la zona UTM (para convertir) de longitud / latitud

Estoy escribiendo un progtwig que espera una serie de puntos lat / long, y los convierto internamente en UTM para hacer algunos cálculos en metros.

El scope de los puntos lat / long en sí es bastante pequeño: alrededor de 200 mx 200 m. Se puede confiar en que casi siempre estarán dentro de una única zona UTM (a menos que tengas mala suerte y estés al otro lado de la frontera de una zona).

Sin embargo, la zona en la que se encuentran los lat / longs no está restringida. Un día, el progtwig podría correr para personas en Australia (y, ¡cuántas zonas se encuentran, incluso un solo estado, y cuánto dolor me ha causado ya …), y otro día para la gente en México.

Mi pregunta es: ¿hay alguna manera de determinar en qué zona se encuentra un long / lat en particular para que se pueda alimentar a una biblioteca de conversión (actualmente utilizo proj4 y también el paquete rgdal ).

Mi lenguaje es R, pero la respuesta no tiene que ser, quizás sea solo un cálculo simple, o tal vez pueda incrustar una llamada del sistema al proj ejecutable.

aclamaciones.

Editar: para el código (no R) que funciona para todas las áreas no polares de la tierra, mira aquí o aquí .


A menos que esté tratando con datos de un par de áreas excepcionales ( Svalbard y partes de Noruega ), este es un cálculo lo suficientemente simple como para hacerlo usted mismo en R. Aquí está la descripción de Wikipedia de cómo la longitud se relaciona con el número de Zona UTM :

El sistema UTM divide la superficie de la Tierra entre 80 ° S y 84 ° N de latitud en 60 zonas, cada una de 6 ° de longitud de ancho. La zona 1 cubre la longitud 180 ° a 174 ° W; la numeración de la zona aumenta hacia el este hasta la zona 60 que cubre la longitud 174 a 180 este.

Por lo tanto, suponiendo que en sus datos las longitudes al oeste del Meridiano de Green están codificadas como de -180 a 0 grados, aquí hay una versión de código R de lo anterior:

 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 

Esa expresión podría obviamente simplificarse un poco, pero creo que de esta forma la lógica que subyace a su construcción es más clara. El %% 60 bit está allí por si alguna de sus longitudes es mayor que 180 o menor que -180.

No sé el código r pero supongo que este código PL / SQL puede ayudarte con las excepciones:

  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