Comment créer une grille à l'intérieur d'un polygone orienté avec le côté le plus long?

13

J'utilise un processus appelé "Créer une grille de polygones" pour créer une grille dans un polygone avec des attributs de ligne et de colonne attribués. Il s'agit d'un outil SAGA que j'utilisais dans QGIS. Il génère une grille basée sur l'étendue du polygone d'entrée avec la cellule exécutant N à S et E à W. Il serait préférable pour mon analyse si la direction de la grille était parallèle au bord le plus long du polygone. Pour référence, j'ai joint des images de la sortie automatisée actuelle et une sortie que j'ai modifiée manuellement pour aligner la grille avec le polygone. Les grilles couvraient à l'origine toute l'étendue du polygone mais ont été découpées pour n'afficher que les parties de cellule qui se trouvent à l'intérieur.

Il s'agit de l'outil par défaut L'image ci-dessus est ce que l'outil sort par défaut.

entrez la description de l'image ici Il s'agit d'une image d'une grille qui a été modifiée manuellement pour s'adapter aux paramètres nécessaires.

Ma question est la suivante: existe-t-il un moyen de produire des grilles alignées telles que celle de la deuxième image de manière automatisée? Je devrai générer des grilles pour quelques milliers de polygones.

Kingfisher
la source
1
Les polygones sont-ils des rectangles ou des polygones généraux à 4 arêtes? Je vous pose cette question car les carrés ne semblent pas alignés sur le bord le plus court.
mgri
1
Les bords des polygones ne sont pas nécessairement des angles droits, c'est pourquoi les bords ne s'alignent pas exactement. De plus, il a été tourné avec des outils de numérisation, il peut donc y avoir une erreur humaine. Les polygones ne sont pas tous à quatre côtés bien que les formes soient généralement assez régulières. C'est pourquoi je pensais que l'alignement se ferait mieux en utilisant le bord le plus long, car le côté opposé aura probablement un roulement différent.
Kingfisher
en relation: gis.stackexchange.com/q/30988/66673
Kingfisher

Réponses:

3

Si vous créez une grille vectorielle à partir de Vector -> Research Tools -> Vector Grid, vous pouvez spécifier l'angle de rotation.

entrez la description de l'image ici

neogeomat
la source
Je ne vois pas d'entrée d'angle de rotation disponible dans l'outil Grille vectorielle. Il s'agit de la version 2.18.17, Windows 32 bits. Peut-être que je manque quelque chose.
jbgramm
J'ai ajouté la photo. j'utilise des fenêtres 64 bits
2.14.18
La valeur d'angle peut-elle être fournie à partir d'une autre couche, peut-être dans le modeleur graphique? Cela semble prometteur, mais fastidieux pour OP, car il a de nombreux polygones.
JoshC
1
@JoshC Il faisait partie du plugin ftools en 2.14, qui a été rejeté en faveur de certains scripts de traitement en 2.18. Cherchez C:\Program Files\QGIS Essen\apps\qgis-ltr\python\plugins\fTools\tools\doVectorGrid.py. Étrangement, cela n'était pas inclus dans QGIS 2.8.
AndreJ
1
J'ai ajouté un rapport de bogue de régression pour cela: issues.qgis.org/issues/18725
AndreJ
1

QGIS 2.18

Comme @jbgramm a commenté la réponse fournie par @neogeomat, nous ne voyons pas d' Rotation angleoption dans l' outil Vector Grid dans QGIS 2.18 (2.18.15-17 vérifié par @jbgramm, et la même chose avec 2.18.18).

Cela nous laisse avec la fonction GRASS v.mkgrid .

entrez la description de l'image ici

L'angle est mesuré à partir du nord, dans le sens antihoraire. Ainsi, -30dans l'image produit une grille orientée vers N30E.

Kazuhito
la source
0

J'ai également rencontré ce problème dans QGIS 3 et j'ai trouvé cette solution dans le débordement de pile

Fondamentalement, l'idée serait d'appliquer l'angle sur le polygone sur lequel l'étendue est définie avant de créer la grille. Si votre polygone n'est pas un rectangle, vous devez auparavant créer une couche à partir de l'étendue de votre polygone, puis la faire pivoter. Vous pouvez ensuite créer la grille en fonction de cette nouvelle étendue, puis faire pivoter votre polygone et la grille vers l'étendue d'origine du polygone. Tout cela en vous assurant que la même coordonnée x, y est utilisée comme point d'ancrage dans les deux couches.

#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'})
BC B.
la source