使用st_transform转换UTM至十进制度:南半球转换异常问题
UTM转十进制度的南半球转换问题排查
问题重现
用户使用R的tidyverse和sf包实现UTM转十进制度,代码如下:
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,lat:42 - 南半球测试用例异常:预期
lon:15,lat:-48.30,实际输出lon:-165,lat:48.2686
问题原因
UTM半球投影未明确指定
UTM坐标系分南北半球,默认情况下+proj=utm +zone=33对应的是北半球UTM 33N投影。当你输入手动调整后的y坐标,sf会将其解析为北半球UTM 33N的坐标,该坐标对应的经纬度正好是你预期点的对跖点(经度相差180°,纬度数值相同但半球相反),这就是输出异常的核心原因。手动调整y坐标的方式错误
UTM南北半球的坐标系统是独立定义的,并非简单给y坐标加10000000就能完成半球转换。正确的做法是在CRS参数中明确指定南半球属性,而非手动修改坐标值。
修正方案
修改南半球测试用例的CRS定义,添加+south参数,同时使用该点对应的真实UTM 33S坐标(无需手动调整y值):
# 修正后的南半球测试用例 x2 <- 500000 # 对应lon:15, lat:-48.30的UTM 33S正确y坐标示例 y2 <- 4512345 res <- data.frame(x2, y2) %>% sf::st_as_sf(coords = c("x2", "y2"), # 明确指定南半球UTM投影 crs = paste0("+proj=utm +zone=", zone_num, " +south")) %>% sf::st_transform(crs = paste0("+proj=longlat +datum=", ellipsoid)) %>% sf::st_coordinates() %>% data.frame() %>% dplyr::rename("lon" = "X", "lat" = "Y");res
也可以直接使用EPSG代码指定CRS,UTM 33S的EPSG代码是32733,这样更不容易出错:
crs = 32733
内容的提问来源于stack exchange,提问作者aczich
相关产品推荐
相关产品推荐

