52 lines
1.5 KiB
R
52 lines
1.5 KiB
R
require(tidyverse)
|
|
require(purrr)
|
|
require(testthat)
|
|
|
|
find_one_utm_zone <- function(longitude, latitude) {
|
|
|
|
# Special zones for Svalbard
|
|
if (latitude >= 72.0 && latitude <= 84.0 ) {
|
|
if (longitude >= 0.0 && longitude < 9.0)
|
|
return("31X");
|
|
if (longitude >= 9.0 && longitude < 21.0)
|
|
return("33X")
|
|
if (longitude >= 21.0 && longitude < 33.0)
|
|
return("35X")
|
|
if (longitude >= 33.0 && longitude < 42.0)
|
|
return("37X")
|
|
}
|
|
# Special zones for Norway
|
|
if (latitude >= 56.0 && latitude < 64.0 ) {
|
|
if (longitude >= 0.0 && longitude < 3.0)
|
|
return("31V");
|
|
if (longitude >= 3.0 && longitude < 12.0)
|
|
return("32V")
|
|
}
|
|
|
|
# North + South Poles
|
|
|
|
if (latitude > 84.0){
|
|
if ((longitude+180)%%360-180 < 0) {return("Y")}
|
|
if ((longitude+180)%%360-180 > 0) {return("Z")}
|
|
} else if (latitude < -80.0){
|
|
if ((longitude+180)%%360-180 < 0) {return("A")}
|
|
if ((longitude+180)%%360-180 > 0) {return("B")}
|
|
}
|
|
|
|
# Everything in the middle
|
|
|
|
if ( (latitude>-80.0) && (latitude<=84.0) ){
|
|
|
|
mid_zones <- LETTERS[c(3:8,10:14,16:24)] # C to X, skip I and O
|
|
utm_letter <- mid_zones[ min(floor( (latitude + 80) / 8 )+1 , 20) ]
|
|
utm_number <- (floor( (longitude + 180) / 6 ) %% 60) + 1 # modulo in case longitude is 0 to 360 instead of -180 to 180
|
|
utm_zone <- paste0(utm_number, utm_letter)
|
|
return(utm_zone)
|
|
|
|
} else {
|
|
stop("lat long not valid (or something else broke)")
|
|
}
|
|
}
|
|
find_utm_zone <- function(lon, lat){
|
|
purrr::map2_chr(.x = lon, .y = lat, .f = find_one_utm_zone)
|
|
} |