我正在使用QGIS 1.8 Lisboa。从多边形shapefile计算质心后,如果其中一些重心位于多边形轮廓线之外,我想将质心移到它们来自的多边形上。该标准应该明确,因为我必须使用它们来提取坐标以用作多边形本身的标识代码。因此,该过程在每次针对相同多边形运行时都应输出相同的点位置(而不是像“随机点”函数所给出的那样的随机位置,该位置在每次运行时都会给出新的结果)。
我正在使用QGIS 1.8 Lisboa。从多边形shapefile计算质心后,如果其中一些重心位于多边形轮廓线之外,我想将质心移到它们来自的多边形上。该标准应该明确,因为我必须使用它们来提取坐标以用作多边形本身的标识代码。因此,该过程在每次针对相同多边形运行时都应输出相同的点位置(而不是像“随机点”函数所给出的那样的随机位置,该位置在每次运行时都会给出新的结果)。
Answers:
您可以使用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()
ftools质心工具可以将质心放置在多边形(如果它是凹面的)外部。
ST_PointOnSurface
一定会做你想要的。如果已安装,可以使用QIT内部的命令,方法是使用SPIT将shapefile放入PostGIS,然后使用PgQuery插件运行查询。
另外,如果一次性安装PostGIS有点麻烦,则可以在QGIS中使用Spatialite。然后,您可以使用QSpatiaLite插件将数据导入SpatiaLite并运行查询(SpatialLite荣誉ST_PointOnSurface
)。
当我理解您的权利时,请使用:矢量->研究工具_>随机点。现在在“分层抽样设计(单个多边形)”下选择,使用输入字段中的值,并使用适当的字段,该字段给出点的数值,每个不同的多边形应生成该数值
realcentroids插件,可通过“插件”>“管理和安装”插件安装,在QGIS 2.2中为我工作,以生成类似质心的点,如果凹入,则将其强制进入每个多边形内部(该点将非常靠近边缘)。我按照Kurt的建议尝试了“随机点”工具,尽管我为每个多边形指定了1个点,但它却生成了2个点。另外一个缺点是,在大多数情况下,这些点不代表质心,因为它们是随机的。