Làm cách nào để tạo lưới bên trong đa giác được định hướng với cạnh dài nhất?


13

Tôi đã và đang sử dụng một quá trình gọi là "Tạo đa giác Graticule" để tạo lưới trong một đa giác với các thuộc tính hàng và cột được gán. Nó là một công cụ SAGA mà tôi đã chạy trong QGIS. Nó tạo ra một lưới dựa trên phạm vi của đa giác đầu vào với ô chạy N đến S và E đến W. Sẽ tốt hơn cho phân tích của tôi nếu hướng của lưới song song với cạnh dài nhất của đa giác. Để tham khảo tôi đã đính kèm hình ảnh của đầu ra tự động hiện tại và đầu ra mà tôi đã thay đổi bằng tay để căn chỉnh lưới với đa giác. Các lưới ban đầu bao phủ toàn bộ phạm vi của đa giác nhưng đã được cắt bớt để chỉ hiển thị các phần tế bào bên trong.

Đây là công cụ mặc định đưa ra Hình trên là những gì công cụ đặt ra theo mặc định.

nhập mô tả hình ảnh ở đây Đây là hình ảnh của lưới được chỉnh sửa thủ công để phù hợp với các tham số cần thiết.

Câu hỏi của tôi là, có cách nào để tạo ra các lưới được căn chỉnh như cái trong hình ảnh thứ hai theo kiểu tự động không? Tôi sẽ cần tạo lưới cho vài nghìn đa giác.


1
Các đa giác là hình chữ nhật hoặc đa giác chung có 4 cạnh? Tôi hỏi bạn điều này bởi vì các hình vuông dường như không được căn chỉnh với cạnh ngắn hơn.
mgri

1
Các cạnh của đa giác không nhất thiết phải là góc vuông, đó là lý do tại sao các cạnh không thẳng hàng chính xác. Ngoài ra, nó được quay với các công cụ số hóa nên có thể có một số lỗi của con người. Các đa giác không phải là tất cả bốn mặt mặc dù hình dạng thường khá đều đặn. Đây là lý do tại sao tôi nghĩ rằng việc căn chỉnh sẽ được thực hiện tốt nhất bằng cách sử dụng cạnh dài nhất, vì phía đối diện có thể sẽ có một phương hướng khác.
Chim bói cá


Câu trả lời:


3

Nếu bạn tạo lưới vector từ Vector -> Research Tools -> Vector Grid, bạn có thể chỉ định góc xoay.

nhập mô tả hình ảnh ở đây


Tôi không thấy đầu vào góc xoay có sẵn trong công cụ Vector Grid. Đây là phiên bản 2.18.17, Windows 32 bit. Có lẽ tôi đang thiếu một cái gì đó.
jbgramm

Tôi đã thêm hình ảnh. tôi đang sử dụng 2,14,18 cửa sổ 64 bit
neogeomat

Giá trị góc có thể được cung cấp từ một lớp khác, có lẽ trong bộ tạo mô hình đồ họa? Điều này có vẻ đầy hứa hẹn, nhưng tẻ nhạt đối với OP, vì anh ta có nhiều đa giác.
JoshC

1
@JoshC Đó là một phần của plugin ftools trong 2.14, đã bị loại bỏ để ủng hộ một số tập lệnh xử lý trong 2.18. Hãy tìm C:\Program Files\QGIS Essen\apps\qgis-ltr\python\plugins\fTools\tools\doVectorGrid.py. Điều kỳ lạ là điều này không được bao gồm trong QGIS 2.8.
AndreJ

1
Tôi đã thêm một báo cáo lỗi hồi quy cho nó: problems.qgis.org/issues/18725
AndreJ

1

Quốc tế 2.18

Như @jbgramm đã nhận xét câu trả lời được cung cấp bởi @neogeomat, chúng tôi không thấy Rotation angletùy chọn trong công cụ Vector Grid trong QGIS 2.18 (2.18.15-17 được kiểm tra bởi @jbgramm, và tương tự với 2.18.18).

Điều đó cho chúng ta chức năng GRASS v.mkgrid .

nhập mô tả hình ảnh ở đây

Góc được đo từ phía bắc, ngược chiều kim đồng hồ. Vì vậy, -30trong hình tạo ra một lưới định hướng đến N30E.


0

Tôi cũng gặp vấn đề này trong QGIS 3 và tìm thấy giải pháp này trong stack stack

Về cơ bản, ý tưởng sẽ là áp dụng góc trên đa giác mà phạm vi được xác định trước khi tạo lưới. Nếu đa giác của bạn không phải là hình chữ nhật, bạn sẽ cần tạo một lớp từ phạm vi đa giác của bạn trước đó, sau đó xoay nó. Sau đó, bạn có thể tạo lưới theo phạm vi mới này và sau đó xoay đa giác của bạn và lưới trở lại phạm vi Đa giác ban đầu. Tất cả điều này trong khi đảm bảo cùng tọa độ x, y được sử dụng làm điểm neo trong cả hai lớp.

#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'})
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.