麻辣GIS微信平台

更多 GIS 干货

微信关注不错过

「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)》中计算的结果:

结果是一致的。

参考

  1. https://jingsam.github.io/2016/10/05/centroid.html
  2. https://zh.wikipedia.org/wiki/%E5%87%A0%E4%BD%95%E4%B8%AD%E5%BF%83#cite_note-3
  3. https://en.wikipedia.org/wiki/Shoelace_formula
  4. https://zhuanlan.zhihu.com/p/485050422

相关阅读

麻辣GIS-Sailor

作者:

GIS爱好者,学GIS,更爱玩GIS。

声明

1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。

2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。

手机阅读
公众号关注
知识星球
手机阅读
麻辣GIS微信公众号关注
最新GIS干货
关注麻辣GIS知识星球
私享圈子

留言板(小编看到第一时间回复)