计算含经纬度数据的dataframe质心结果异常,该如何排查?
问题原因
你得到的结果异常,核心原因是所调用的centroid函数不支持直接输入仅包含经纬度列的普通dataframe,常见的具体场景有两类:
- 你使用的
centroid来自空间计算类包(如geosphere/rgeos),这类包的centroid默认输入是多边形、线要素等空间对象,传入点集dataframe时,会将数据误识别为多边形顶点序列计算多边形质心,当点序列不自闭合、跨度大时就会得到完全不符合预期的结果 - 存在包函数命名冲突,你实际调用的不是空间计算类的质心函数,而是其他包同名的、用于其他计算逻辑的
centroid函数
验证与解决方法
- 先通过简单算术平均验证预期结果(小范围区域的点集质心直接用算术平均误差可接受),执行以下代码:
# 计算点集经纬度算术平均值 expected_lon <- mean(test_points$Lon) expected_lat <- mean(test_points$Lat) print(c(expected_lon, expected_lat))
按你给出的测试数据集计算,得到的结果应该在lon=7.21、lat=51.33左右,符合你的预期范围。
- 若需要更精确的、考虑地球曲率的质心计算,使用
geosphere包的geomean函数:
library(geosphere) # 函数要求输入为两列矩阵,顺序为经度、纬度 precise_centroid <- geomean(as.matrix(test_points))
- 若要使用
centroid相关的空间类函数,需先将普通dataframe转换为标准空间对象:
library(sf) # 转换为sf点对象,指定坐标参考系为WGS84(常用经纬度坐标系,EPSG编码4326) points_sf <- st_as_sf(test_points, coords = c("Lon", "Lat"), crs = 4326) # 计算点集质心 correct_centroid <- st_centroid(points_sf)
内容的提问来源于stack exchange,提问作者dumei
相关产品推荐
相关产品推荐

