为什么R语言gDistance函数返回的距离结果与实际数据情况不符?
问题根源
你遇到的错误核心是两个常见的空间计算误区:
gDistance不支持地理坐标系(经纬度)的距离计算:你当前用的NAD83是地理坐标系,单位是十进制度,gDistance会直接把经纬度值当成平面坐标计算欧氏距离,得到的结果单位不是米,数值完全没有实际意义,你看到的700万米左右的异常值就是这么来的。- 点数据未正确配置投影:你生成
discampspts的时候,仅提取了坐标值,没有继承原始点数据集的投影信息,也没有和NPS面数据的投影对齐,进一步放大了计算误差。
解决方案
方案1:转平面投影后用gDistance计算(推荐,精度更高)
美国本土分析推荐使用NAD83 CONUS Albers投影(EPSG:5070),单位为米,适合距离计算:
# 加载必要包,建议用sf包替换老旧的sp/rgdal接口,语法更简洁 library(sf) library(tidyverse) # 读取数据 discamping <- st_read("C:/Users/amand/Desktop/GISCert/Geospatial Analysis/Final/Recreation_Opportunities_(Feature_Layer)/Recreation_Opportunities_(Feature_Layer).shp") %>% filter(MARKERACTI == "Dispersed Camping") npssp <- st_read("C:/Users/amand/Desktop/GISCert/Geospatial Analysis/Final/NPS_-_Land_Resources_Division_Boundary_and_Tract_Data_Service/NPS_-_Land_Resources_Division_Boundary_and_Tract_Data_Service.shp") # 统一转成CONUS Albers平面投影 target_crs <- st_crs(5070) discamping_proj <- st_transform(discamping, target_crs) npssp_proj <- st_transform(npssp, target_crs) # 计算每个点到最近的NPS面的距离,单位为米 distance <- st_distance(discamping_proj, npssp_proj) %>% apply(1, min)
方案2:保留经纬度,用球面距离函数计算
如果不想转投影,可以用geosphere包的球面距离计算函数,不需要平面投影:
library(geosphere) # 确保点和面都用NAD83经纬度投影 discampspts <- discamping %>% st_transform(4269) %>% st_coordinates() nps_geom <- npssp %>% st_transform(4269) %>% st_geometry() # 计算每个点到最近NPS面的距离,单位为米 distance <- apply(dist2Line(discampspts, nps_geom), 1, function(x) x[1])
内容的提问来源于stack exchange,提问作者Amanda Eddleman
相关产品推荐
相关产品推荐

