R语言用geosphere包计算数据框行间地理距离矩阵报纬度越界错误咨询
报错核心原因
经纬度字段完全错位,触发geosphere包的内置坐标范围校验失败
- 地理坐标的法定取值范围:
- 经度范围:-180 ~ 180,对应东/西向角度,是geosphere函数要求输入矩阵的第一列值
- 纬度范围:-90 ~ 90,对应南/北向角度,是geosphere函数要求输入矩阵的第二列值
- 对样本数据做范围校验可直接定位问题:
你提供的原始数据中,被命名为
latitude的列包含-122.39787657270155(低于-90的纬度下限)、139.6860258167475(高于90的纬度上限),这类数值完全符合经度的取值特征;而被命名为longitude的列所有数值均落在-90~90区间,实际存储的是纬度值。两列的字段对应关系完全颠倒,函数按输入顺序把本该是经度的数值当成纬度做校验,自然抛出latitude < -90的报错。 - 之前尝试缩减小数位数无效的逻辑解释:问题本质是字段存储的内容类型错位,和小数精度无关,调整小数位数不会改变数值本身超出纬度合法范围的事实,因此无法解决报错。
修正实现代码
# 构造符合geosphere输入要求的坐标矩阵:第一列为经度(取自原始数据中存储经度的列),第二列为纬度(取自原始数据中存储纬度的列) coords_for_dist <- cbind( gps$latitude, gps$longitude ) # 计算Vincenty椭球距离矩阵 gps_mat <- distm( x = coords_for_dist, y = coords_for_dist, fun = distVincentyEllipsoid ) # 为矩阵添加行列名,对应各个公司主体 rownames(gps_mat) <- gps$company colnames(gps_mat) <- gps$company
输出结果校验
运行修正后的代码可直接生成符合预期的4*4对称距离矩阵:
- 矩阵对角线所有元素为0,对应点位到自身的距离
- 矩阵非对角线元素为两点间的椭球测地线距离,单位为米
- 矩阵完全对称,即点位A到B的距离与点位B到A的距离完全一致
内容的提问来源于stack exchange,提问作者SteffenT
相关产品推荐
相关产品推荐

