st_as_sf坐标转换异常:芬兰坐标被转至赤道附近求助
解决st_as_sf转换后坐标偏移(芬兰点位显示在赤道附近)的问题
问题描述
数据表plants_noFD中的坐标记录正确,但通过sf包的st_as_sf转换为空间要素对象后,地图显示异常:原本位于芬兰(约65°N)的点位,被错误渲染到赤道附近(<1°N)。使用的代码如下:
points_plants_sf = st_as_sf(plants_noFD, coords = c("EASTING_EPSG3067", "NORTHING_EPSG3067"), crs = 3067) ggplot() + geom_sf(data = points_plants_sf)
问题原因
EPSG:3067是ETRS89 / TM35FIN平面投影坐标系,坐标单位为米,北向坐标数值范围大致在6500000-7800000米之间。而geom_sf在默认场景下,若未明确处理投影转换,会错误将平面坐标数值当作经纬度(度)解析——超出合法纬度范围(-90°~90°)的数值会被强制修正,最终导致点位偏移到赤道附近。
解决方案
1. 转换为经纬度坐标系后绘制
将平面投影的sf对象转换为通用的WGS84(EPSG:4326)经纬度坐标系,再进行绘制:
# 转换至WGS84经纬度坐标系 points_plants_sf_wgs84 = st_transform(points_plants_sf, crs = 4326) # 绘制地图 ggplot() + geom_sf(data = points_plants_sf_wgs84)
2. 检查坐标列的数据类型
确保EASTING_EPSG3067和NORTHING_EPSG3067是数值型(numeric),字符型坐标会导致st_as_sf无法正确解析:
# 检查数据类型 str(plants_noFD$EASTING_EPSG3067) str(plants_noFD$NORTHING_EPSG3067) # 若为字符型,转换为数值型 plants_noFD$EASTING_EPSG3067 = as.numeric(plants_noFD$EASTING_EPSG3067) plants_noFD$NORTHING_EPSG3067 = as.numeric(plants_noFD$NORTHING_EPSG3067) # 重新生成sf对象并绘制 points_plants_sf = st_as_sf(plants_noFD, coords = c("EASTING_EPSG3067", "NORTHING_EPSG3067"), crs = 3067) ggplot() + geom_sf(data = points_plants_sf)
3. 验证CRS是否正确设置
用st_crs()确认sf对象的坐标系是否正确绑定:
st_crs(points_plants_sf)
正常输出应包含EPSG:3067的详细信息,若显示NA或错误CRS,需重新执行st_as_sf并确保crs参数生效。
内容的提问来源于stack exchange,提问作者Luc
相关产品推荐
相关产品推荐

