将秘鲁2012年人口普查数据投影至UTM坐标系时遇报错求助
解决SpatialPolygonsDataFrame投影失败的实操方案
针对你用sp包投影秘鲁人口普查空间数据时遇到的问题,我整理了几个排查和解决步骤,很多时候都是细节上的小疏漏导致的:
先排查核心前提
这是投影失败最常见的根源:
- 确保你的
SpatialPolygonsDataFrame已经正确绑定了原CRS,不是只知道参数但没赋值; - 目标CRS参数要完整,你给出的
+proj=utm +zone=18 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs是没问题的。
方法一:修复sp包的投影操作
如果参考的sp包方案无效,按这个流程重新操作:
- 先确认并强制绑定原CRS:
library(sp) # 查看当前数据的CRS print(proj4string(your_census_data)) # 如果输出和你说的WGS84经纬度不符,手动赋值 proj4string(your_census_data) <- CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0") - 完整定义目标CRS:
newCRScensus <- CRS("+proj=utm +zone=18 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs") - 带CRS检查参数执行投影:
census_projected <- spTransform(your_census_data, newCRScensus, checkCRS = TRUE)
方法二:转用sf包(推荐,更稳定)
sp包的维护已经不如sf包积极,很多空间数据兼容性问题用sf能直接解决:
- 将sp对象转为sf格式:
library(sf) census_sf <- st_as_sf(your_census_data) - 用EPSG代码绑定原CRS(比proj4字符串更可靠,WGS84经纬度的EPSG是4326):
st_crs(census_sf) <- 4326 - 投影到目标CRS(UTM 18S的EPSG代码是32718,直接用代码更省心):
如果你坚持用proj4字符串,也可以这么写:census_projected_sf <- st_transform(census_sf, 32718)census_projected_sf <- st_transform(census_sf, "+proj=utm +zone=18 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs") - 若后续需要转回sp对象:
census_projected_sp <- as(census_projected_sf, "Spatial")
额外排查:无效几何问题
如果以上都不行,大概率是空间数据存在无效几何(比如自相交多边形),用sf包可以快速修复:
# 检查是否有无效几何 st_is_valid(census_sf) # 修复无效几何 census_sf_fixed <- st_make_valid(census_sf) # 再执行投影 census_projected_sf <- st_transform(census_sf_fixed, 32718)
另外,建议更新你的sp和sf包到最新版本,旧版本可能存在CRS解析的bug:
update.packages(c("sp", "sf"))
内容的提问来源于stack exchange,提问作者V. Bonnesoeur
相关产品推荐
相关产品推荐

