Как создать сетку внутри многоугольника, ориентированного с самой длинной стороны?

13

Я использовал процесс «Создание полигональной сетки» для создания сетки внутри полигона с назначенными атрибутами строки и столбца. Это инструмент SAGA, который я использовал в QGIS. Он генерирует сетку на основе экстента входного многоугольника с ячейкой, бегущей от N до S и от E до W. Было бы лучше для моего анализа, если бы направление сетки было параллельным самому длинному краю многоугольника. Для справки я приложил изображения текущего автоматического вывода и вывода, которые я вручную изменил, чтобы выровнять сетку с полигоном. Сетки изначально покрывали весь экстент многоугольника, но были обрезаны, чтобы показать только те части ячейки, которые находятся внутри.

Это инструмент по умолчанию Выше изображения это то, что выводит инструмент по умолчанию.

введите описание изображения здесь Это изображение сетки, которая была отредактирована вручную, чтобы соответствовать необходимым параметрам.

Мой вопрос заключается в том, есть ли способ создания сеток, которые выровнены, например, как на втором изображении, в автоматическом режиме? Мне нужно будет создать сетки для нескольких тысяч полигонов.

Зимородок
источник
1
Являются ли полигоны прямоугольниками или обычными полигонами с 4 ребрами? Я спрашиваю вас об этом, потому что квадраты, кажется, не выровнены по более короткому краю.
Мгри
1
Края многоугольников не обязательно являются прямыми углами, поэтому края не выровнены точно. Кроме того, он вращался с помощью инструментов оцифровки, поэтому может быть какая-то человеческая ошибка. Полигоны не все четырехсторонние, хотя формы, как правило, довольно правильные. Вот почему я подумал, что выравнивание лучше всего выполнить, используя самый длинный край, так как противоположная сторона, вероятно, будет иметь другой подшипник.
Зимородок
связанные: gis.stackexchange.com/q/30988/66673
Kingfisher
Может быть связано: gis.stackexchange.com/questions/210461/…
AndreJ

Ответы:

3

Если вы создаете векторную сетку из Vector -> Research Tools -> Vector Grid, вы можете указать угол поворота.

введите описание изображения здесь

neogeomat
источник
Я не вижу ввода угла поворота, доступного в инструменте Vector Grid. Это в версии 2.18.17, 32-битная Windows. Может быть, я что-то упустил.
Jbgramm
Я добавил картинку. я использую 2.14.18 64-битные окна
neogeomat
Может ли значение угла быть получено из другого слоя, возможно, в графическом моделе? Это выглядит многообещающе, но утомительно для ОП, поскольку у него много полигонов.
JoshC
1
@JoshC Он был частью плагина ftools в 2.14, который был отклонен в пользу некоторых скриптов обработки в 2.18. Ищите C:\Program Files\QGIS Essen\apps\qgis-ltr\python\plugins\fTools\tools\doVectorGrid.py. Странно это не было включено в QGIS 2.8.
AndreJ
1
Я добавил отчет об ошибке регрессии для него: questions.qgis.org/issues/18725
AndreJ
1

QGIS 2.18

Как @jbgramm прокомментировал ответ, предоставленный @neogeomat, мы не видим Rotation angleопцию в инструменте Vector Grid в QGIS 2.18 (2.18.15-17 проверено @jbgramm, и то же самое с 2.18.18).

Это оставляет нас с функцией GRASS v.mkgrid .

введите описание изображения здесь

Угол измеряется с севера, против часовой стрелки. Таким образом, на -30рисунке создается сетка, ориентированная на N30E.

Казухито
источник
0

Я также столкнулся с этой проблемой в QGIS 3 и нашел это решение в переполнении стека

По сути, идея состоит в том, чтобы применить угол к многоугольнику, на котором определяется экстент, перед созданием сетки. Если ваш полигон не является прямоугольником, вам нужно создать слой из экстента вашего полигона, а затем повернуть его. Затем вы можете создать сетку в соответствии с этим новым экстентом, а затем повернуть полигон и сетку обратно к исходному экстенту полигона. Все это, удостоверившись в тех же х, у координат используется в качестве опорной точки в обоих слоях.

#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'})
До н.э.
источник