使用R的sf包进行点与多边形相交时结果异常的原因排查
问题本质解析与解决方案验证
核心原因:CRS赋值与转换的本质差异
- 你遇到的问题并非ESRI投影本身的问题,而是错误地将经纬度坐标直接当成平面投影坐标赋值:
- 地铁站点原始数据是WGS84经纬度(单位为度),但直接设置
ESRI:102003时,sf会默认这些数值是该Albers投影下的平面坐标(单位为米)。 - USA Contiguous Albers投影的中央经线大致位于堪萨斯州附近,把经纬度的度数值当成米坐标后,所有点会被定位到投影原点周边区域,也就是堪萨斯州。
- 地铁站点原始数据是WGS84经纬度(单位为度),但直接设置
- 先设置WGS84(
EPSG:4326)再用st_transform()转换是正确流程:先明确原始坐标的含义(经纬度),再通过投影公式将其转换为Albers投影的平面米坐标,与tract文件的空间参考完全匹配,因此结果正确。
ESRI投影的特殊性说明
ESRI:102003和EPSG对应的EPSG:5070参数完全一致,仅CRS标识符不同。这个问题和ESRI投影无关,换成任何平面投影,只要把经纬度直接当成平面坐标赋值,都会出现定位错误。
解决方案的潜在风险排查
你当前采用的"先设WGS84再转换"流程是标准且无风险的,只需注意两个细节:
- 确认原始点数据确实是WGS84经纬度(绝大多数公开地理数据、GPS数据默认采用该CRS);
- 转换时直接提取tract文件的CRS(
st_crs(tract_data))传入st_transform(),避免手动输入CRS字符串导致的参数不匹配问题。
代码示例对比
# 错误示例:直接给经纬度点设置Albers投影 wrong_sf <- st_sf( geometry = st_sfc(st_point(c(-77.0369, 38.9072)), # DC某站点经纬度 crs = st_crs("ESRI:102003") ) # 正确示例:先定义WGS84,再转换为tract的CRS correct_sf <- st_sf( geometry = st_sfc(st_point(c(-77.0369, 38.9072)), crs = st_crs("EPSG:4326") ) correct_sf_transformed <- st_transform(correct_sf, st_crs(tract_data))
内容的提问来源于stack exchange,提问作者dmcd
相关产品推荐
相关产品推荐

