如何在面向最长边的多边形内创建网格?


13

我一直在使用一个名为“创建多边形格网”的过程来在具有指定行和列属性的多边形内创建网格。这是我一直在QGIS中运行的SAGA工具。它根据输入多边形的范围生成一个网格,其中单元格从N到S和E到W。如果网格的方向平行于多边形的最长边缘,则对我的分析会更好。作为参考,我附加了当前自动输出的图像以及我手动更改的输出以使网格与多边形对齐。网格最初覆盖了多边形的整个范围,但已被裁剪以仅显示内部的像元部分。

这是默认的输出工具 上图是默认情况下工具放置的内容。

在此处输入图片说明 这是网格的图像,已对其进行手动编辑以适合必要的参数。

我的问题是,有没有一种方法可以自动生成对齐的网格(例如第二张图像中的网格)?我将需要为数千个多边形生成网格。


1
多边形是具有4个边的矩形还是普通多边形?我问您这个问题是因为正方形似乎未与较短的边缘对齐。
mgri

1
多边形的边缘不一定是直角,这就是为什么边缘不能精确对齐的原因。而且它是用数字化工具旋转的,因此可能存在一些人为错误。尽管多边形的形状通常很规则,但它们并非全部为四边形。这就是为什么我一直认为最好使用最长的边缘来完成对齐的原因,因为相对的一面可能具有不同的方位。
Kingfisher


Answers:


3

如果从创建矢量网格Vector -> Research Tools -> Vector Grid,则可以指定旋转角度。

在此处输入图片说明


我在“矢量网格”工具中看不到旋转角度输入。这是32位Windows版本2.17.17。也许我缺少了一些东西。
jbgramm

我添加了图片。我正在使用2.14.18 64位窗口
neogeomat

角度值可以从另一层(例如在图形建模器中)提供吗?这看起来很有希望,但对于OP来说很繁琐,因为他有许多多边形。
JoshC

1
@JoshC它是2.14中ftools插件的一部分,由于支持2.18中的某些处理脚本而被撤消了。寻找C:\Program Files\QGIS Essen\apps\qgis-ltr\python\plugins\fTools\tools\doVectorGrid.py。奇怪的是,这未包含在QGIS 2.8中。
AndreJ

1
我为此添加了一个回归错误报告:issue.qgis.org/issues/18725
AndreJ '18

1

QGIS 2.18

由于@jbgramm对@neogeomat提供的答案进行了评论,因此我们没有在QGIS 2.18中看到矢量网格工具中的Rotation angle选项(2.18.15-17由@jbgramm检查,与2.18.18相同)。

剩下的就是GRASS v.mkgrid函数。

在此处输入图片说明

该角度是从北方逆时针方向测量的。因此,图-30中的生成了一个面向N30E的网格。


0

我也在QGIS 3中遇到了这个问题,并在堆栈溢出中找到了此解决方案

基本上,该想法是创建网格之前将角度应用于在其上定义了范围的多边形上。如果多边形不是矩形,则需要先根据多边形的范围创建一个图层,然后旋转它。然后,您可以根据此新范围创建网格,然后将多边形和网格旋转回原始的Polygon范围。所有这些都确保在两个图层中将相同的x,y坐标用作锚点。

#Define extent of Polygon
ext = QgsVectorLayer('path_to_polygon.shp', '', 'ogr' ).extent()
xmin = ext.xMinimum()
xmax = ext.xMaximum()
ymin = ext.yMinimum()
ymax = ext.yMaximum()
coords = "%f,%f,%f,%f" %(xmin, xmax, ymin, ymax)

#Define The angle of rotation. Change value to yours
azimut = 70.043

#define anchor point for rotation
anchor = "%f, %f" % (xmin, ymax)

#define x and y spacing of grid. Update to your desired spacing.
x = 3
y = 6

#create new polygon from extent
processing.run("native:extenttolayer", {'INPUT':coords,'OUTPUT':'Path_to_Output.shp'})

#Rotate Extent
processing.run("native:rotatefeatures", {'INPUT': 'Path_to_extent_Polygon.shp','ANGLE': azimut,'ANCHOR':anchor + '[EPSG:4326]','OUTPUT': 'Path_to_rotated_extent.shp'})

#Define extent of Rotated Polygon 
ext1 = QgsVectorLayer('Path_to_Rotated_Extent.shp', '', 'ogr' ).extent()
xmin1 = ext1.xMinimum()
xmax1 = ext1.xMaximum()
ymin1 = ext1.yMinimum()
ymax1 = ext1.yMaximum()
coords1 = "%f,%f,%f,%f" %(xmin1, xmax1, ymin1, ymax1)

#Create grid 
processing.run("qgis:creategrid", {'TYPE':0,'EXTENT': coords1 +'[EPSG:4326]','HSPACING':x,'VSPACING':y,'HOVERLAY':0,'VOVERLAY':0,'CRS':'EPSG:4326','OUTPUT': 'Path_to_grid.shp'})

#Rotate Grid to original extent
processing.run("native:rotatefeatures", {'INPUT': 'path_to_grid.shp','ANGLE': - 
azimut,'ANCHOR':rotate + '[EPSG:4326]','OUTPUT': 'path_to_rotated_grid.shp'})

# Clip Grid to Original Polygon
processing.run("native:clip", {'INPUT':'path_to_rotated_grid.shp','OVERLAY': 
'path_to_original_Polygon.shp','OUTPUT':'path_to_final_grid.shp'})
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.