You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 17:21:06