rgeos::gCentroid()与sf::st_centroid()返回值是否有差异?若有,差异是什么?
解决sf::st_centroid()的警告问题
我来帮你搞定这个sf::st_centroid()的警告问题~其实这个提示背后的原因很明确:你的comarea606几何数据大概率用的是地理坐标系(比如常见的WGS84,EPSG:4326),而st_centroid()默认是基于平面几何的质心计算逻辑,直接在球面坐标系上运算会有精度偏差,所以R才会弹出警告提醒你。
下面是具体的解决步骤:
第一步:先确认当前坐标系
先搞清楚你的数据用的是什么坐标系,运行这段代码就行:st_crs(comarea606$geometry)如果输出里的
epsg是4326这类地理坐标系代码,那就是问题的根源了。第二步:转成平面投影再计算质心
地理坐标系是经纬度格式,适合定位但不适合做空间计算。我们需要先把数据转换成对应区域的平面投影(比如UTM坐标系,根据数据所在的经纬度选对应的EPSG代码),计算完质心后再转回原坐标系(如果需要的话):# 转换为平面投影(示例用EPSG:32616,对应北半球西经80°-74°区域,记得按需替换) comarea606_proj <- st_transform(comarea606, crs = 32616) # 计算质心,这时就不会弹出警告了 centroids <- st_centroid(comarea606_proj$geometry) # 可选操作:转回原地理坐标系(WGS84) centroids_wgs84 <- st_transform(centroids, crs = 4326)额外小技巧:处理多面几何要素
如果你的comarea606$geometry是包含多个多边形的多面要素,可以加上of_largest_polygon = TRUE参数,指定只计算最大多边形的质心,避免结果偏离主要区域:centroids <- st_centroid(comarea606_proj$geometry, of_largest_polygon = TRUE)
最后补充个小备选:如果只是需要一个落在几何内部的点(不一定严格是质心),也可以用st_point_on_surface(),这个函数在地理坐标系下也能安全运行,不会弹出警告。
内容的提问来源于stack exchange,提问作者Cristian E. Nuno
相关产品推荐
相关产品推荐

