Wie erstelle ich ein Gitter in einem Polygon, das an der längsten Seite ausgerichtet ist?


13

Ich habe einen Prozess namens "Create Polygon Graticule" verwendet, um ein Raster innerhalb eines Polygons mit zugewiesenen Zeilen- und Spaltenattributen zu erstellen. Es ist ein SAGA-Tool, das ich in QGIS ausgeführt habe. Es wird ein Gitter basierend auf der Ausdehnung des Eingabepolygons mit den Zellen N bis S und E bis W generiert. Für meine Analyse wäre es besser, wenn die Richtung des Gitters parallel zur längsten Kante des Polygons wäre. Als Referenz habe ich Bilder der aktuellen automatisierten Ausgabe und einer Ausgabe angehängt, die ich manuell geändert habe, um das Raster an dem Polygon auszurichten. Die Gitter umfassten ursprünglich die gesamte Ausdehnung des Polygons, wurden jedoch abgeschnitten, um nur die Zellteile anzuzeigen, die sich im Inneren befinden.

Dies ist das Standardwerkzeug, das ausgegeben wird Das obige Bild ist das, was das Tool standardmäßig ausgibt.

Bildbeschreibung hier eingeben Dies ist ein Bild eines Rasters, das manuell bearbeitet wurde, um den erforderlichen Parametern zu entsprechen.

Meine Frage ist, gibt es eine Möglichkeit, Raster wie das im zweiten Bild automatisch auszurichten? Ich muss Gitter für ein paar tausend Polygone erzeugen.


1
Sind die Polygone Rechtecke oder allgemeine Polygone mit 4 Kanten? Ich frage Sie das, weil die Quadrate nicht an der kürzeren Kante ausgerichtet zu sein scheinen.
Mi

1
Die Kanten der Polygone sind nicht unbedingt rechtwinklig, weshalb die Kanten nicht genau ausgerichtet sind. Es wurde auch mit Digitalisierungswerkzeugen gedreht, so dass möglicherweise ein menschlicher Fehler vorliegt. Die Polygone sind nicht alle vierseitig, obwohl die Formen im Allgemeinen ziemlich regelmäßig sind. Aus diesem Grund dachte ich, die Ausrichtung würde am besten mit der längsten Kante erfolgen, da die gegenüberliegende Seite wahrscheinlich eine andere Peilung hat.
Kingfisher


Antworten:


3

Wenn Sie ein Vektorraster aus erstellen Vector -> Research Tools -> Vector Grid, können Sie den Drehwinkel angeben.

Bildbeschreibung hier eingeben


Ich sehe keine Eingabe für den Drehwinkel im Vektorraster-Werkzeug. Dies ist in Version 2.18.17, 32-Bit-Windows. Vielleicht fehlt mir etwas.
Jbgramm

Ich habe das Bild hinzugefügt. Ich benutze 2.14.18 64-Bit-Windows
Neogeomat

Kann der Winkelwert von einer anderen Ebene geliefert werden, möglicherweise im grafischen Modellierer? Das sieht vielversprechend aus, ist aber für OP mühsam, da er viele Polygone hat.
JoshC

1
@JoshC Es war Teil des ftools-Plugins in 2.14, das in 2.18 zugunsten einiger Verarbeitungsskripte verworfen wurde. Suchen Sie nach C:\Program Files\QGIS Essen\apps\qgis-ltr\python\plugins\fTools\tools\doVectorGrid.py. Seltsamerweise war dies in QGIS 2.8 nicht enthalten.
AndreJ

1
Ich habe einen Bericht über einen Regressionsfehler hinzugefügt: issues.qgis.org/issues/18725
AndreJ

1

QGIS 2.18

Wie @jbgramm auf die Antwort von @neogeomat kommentiert hat, sehen wir in QGIS 2.18 keine Rotation angleOption im Vector Grid- Tool (2.18.15-17 von @jbgramm geprüft, und das Gleiche mit 2.18.18).

Das lässt uns mit der Funktion GRASS v.mkgrid .

Bildbeschreibung hier eingeben

Der Winkel wird von Norden gegen den Uhrzeigersinn gemessen. Das -30im Bild gezeigte Gitter erzeugt also ein Raster, das sich an N30E orientiert.


0

Ich bin auch in QGIS 3 auf dieses Problem gestoßen und habe diese Lösung im Stapelüberlauf gefunden

Grundsätzlich besteht die Idee darin, den Winkel auf das Polygon anzuwenden, auf dem die Ausdehnung definiert ist, bevor das Raster erstellt wird. Wenn Ihr Polygon kein Rechteck ist, müssen Sie zunächst eine Ebene aus der Ausdehnung Ihres Polygons erstellen und dann drehen. Dann können Sie das Raster entsprechend dieser neuen Ausdehnung erstellen und dann Ihr Polygon und das Raster wieder auf die ursprüngliche Ausdehnung des Polygons drehen. Dies alles, während sichergestellt wird, dass in beiden Ebenen dieselbe x, y-Koordinate als Ankerpunkt verwendet wird.

#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'})
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.