¿Cómo crear una cuadrícula dentro de un polígono que está orientado con el lado más largo?


13

He estado usando un proceso llamado "Crear retícula de polígono" para crear una cuadrícula dentro de un polígono con atributos de fila y columna asignados. Es una herramienta SAGA que he estado ejecutando en QGIS. Genera una cuadrícula basada en la extensión del polígono de entrada con la celda que va de N a S y de E a W. Sería mejor para mi análisis si la dirección de la cuadrícula fuera paralela al borde más largo del polígono. Como referencia, adjunté imágenes de la salida automatizada actual y una salida que modifiqué manualmente para alinear la cuadrícula con el polígono. Las cuadrículas cubrían originalmente toda la extensión del polígono, pero se han recortado para mostrar solo las partes de la celda que están dentro.

Esta es la herramienta predeterminada puesta fuera La imagen de arriba es lo que la herramienta pone por defecto.

ingrese la descripción de la imagen aquí Esta es una imagen de una cuadrícula que se editó manualmente para ajustarse a los parámetros necesarios.

Mi pregunta es, ¿hay alguna manera de producir cuadrículas que estén alineadas como la de la segunda imagen de manera automatizada? Necesitaré generar cuadrículas para unos pocos miles de polígonos.


1
¿Los polígonos son rectángulos o polígonos generales con 4 aristas? Te pregunto esto porque los cuadrados no parecen estar alineados con el borde más corto.
mgri

1
Los bordes de los polígonos no son necesariamente ángulos rectos, por lo que los bordes no se alinean exactamente. También se rotó con herramientas de digitalización, por lo que puede haber algún error humano presente. Los polígonos no tienen los cuatro lados, aunque las formas son generalmente bastante regulares. Es por eso que estaba pensando que la alineación se haría mejor usando el borde más largo, ya que el lado opuesto probablemente tendrá un rumbo diferente.
Kingfisher


Respuestas:


3

Si crea una cuadrícula vectorial desde Vector -> Research Tools -> Vector Grid, puede especificar el ángulo de rotación.

ingrese la descripción de la imagen aquí


No veo una entrada de ángulo de rotación disponible en la herramienta Vector Grid. Esto está en la versión 2.18.17, Windows de 32 bits. Tal vez me estoy perdiendo algo.
jbgramm

Agregué la foto. estoy usando 2.14.18 ventanas de 64 bits
neogeomat

¿Se puede suministrar el valor del ángulo desde otra capa, tal vez en el modelador gráfico? Esto parece prometedor, pero tedioso para OP, ya que tiene muchos polígonos.
JoshC

1
@JoshC Era parte del complemento ftools en 2.14, que fue descartado a favor de algunos scripts de procesamiento en 2.18. Busque C:\Program Files\QGIS Essen\apps\qgis-ltr\python\plugins\fTools\tools\doVectorGrid.py. Curiosamente, esto no se incluyó en QGIS 2.8.
AndreJ


1

QGIS 2.18

Como @jbgramm comentó la respuesta proporcionada por @neogeomat, no vemos la Rotation angleopción en la herramienta Vector Grid en QGIS 2.18 (2.18.15-17 verificado por @jbgramm, y lo mismo con 2.18.18).

Eso nos deja con la función GRASS v.mkgrid .

ingrese la descripción de la imagen aquí

El ángulo se mide desde el norte, en sentido antihorario. Entonces, -30en la imagen se produce una cuadrícula orientada a N30E.


0

También me encontré con este problema en QGIS 3 y encontré esta solución en el desbordamiento de la pila

Básicamente, la idea sería aplicar el ángulo en el polígono en el que se define la extensión antes de crear la cuadrícula. Si su polígono no es un rectángulo, necesitaría crear una capa a partir de la extensión de su polígono antes y luego rotarla. Luego puede crear la cuadrícula de acuerdo con esta nueva extensión y luego girar su polígono y la cuadrícula nuevamente a la extensión del Polígono original. Todo esto mientras se asegura de que se use la misma coordenada x, y como punto de anclaje en ambas capas.

#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'})
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.