相同CRS下SpatialPixelDataframe与多边形绘图时北移问题
问题定位及解决办法
核心原因
你遇到的向北偏移是CRS基准面转换参数不匹配导致的:
- 你读取的
SpatialPixelDataframe对象的proj4string缺失了完整的基准面转换(TOWGS84)参数,而sf读取shapefile时默认调用系统proj库的完整转换参数,两者看似CRS名相同,实际坐标基准存在约200米的北向偏移,正好匹配你遇到的偏移量。 - sp类对象对PROJ6+的投影支持存在兼容性问题,混用sp和sf对象的投影转换容易出现参数丢失。
解决方案
统一使用sf对象处理所有空间数据,避免sp和sf混用导致的投影参数损失,代码如下:
library(sf) library(tmap) # 读取数据 ireland <- st_read("Counties.shp") sp_pred <- readRDS("sppred_range100_sd2.RDS") # 把sp像素对象转sf,自动继承投影参数 sp_pred_sf <- st_as_sf(sp_pred) # 把多边形转换到和像素完全一致的CRS ireland_proj <- st_transform(ireland, st_crs(sp_pred_sf)) # tmap绘图 tm_shape(sp_pred_sf) + tm_raster("mean", palette = terrain.colors(10)) + tm_shape(ireland_proj) + tm_borders("black", lwd = .5) + tm_legend(show = FALSE)
如果仍然存在偏移,可手动指定CRS的EPSG编码确认:爱尔兰常用的TM65投影EPSG为29902,ITM投影EPSG为2157,可手动指定转换目标:
# 示例:手动指定为ITM投影 ireland_proj <- st_transform(ireland, 2157) # 若原像素对象投影参数缺失可手动赋值 st_crs(sp_pred_sf) <- 2157
内容的提问来源于stack exchange,提问作者Virginia Morera Pujol
相关产品推荐
相关产品推荐

