Як створити сітку всередині багатокутника, орієнтованого на найдовшу сторону?


13

Я використовував процес під назвою "Створити полігонову гратикуле" для створення сітки в полігоні з присвоєними атрибутами рядків та стовпців. Це інструмент SAGA, який я працював у QGIS. Він генерує сітку на основі ступеня вхідного многокутника, у якому комірка працює від N до S та від E до W. Було б краще для мого аналізу, якби напрямок сітки був паралельним найдовшому краю багатокутника. Для довідки я додав зображення поточного автоматизованого виводу та вихід, який я вручну змінив, щоб вирівняти сітку з багатокутником. Сітки спочатку охоплювали всю протяжність багатокутника, але були вирізані, щоб показати лише ті клітинні частини, які знаходяться всередині.

Це інструмент за замовчуванням, поставлений Зображення вгорі - це те, що інструмент ставить за замовчуванням.

введіть тут опис зображення Це зображення сітки, яку редагували вручну, щоб відповідати необхідним параметрам.

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


1
Чи багатокутники є прямокутниками або загальними багатокутниками з 4 ребрами? Я прошу вас про це, тому що квадрати, здається, не вирівняні до більш короткого краю.
mgri

1
Краї багатокутників не обов'язково мають прямий кут, тому краї не вирівнюються точно. Крім того, він був повернутий за допомогою засобів оцифрування, так що може бути якась помилка людини. Багатокутники не всі чотиристоронні, хоча форми, як правило, досить регулярні. Ось чому я думав, що вирівнювання найкраще буде виконати за допомогою найдовшого краю, оскільки сторона навпроти, швидше за все, матиме інше опору.
Кінгфішер


Можливо, пов’язане з цим: gis.stackexchange.com/questions/210461/…
AndreJ

Відповіді:


3

Якщо створити векторну сітку з Vector -> Research Tools -> Vector Grid, можна вказати кут повороту.

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


Я не бачу входу кута повороту, доступного в інструменті 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
Для цього я додав звіт про помилку регресії: issues.qgis.org/isissue/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 і знайшов це рішення в переповненні стека

В основному ідея полягала б у застосуванні кута на полігон, на який визначено міру перед створенням сітки. Якщо ваш багатокутник не є прямокутником, вам потрібно буде створити шар із обсягу вашого багатокутника до цього, а потім повернути його. Тоді ви можете створити сітку відповідно до цієї нової міри, а потім повернути багатокутник і сітку назад до початкової міри багатокутника. Все це, переконуючись, що однакова координата x, y використовується як опорна точка в обох шарах.

#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'})
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.