「GIS算法」计算任意多边形质心的方法
发布时间: 2023-05-04
所属分类: GIS百科
在之前的文章《QGIS使用字段计算器添加质心坐标(centroid)》中我们介绍了使用QGIS的字段计算器添加质心坐标的方法。有同学好奇这个质心是怎么计算的?如果计算一个多边形的质心?今天做一个简要的介绍。
简要推理
如下图,是一个正方形,其面积为 16。
假设质量均匀,其质心为 (2, 2)
。在右侧再放一个长方形,如图:
长方形的质心为 (6, 4)
,其面积为 32。
那么这两个图形组合在一起,其实质心是多少?假设质心为(x,y),那么下面的公式成立:
x * 48 = 2 * 16 + 6 * 32
y * 48 = 2 * 16 + 4 * 32
x = 14/3, y = 10/3。
相同的方式,把一个任意多边形,可以分割成多个三角形,总结出来的公式如下:
其中Ai表示三角形的面积,可以利用边长向量的外积的一半来求得。xi yi分别代表顶点的坐标。
JS 实现
使用JavaScript可以做如下实现:
function getCentroid(points) {
var totalArea = 0;
var totalX = 0;
var totalY = 0;
for (var i = 0; i < points.length - 1; ++i) {
// a、b以及原点构成一个三角形
var a = points[i + 1];
var b = points[i];
console.log(i);
var area = 0.5 * (a[0] * b[1] - b[0] * a[1]); // 计算面积
var x = (a[0] + b[0]) / 3; // 计算x方向质心
var y = (a[1] + b[1]) / 3; // 计算y方向质心
totalArea += area;
totalX += area * x;
totalY += area * y;
}
return [totalX / totalArea, totalY / totalArea];
}
测试对比
使用之前在文章《QGIS导出SHP文件中某个要素的坐标至TXT》中提到的方法,将一组坐标导出,并代入,计算得出结果:
对比下《QGIS使用字段计算器添加质心坐标(centroid)》中计算的结果:
结果是一致的。
参考
- https://jingsam.github.io/2016/10/05/centroid.html
- https://zh.wikipedia.org/wiki/%E5%87%A0%E4%BD%95%E4%B8%AD%E5%BF%83#cite_note-3
- https://en.wikipedia.org/wiki/Shoelace_formula
- https://zhuanlan.zhihu.com/p/485050422
相关阅读
声明
1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。
2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。
手机阅读
公众号关注
知识星球
手机阅读
最新GIS干货
私享圈子
上一篇:「GIS百科」我国常用的地图投影
下一篇:「GIS百科」什么是城市坐标系