将质心分配和移动到其多边形


9

我正在使用QGIS 1.8 Lisboa。从多边形shapefile计算质心后,如果其中一些重心位于多边形轮廓线之外,我想将质心移到它们来自的多边形上。该标准应该明确,因为我必须使用它们来提取坐标以用作多边形本身的标识代码。因此,该过程在每次针对相同多边形运行时都应输出相同的点位置(而不是像“随机点”函数所给出的那样的随机位置,该位置在每次运行时都会给出新的结果)。


1
听起来像两个问题。如果我理解正确,您想(a)在多边形内添加随机点,并且(b)根据此点为它们或多边形赋予唯一的ID。对于(a)而言,最简单的事情是使用QGIS中现有的随机点功能,然后将该点云与多边形相交。
lynxlynxlynx

使用“随机点”函数在相同的多边形上使用不同的时间会导致不同的结果(即,每次使用该函数时,从每个多边形派生的点的位置都不同),我想创建一种方法,每个多边形总是相同的点,从中可以提取要用作多边形自身标识代码的坐标。
umbe1987

在几何工具下使用fTools“真实质心”工具-docs.qgis.org/html/en/docs/user_manual/plugins/…–
Mapperz

它只是给了我质心,但这也可能位于poligon之外,我必须避免。我需要使用最小距离之类的函数将它们移动到它们衍生的多边形上(但我对距离不感兴趣,我希望将其移动)。在另一个博客中,有人告诉我使用PostGIS的ST_PointOnSurface(但我正在使用QGIS)。
umbe1987

Answers:


7

您可以使用Shapely python库,该库提供了representative_point()保证位于多边形内的功能。

这是一个可以在QGIS Python控制台中运行的Python脚本。应该选择要为其创建属性的多边形图层。该函数采用您要更新的属性的名称。该属性必须已经存在于您的图层中,它必须是字符串类型,并且应该足够长(30个字符)。

这是算法发现要点的示例:

import shapely.wkb

def setIDPoint(attributename):
 layer = qgis.utils.iface.activeLayer()
 provider = layer.dataProvider()
 fields = provider.fields()
 provider.select(provider.attributeIndexes() )
 attributeID = provider.fieldNameIndex(attributename)
 feature = QgsFeature()
 layer.startEditing()
 while provider.nextFeature(feature):
  wkb = feature.geometry().asWkb()
  polygon = shapely.wkb.loads(wkb)
  reprPoint = ','.join([str(polygon.representative_point().x), str(polygon.representative_point().y)] )
  feature.changeAttribute(attributeID, reprPoint)
  layer.updateFeature(feature)
 layer.commitChanges()

我正在尝试测试,似乎正是我想要的。我会在运行后立即通知您!
umbe1987

我没有得到的一件事是您的意思是“它必须是字符串类型,并且应该足够长(30个字符)”。该库可直接在多边形shpfile上运行吗?如果是这样,我是否应该在“ Att”选项卡中创建一个至少包含30个字符的新字符串类型字段,而这将是要更新的字段?
umbe1987

@ user9518:是的,当您必须自己在表中创建属性,然后仅将字段名称传递给函数时,编写函数的方式。如果需要的话,还可以很容易地将脚本修改为自己创建所需的字段。
杰克

我只是想念一件事。现在看来,我通过键入“ def”来定义一个函数(或一个类),但是当我结束编写脚本时,它什么也没有发生。最终如何在表中显示结果?
umbe1987

1
它工作得很好!!!我想象坐标是根据图层的坐标系编写的,如果我想拥有这些点,则需要使用这些坐标创建一个shp,对吗?如果您在这里,我将至少为您提供3杯啤酒!非常感谢您的努力!!!
umbe1987

5

ftools质心工具可以将质心放置在多边形(如果它是凹面的)外部。

ST_PointOnSurface一定会做你想要的。如果已安装,可以使用QIT内部的命令,方法是使用SPIT将shapefile放入PostGIS,然后使用PgQuery插件运行查询。

另外,如果一次性安装PostGIS有点麻烦,则可以在QGIS中使用Spatialite。然后,您可以使用QSpatiaLite插件将数据导入SpatiaLite并运行查询(SpatialLite荣誉ST_PointOnSurface)。


2

当我理解您的权利时,请使用:矢量->研究工具_>随机点。现在在“分层抽样设计(单个多边形)”下选择,使用输入字段中的值,并使用适当的字段,该字段给出点的数值,每个不同的多边形应生成该数值


“适当的领域”是什么意思?我在考虑使用质心,然后将其链接到它所指的多边形的最近部分(如果它位于轮廓之外),例如(通过计算该点到其最近的多边形的最小距离)。然后,目的是提取该点坐标,以便将其用作多边形的唯一特定标识码。
umbe1987

基本上,我想做的是将每个质心分配给其相对多边形,并将其移动到其多边形内部(或至少触摸其边界线)。
umbe1987

@ user9518:对不起,我确实误会了您的问题。我以为您想要每个poly内有特定数量的随机点,例如2个fpr poly 1个点,poly2内的10个点等。因此,术语“适当的字段”。当然,您可以为“使用此点数”选择1,以便为每个多边形仅生成一个点。这一点在多边形内部或至少触及其边界线。但是仍然可以随机找到该点,因此当您重做该过程时,您会得到其他点:-(
Kurt

1

realcentroids插件,可通过“插件”>“管理和安装”插件安装,在QGIS 2.2中为我工作,以生成类似质心的点,如果凹入,则将其强制进入每个多边形内部(该点将非常靠近边缘)。我按照Kurt的建议尝试了“随机点”工具,尽管我为每个多边形指定了1个点,但它却生成了2个点。另外一个缺点是,在大多数情况下,这些点不代表质心,因为它们是随机的。

http://www.agt.bme.hu/gis/qgis/realcentroid/

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.