如何确定多边形的质心?


34

我有一个多边形矢量,我想快速获得该多边形的质心,以插入文本文档中。我正在使用QGIS。我搜索了其他问题,尽管有些问题有些接近,但并不能完全回答我的问题。

理想情况下,质心坐标应位于多边形的属性表中,我只需复制并粘贴坐标即可。

我不想创建一个单独的表示质心的点矢量文件,然后找到这些坐标并复制并粘贴它们。


您的文本文件是什么格式?
内森·W

这是一个MS Word文档,但实际上可以是任何东西。
David

Answers:


34

根据定义,质心是点层而不是多边形。因此,您需要创建一个新层,在QGIS 1.8及更高版本中,这很容易。

  • 载入多边形
  • 转到菜单->矢量->几何工具->多边形质心并创建质心点图层
  • 通过单击->矢量菜单->几何工具->导出/添加几何列,将创建的质心的坐标导出到属性表。

然后,您可以进行空间连接以将质心列添加到多边形,然后再次删除点图层。


感谢您的答复,我感谢您的帮助。尽管如此,要知道质心的坐标是多少,仍然需要做很多工作。不幸的是,QGIS中没有简单的方法。
大卫,

如果仍然希望它更简单,则可以看一下下面提到的PostGIS和ST_Centroid函数。这样,您无需创建临时文件。或者,您可以为自己编写QGIS的python脚本或使用SEXTANTE Modeler。
Curlew

10

确实,制作新的shapefile是您最简单的选择之一。但是,您不需要复制和粘贴坐标。做这个:

  • 使用多边形质心工具制作质心文件。
  • 打开质心属性表,使其可编辑(底部的铅笔图标)。
  • 打开字段计算器(底部的计算器图标),然后选择“创建新字段”选项,并将其命名为有意义的名称(例如Easting)。
  • 在功能列表中,展开几何菜单,然后选择$ x,然后为$ y新建一个列(称其为Northing)。
  • 保存您的编辑,现在,所有坐标都作为属性表的一部分包含了原始多边形ID和属性(如果您使用了质心工具)。

或者,您将必须将数据导入PostGIS,然后使用ST_Centroid函数遍历多边形并将结果存储在新字段中。所涉及的工作大致相同,但是第二种选择意味着您没有单独的质心点文件。


感谢您的回答。我感谢您的帮助。看来Curlew的回答对我来说要容易一些。这两个答案仍然是我想要做的更多工作。最后,您将获得各种shapefile,必须对其进行命名,删除,编辑等
David

8

迈克答案的更强大解决方案: long = toreal(regexp_substr(geom_to_wkt(centroid($geometry)), '(-?\\d+\\.?\\d*) -?\\d+\\.?\\d*')) lat = toreal(regexp_substr(geom_to_wkt(centroid($geometry)), '-?\\d+\\.?\\d* (-?\\d+\\.?\\d*)'))


1
被低估的答案;)
FernandoIrarrázavalG

6

在2.2字段计算器中如何使用呢?

长字段= substr(geomToWKT(centroid($ geometry)),7,12)

纬度字段= substr(geomToWKT(centroid($ geometry)),strpos(geomToWKT(centroid($ geometry)),'')+2,12)

似乎在2.6中使用xmin选项xmin(centroid($ geometry))解决了这个问题


5

我刚刚发现这篇文章晚了将近5年(!),但是这是我在版本2.18.14中计算多边形质心的方法:

  1. 开始编辑多边形层
  2. 创建一个新的文本字段,将其命名为centroidxy
  3. 使用字段计算器,计算质心 = x($ geometry)|| ','|| y($ geometry)
  4. 结果看起来像:397640.915545362,2126924.53637653
  5. 保存您的修改。
  6. 您的多边形层现在包含具有x,y重心值的字段

简单而精湛
Kazuhito

3

将质心点表与多边形表关联,然后将坐标与多边形名称和形状放在一起。多边形本身不长一格


感谢您的回答。是的,我认识到多边形没有一个纬度,而多边形本身就是可以计算的。不幸的是,这在QGIS中并不比这简单。再次感谢大家的回答。而且速度也很快。谢谢!
David

2

出现在这篇文章中,很难遵循,建议更新:

注意:这将计算投影坐标中的纬度和经度(可能是米)。如果要以十进制度数表示坐标(我假设您这样做,或者它们大多难以理解),请首先将该图层保存在以下CRS中:EPSG:4326,WGS 84。

  1. 开放式计算器
  2. 建立新栏位
  3. 输入名称(纬度或经度)
  4. 选择十进制作为输出字段类型
  5. 为纬度输入此表达式:y($ geometry),为经度输入此表达式:x($ geometry)
  6. 按确定

-2

lon = ToReal(regexp_substr(geomToWKT(centroid($ geometry)),'([\ s]'))lat = ToReal(regexp_substr(geomToWKT(centroid($ geometry)),'\ s [)]'))


1
这根本没有答案。请参观旅游团,以更好地理解如何回答问题……
Nightwatch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.