Come creare una griglia all'interno di un poligono orientato con il lato più lungo?


13

Ho usato un processo chiamato "Crea poligono grigliato" per creare una griglia all'interno di un poligono con attributi di riga e colonna assegnati. È uno strumento SAGA che ho eseguito in QGIS. Genera una griglia basata sull'estensione del poligono di input con la cella che corre da N a S e da E a W. Sarebbe meglio per la mia analisi se la direzione della griglia fosse parallela al bordo più lungo del poligono. Per riferimento ho allegato immagini dell'attuale output automatizzato e un output che ho modificato manualmente per allineare la griglia al poligono. Le griglie originariamente coprivano l'intera estensione del poligono, ma sono state ritagliate per mostrare solo le parti cellulari che sono all'interno.

Questo è lo strumento predefinito messo fuori L'immagine sopra è ciò che lo strumento mette di default.

inserisci qui la descrizione dell'immagine Questa è l'immagine di una griglia che è stata modificata manualmente per adattarsi ai parametri necessari.

La mia domanda è: esiste un modo per produrre griglie allineate come quella della seconda immagine in modo automatizzato? Avrò bisogno di generare griglie per alcune migliaia di poligoni.


1
I poligoni sono rettangoli o poligoni generali con 4 spigoli? Ti chiedo questo perché i quadrati non sembrano essere allineati al bordo più corto.
mgri,

1
I bordi dei poligoni non sono necessariamente angoli retti, motivo per cui i bordi non si allineano esattamente. Inoltre è stato ruotato con strumenti di digitalizzazione, quindi potrebbe esserci qualche errore umano presente. I poligoni non sono tutti e quattro i lati sebbene le forme siano generalmente piuttosto regolari. Questo è il motivo per cui pensavo che l'allineamento sarebbe stato meglio usando il bordo più lungo, poiché il lato opposto avrà probabilmente un cuscinetto diverso.
Martin pescatore,


Risposte:


3

Se si crea una griglia vettoriale da Vector -> Research Tools -> Vector Grid, è possibile specificare l'angolo di rotazione.

inserisci qui la descrizione dell'immagine


Non vedo un input dell'angolo di rotazione disponibile nello strumento Griglia vettoriale. Questo è nella versione 2.18.17, Windows a 32 bit. Forse mi manca qualcosa.
jbgramm,

Ho aggiunto la foto. sto usando Windows 2.14.18 a 64 bit
neogeomat

Il valore dell'angolo può essere fornito da un altro livello, forse nel modellatore grafico? Sembra promettente, ma noioso per OP, poiché ha molti poligoni.
JoshC,

1
@JoshC Faceva parte del plugin ftools in 2.14, che è stato respinto a favore di alcuni script di elaborazione in 2.18. Cercare C:\Program Files\QGIS Essen\apps\qgis-ltr\python\plugins\fTools\tools\doVectorGrid.py. Stranamente questo non è stato incluso in QGIS 2.8.
AndreJ,

1
Ho aggiunto un rapporto sui bug di regressione per questo: issues.qgis.org/issues/18725
AndreJ

1

QGIS 2.18

Come @jbgramm ha commentato la risposta fornita da @neogeomat, non vediamo l' Rotation angleopzione nello strumento Griglia vettoriale in QGIS 2.18 (2.18.15-17 controllato da @jbgramm e lo stesso con 2.18.18).

Questo ci lascia con la funzione GRASS v.mkgrid .

inserisci qui la descrizione dell'immagine

L'angolo viene misurato da nord, in senso antiorario. Quindi l' -30immagine nella figura produce una griglia orientata a N30E.


0

Ho anche riscontrato questo problema in QGIS 3 e ho trovato questa soluzione in overflow dello stack

Fondamentalmente l'idea sarebbe quella di applicare l'angolo sul poligono su cui è definita l'estensione prima di creare la griglia. Se il poligono non è un rettangolo, è necessario creare un livello dall'estensione del poligono precedente, quindi ruotarlo. Quindi è possibile creare la griglia in base a questa nuova estensione e quindi ruotare il poligono e la griglia di nuovo all'estensione originale del poligono. Tutto questo assicurandosi che la stessa coordinata x, y sia utilizzata come punto di ancoraggio in entrambi i livelli.

#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'})
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.