SRID 4326 WKT坐标经纬度颠倒 st_transform投影转换异常咨询
问题解答
1. 关于是否存在对应EPSG编码的问题
不存在符合需求的EPSG编码。EPSG官方对WGS84地理坐标系的唯一公开编码就是EPSG:4326,其定义明确第一轴为纬度、第二轴为经度,没有专门定义交换轴顺序的同基准EPSG编码。你遇到的坐标偏移问题本质是不同工具对WGS84轴顺序的处理惯例差异:rnaturalearth返回的坐标系沿用了传统GIS工具的(lon, lat)数据存储顺序,与EPSG官方定义的轴顺序不一致,直接转换坐标系并不会自动修正你原始WKT内的坐标顺序错位问题。
2. 批量调整多点坐标顺序的方案
你可以直接对sf对象的几何坐标执行批量轴交换,无需手动处理每个WKT字符串,也不受单个多点要素内点数量的影响,示例代码如下:
library(sf) library(dplyr) library(ggplot2) library(rnaturalearth) # 原始数据加载逻辑保留 tst <- data.frame(ID = rep("Test", 2), SRIDTrail = rep(4326, 2), Trail = c("MULTIPOINT (52.86 -8.00, 52.85 -7.98, 52.85 -7.98, 52.85 -7.98, 52.89 -7.98, 52.85 -7.98, 52.85 -7.98, 52.85 -7.98, 52.85 -7.98, 52.85 -7.98, 52.85 -7.98, 52.85 -7.97)", "MULTIPOINT (53.86 -7.00, 52.02 -6.98, 53.85 -7.80, 51.85 -8.98, 52.89 -7.98, 52.85 -7.98, 52.85 -7.98, 52.85 -7.98, 52.85 -7.98, 52.85 -7.98, 52.85 -7.98, 52.85 -7.97)")) tst_sf <- tst %>% st_as_sf(wkt = "Trail") %>% st_set_crs(4326) # 批量交换坐标轴:将原始的(lat, lon)转为(lon, lat) tst_sf_fixed <- tst_sf %>% st_coordinates() %>% as.data.frame() %>% # 交换X、Y列,保留原始行分组编号L1 select(X = Y, Y = X, L1) %>% group_by(L1) %>% # 按原始行重新生成多点要素 summarise(geometry = st_multipoint(cbind(X, Y)) %>% st_sfc()) %>% ungroup() %>% # 恢复原始属性列,赋值正确坐标系 bind_cols(tst_sf %>% st_drop_geometry()) %>% st_sf(crs = 4326) # 加载世界地图后即可正常对齐绘图 world <- ne_countries(scale = "medium", returnclass = "sf") ggplot() + geom_sf(data = world) + geom_sf(data = tst_sf_fixed, col = "red") + # 可调整坐标范围聚焦爱尔兰区域验证效果 coord_sf(xlim = c(-10, -5), ylim = c(51, 55)) + theme_bw()
上述代码的核心逻辑是先提取所有点的坐标,交换经纬度顺序后按原始行的分组重新生成多点要素,不管每行的多点包含多少个点都可以自动适配,处理数百行数据的效率很高。
内容的提问来源于stack exchange,提问作者Virginia Morera Pujol
相关产品推荐
相关产品推荐

