使用st_transform将UTM转换为十进制度数(南半球错误)

yuvru6vn  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(97)
library(tidyverse)
library(sf)

x <- 500000
y <- 4649776
zone_num <- "33"
ellipsoid <- "WGS84"
res <- data.frame(x, y) %>%
  sf::st_as_sf(coords = c("x", "y"),
               crs = paste0("+proj=utm +zone=", zone_num)) %>%
  sf::st_transform(crs = paste0("+proj=longlat +datum=", ellipsoid)) %>%
  sf::st_coordinates() %>%
  data.frame() %>%
  dplyr::rename("lon" = "X", "lat" = "Y");res

# Test case 2: Southern hemisphere
x2 <- 500000
y2 <- (4649776 +10000000)-1 # +10000000)-1 tp adjust for southern hemisphere latitude
res <- data.frame(x2, y2) %>%
  sf::st_as_sf(coords = c("x2", "y2"),
               crs = paste0("+proj=utm +zone=", zone_num)) %>%
  sf::st_transform(crs = paste0("+proj=longlat +datum=", ellipsoid)) %>%
  sf::st_coordinates() %>%
  data.frame() %>%
  dplyr::rename("lon" = "X", "lat" = "Y");res

字符串
对于第一个,输出是正确的lon:15纬度:42
对于南半球,它不正确,因为它应该是长的:15纬度:-48.30
但输出是这样的:经度:-165纬度:48.2686
我不明白为什么会发生这种情况,经度应该是不变的,纬度差了将近0.04度。你知道为什么sf在变形方面有困难吗?

qvtsj1bj

qvtsj1bj1#

这里有几个问题。主要的一个是,南半球的proj4string应该有+south参数。
第二个问题是UTM中的北距范围介于0到1000万之间。您在原始北距(y)值上增加了1000万,因此您最终得到的数字超出了有效范围。
如果您解决了这些问题,您将获得与北方半球相同的lon值和适当的lat值:

x2 <- x
y2 <- (y + 5e6) - 1 # only adding 5m
data.frame(x2, y2) %>%
    sf::st_as_sf(
        coords = c("x2", "y2"),
        crs = paste0("+proj=utm +zone=", zone_num, " +south") # Note " + south"
    ) %>%
    sf::st_transform(crs = paste0("+proj=longlat +datum=", ellipsoid)) %>%
    sf::st_coordinates() %>%
    data.frame() %>%
    dplyr::rename("lon" = "X", "lat" = "Y")

#   lon       lat
# 1  15 -3.168563

字符串

相关问题