Como criar uma grade dentro de um polígono orientado com o lado mais longo?

13

Eu tenho usado um processo chamado "Criar gratícula de polígono" para criar uma grade dentro de um polígono com atributos de linha e coluna atribuídos. É uma ferramenta SAGA que eu tenho executado no QGIS. Ele gera uma grade com base na extensão do polígono de entrada com a célula executando N a S e E a W. Seria melhor para minha análise se a direção da grade fosse paralela à borda mais longa do polígono. Para referência, anexei imagens da saída automatizada atual e uma saída que eu alterei manualmente para alinhar a grade com o polígono. As grades originalmente cobriam toda a extensão do polígono, mas foram cortadas para mostrar apenas as partes da célula que estão dentro.

Esta é a ferramenta padrão lançada A imagem acima é o que a ferramenta coloca por padrão.

insira a descrição da imagem aqui Esta é uma imagem de uma grade que foi editada manualmente para ajustar os parâmetros necessários.

Minha pergunta é: existe uma maneira de produzir grades alinhadas, como a da segunda imagem, de maneira automatizada? Vou precisar gerar grades para alguns milhares de polígonos.

Martim-pescador
fonte
1
Os polígonos são retângulos ou polígonos gerais com 4 arestas? Eu pergunto isso porque os quadrados não parecem alinhados com a borda mais curta.
MGRI
1
As arestas dos polígonos não são necessariamente ângulos retos, e é por isso que as arestas não se alinham exatamente. Também foi rotacionada com ferramentas de digitalização para que possa haver algum erro humano presente. Os polígonos não são de quatro lados, embora as formas sejam geralmente bastante regulares. É por isso que eu estava pensando que o alinhamento seria melhor usando a borda mais longa, pois o lado oposto provavelmente terá um rolamento diferente.
Kingfisher
Talvez relacionado: gis.stackexchange.com/questions/210461/…
AndreJ

Respostas:

3

Se você criar uma grade de vetor Vector -> Research Tools -> Vector Grid, poderá especificar o ângulo de rotação.

insira a descrição da imagem aqui

neogeomat
fonte
Não vejo uma entrada de ângulo de rotação disponível na ferramenta Grade de vetores. Isso está na versão 2.18.17, Windows de 32 bits. Talvez esteja faltando alguma coisa.
jbgramm
Eu adicionei a foto. Eu estou usando 2.14.18 64 bits do Windows
neogeomat
O valor do ângulo pode ser fornecido a partir de outra camada, talvez no modelador gráfico? Isso parece promissor, mas tedioso para OP, pois ele tem muitos polígonos.
JoshC
1
@ JoshC Era parte do plugin ftools na 2.14, que foi descartado em favor de alguns scripts de processamento na 2.18. Procure C:\Program Files\QGIS Essen\apps\qgis-ltr\python\plugins\fTools\tools\doVectorGrid.py. Estranhamente, isso não foi incluído no QGIS 2.8.
Andrej
1
Eu adicionei um relatório de bug de regressão para ele: issues.qgis.org/issues/18725
Andrej
1

QGIS 2.18

Como o @jbgramm comentou a resposta fornecida pelo @neogeomat, não vemos a Rotation angleopção Vector Grid na ferramenta QGIS 2.18 (2.18.15-17 verificada pelo @jbgramm e o mesmo com o 2.18.18).

Isso nos deixa com a função GRASS v.mkgrid .

insira a descrição da imagem aqui

O ângulo é medido a partir do norte, no sentido anti-horário. Portanto -30, a figura produz uma grade orientada para N30E.

Kazuhito
fonte
0

Eu também encontrei esse problema no QGIS 3 e encontrei esta solução no estouro de pilha

Basicamente, a idéia seria aplicar o ângulo no polígono no qual a extensão é definida antes de criar a grade. Se o seu polígono não for um retângulo, você precisará criar uma camada a partir da extensão do seu polígono antes e girá-la. Em seguida, você pode criar a grade de acordo com essa nova extensão e, em seguida, gire o polígono e a grade de volta à extensão original do polígono. Tudo isso enquanto garante que a mesma coordenada x, y seja usada como ponto de ancoragem nas duas camadas.

#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.
fonte