Este enunciado fue analizado por expertos para asegurar la exactitud de este post.
Solución:
Editar: Para código (no R) que funciona para todos áreas no polares en la tierra, ver 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 que lo haga 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 los 80°S y los 84°N de latitud en 60 zonas, cada una de 6° de longitud de ancho. La Zona 1 cubre la longitud de 180° a 174° O; la numeración de la zona aumenta hacia el este hasta la zona 60 que cubre la longitud 174 a 180 Este.
Entonces, suponiendo que en sus datos las longitudes al oeste del primer meridiano 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
Obviamente, esa expresión podría simplificarse un poco, pero creo que de esta forma la lógica subyacente a su construcción es más clara. los %% 60
bit está ahí en caso de que algunas de sus longitudes sean mayores que 180 o menores que -180.
No conozco el código r, pero supongo que este código PL/SQL puede ayudarlo 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;
Nos puedes añadir valor a nuestro contenido aportando tu veteranía en las críticas.