Jak utworzyć siatkę wewnątrz wielokąta, który jest zorientowany najdłuższym bokiem?

13

Korzystam z procesu o nazwie „Utwórz siatkę wielokąta”, aby utworzyć siatkę w wielokącie z przypisanymi atrybutami wierszy i kolumn. To narzędzie SAGA, które uruchomiłem w QGIS. Generuje siatkę na podstawie zasięgu wielokąta wejściowego z komórką biegnącą od N do S i od E do W. Lepiej byłoby dla mojej analizy, gdyby kierunek siatki był równoległy do ​​najdłuższej krawędzi wielokąta. W celach informacyjnych dołączyłem obrazy bieżącego zautomatyzowanego wyjścia i dane wyjściowe, które ręcznie zmodyfikowałem, aby wyrównać siatkę z wielokątem. Siatki pierwotnie obejmowały cały zasięg wielokąta, ale zostały przycięte, aby pokazać tylko te części komórki, które są w środku.

Jest to domyślne narzędzie Powyższe zdjęcie domyślnie umieszcza narzędzie.

wprowadź opis zdjęcia tutaj Jest to obraz siatki edytowanej ręcznie w celu dopasowania niezbędnych parametrów.

Moje pytanie brzmi: czy istnieje sposób na automatyczne tworzenie siatek, które są wyrównane, na przykład na drugim obrazie? Będę musiał wygenerować siatki dla kilku tysięcy wielokątów.

Zimorodek
źródło
1
Czy wielokąty są prostokątami czy ogólnymi wielokątami o 4 krawędziach? Proszę o to, ponieważ kwadraty wydają się nie być wyrównane do krótszej krawędzi.
mgri
1
Krawędzie wielokątów niekoniecznie są ustawione pod kątem prostym, dlatego krawędzie nie są dokładnie wyrównane. Również został obrócony za pomocą narzędzi do digitalizacji, więc może występować błąd ludzki. Wieloboki nie są wszystkie czterostronne, chociaż kształty są zazwyczaj dość regularne. Właśnie dlatego myślałem, że wyrównanie najlepiej byłoby wykonać przy użyciu najdłuższej krawędzi, ponieważ strona przeciwna prawdopodobnie będzie miała inne łożysko.
Kingfisher
powiązane: gis.stackexchange.com/q/30988/66673
Kingfisher
Być może powiązane: gis.stackexchange.com/questions/210461/…
AndreJ

Odpowiedzi:

3

Jeśli utworzysz siatkę wektorową Vector -> Research Tools -> Vector Grid, możesz określić kąt obrotu.

wprowadź opis zdjęcia tutaj

neogeomat
źródło
Nie widzę wejścia kąta obrotu dostępnego w narzędziu Siatka wektorowa. To jest w wersji 2.18.17, 32-bitowy system Windows. Może czegoś mi brakuje.
jbgramm
Dodałem zdjęcie. Używam 64-bitowego systemu Windows
2.14.18
Czy wartość kąta można podać z innej warstwy, być może w graficznym modelerze? To wygląda obiecująco, ale nużąco dla OP, ponieważ ma wiele wielokątów.
JoshC,
1
@JoshC To była część wtyczki ftools w 2.14, która została odrzucona na rzecz niektórych skryptów przetwarzających w 2.18. Szukać C:\Program Files\QGIS Essen\apps\qgis-ltr\python\plugins\fTools\tools\doVectorGrid.py. O dziwo nie zostało to uwzględnione w QGIS 2.8.
AndreJ
1
Dodałem do niego raport o błędzie regresji: problems.qgis.org/issues/18725
AndreJ
1

QGIS 2.18

Ponieważ @jbgramm skomentował odpowiedź udzieloną przez @neogeomat, nie widzimy Rotation angleopcji w narzędziu Vector Grid w QGIS 2.18 (2.18.15-17 sprawdzone przez @jbgramm, i to samo z 2.18.18).

To pozostawia nam funkcję GRASS v.mkgrid .

wprowadź opis zdjęcia tutaj

Kąt jest mierzony od północy w kierunku przeciwnym do ruchu wskazówek zegara. Więc -30na rysunku tworzy siatkę zorientowany N30E.

Kazuhito
źródło
0

Natrafiłem również na ten problem w QGIS 3 i znalazłem to rozwiązanie w przypadku przepełnienia stosu

Zasadniczo ideą byłoby zastosowanie kąta na wielokącie, na którym zdefiniowano zasięg, przed utworzeniem siatki. Jeśli twój wielokąt nie jest prostokątem, musisz wcześniej utworzyć warstwę z jej zasięgu, a następnie obrócić ją. Następnie możesz utworzyć siatkę zgodnie z tym nowym zakresem, a następnie obrócić wielokąt i siatkę z powrotem do pierwotnego zasięgu. Wszystko to, upewniając się, że ta sama współrzędna x, y jest używana jako punkt kontrolny w obu warstwach.

#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.
źródło