Lập trình tìm các đa giác có> 90% chồng chéo bởi một lớp đa giác vector khác bằng cách sử dụng QGIS?


9

Các lớp ví dụ

Tôi đang cố gắng tìm ra cách sử dụng python để trích xuất các đa giác trong một vectơ bị chồng chéo> 90% bởi một vectơ khác. Sau đó tôi muốn có một vectơ / bản đồ sẽ chỉ hiển thị các đa giác đó. Hình ảnh ví dụ cho thấy các lớp của tôi. Tôi muốn tất cả các đa giác màu xám có màu đỏ> 90%.

Tôi cần phải làm tất cả điều này thông qua python (hoặc các phương thức tự động tương tự). Tôi có ~ 1000 bản đồ để xử lý theo cùng một cách.


Bạn muốn thực hiện một lớp phủ 'union' (xem infogeoblog.wordpress.com/2013/01/08/geo- Processing-in-qgis cho một số điều cơ bản) sau đó cho mỗi đa giác ban đầu tính toán thống kê 'trong' và 'out' gis.stackexchange.com/questions/43037/ để xác định tỷ lệ phần trăm lớp phủ ... gợi ý: bạn cần phải có số đo diện tích gis.stackexchange.com/questions/23355/ trộm
Michael

Cảm ơn vì những lời khuyên. Đó là cách tiếp cận tương tự mà tôi đang cố gắng. Tôi có thể thực hiện liên minh thông qua bảng điều khiển python đủ dễ dàng. Đã được thêm vào trong các giá trị thuộc tính khu vực. Đây là bước tiếp theo tôi không chắc chắn. Làm cách nào để tôi sử dụng python để tính toán thống kê 'vào' và 'ra' để tôi có thể xác định / chọn / clip, v.v.> 90% đa giác?
dnormous

Tôi nghĩ rằng nó có thể mà không cần trăn. Bạn có cần python tuyệt đối hoặc một giải pháp với các lớp ảo là tốt cho bạn?
Pierma

Các khu vực 'trong' sẽ có các thuộc tính từ cả hai đa giác, các khu vực 'ngoài' chỉ có các thuộc tính từ một bộ đa giác. Nhận cả hai bộ thống kê khu vực và tham gia trở lại đa giác ban đầu, thêm trường cho 'vào', 'ra' và phủ sóng, tính toán các giá trị cho 'trong' và 'ra' từ tổng các khu vực sau đó chia 'trong' cho khu vực ban đầu (hoặc 'trong' + 'ra') để tính phần trăm.
Michael Promotionson

1
Pierma - Tôi chỉ cần một phương pháp tự động để tìm các đa giác.
đáng ghét

Câu trả lời:


3

Mã tiếp theo hoạt động trong Bảng điều khiển Python của QGIS. Nó tạo ra một lớp bộ nhớ với các đa giác> 90% bị chồng chéo bởi các vùng màu đỏ.

mapcanvas = iface.mapCanvas()

layers = mapcanvas.layers()

#for polygon_intersects
feats_lyr1 = [ feat for feat in layers[0].getFeatures() ]

#for xwRcl
feats_lyr2 = [ feat for feat in layers[1].getFeatures() ]

selected_feats = []

for i, feat1 in enumerate(feats_lyr1):
    area1 = 0
    area2 = 0
    for j, feat2 in enumerate(feats_lyr2):
        if feat1.geometry().intersects(feat2.geometry()):
            area = feat1.geometry().intersection(feat2.geometry()).area()
            print i, j, area, feat2.attribute('class')
            if feat2.attribute('class') == 1:
                area1 += area
            else:
                area2 += area
    crit = area1/(area1 + area2)
    print crit
    if crit > 0.9:
        selected_feats.append(feat1)

epsg = layers[0].crs().postgisSrid()

uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           "mem_layer",
                           "memory")

prov = mem_layer.dataProvider()

for i, feat in enumerate(selected_feats):
    feat.setAttributes([i])

prov.addFeatures(selected_feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

Tôi đã thử mã với hai lớp vector này:

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

Sau khi chạy mã tại Bảng điều khiển Python của QGIS, để chứng thực kết quả, đã in các chỉ mục i, j của các tính năng liên quan, vùng giao nhau, thuộc tính của trường trong polygons_intersects (1 cho vùng màu đỏ và 2 cho vùng màu xám) và tiêu chí chồng chéo .

0 0 9454207.56892 1
0 1 17429206.7906 2
0 2 10326705.2376 2
0 4 40775341.6814 1
0 5 26342803.0964 2
0 7 11875753.3216 2
0.432253120382
1 6 1198411.02558 2
1 7 1545489.96614 2
1 10 27511427.9909 1
0.90930850584
2 7 750262.940888 2
2 8 12012343.5859 1
0.941213972294
3 6 23321277.5158 2
0.0

Lớp bộ nhớ đã tạo (tính năng xanh) có thể được quan sát ở hình ảnh tiếp theo. Nó đã được như mong đợi.

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


6

Đây là một giải pháp không cần trăn.

Thêm một lớp ảo mới với một truy vấn như:

WITH r AS (
SELECT 
    Basins800.rowid AS idGray, 
    area(Basins800.geometry) AS areaGray, 
    area(Intersection(Basins800.geometry, Severity.geometry)) AS aeraInter, 
    Basins800.geometry AS geomGray 
  FROM Basins800, Severity
)

SELECT *, areaInterSum/areaGray  AS overlap , geomGray 
    FROM (
        SELECT 
           idGray, 
           areaGray, 
           sum(areaInter) AS areaInterSum, 
           geomGray 
        FROM r 
        GROUP BY idGray) 
     WHERE areaInterSum/areaGray > 0.9

Với :

  • Basins800 là lớp bạn muốn lọc với đa giác màu xám

  • Mức độ nghiêm trọng: lớp màu đỏ của bạn chồng chéo.

Kết quả sẽ là một lớp mới chỉ có tất cả các plolygons xám> 90% bị chồng chéo bởi các đa giác màu đỏ, với một trường mới chứa phần trăm trùng lặp.

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

Hy vọng điều này làm việc. Tôi có thể thêm chi tiết về truy vấn nếu cần.

Lưu ý: Dữ liệu của bạn chứa các đa giác rất nhỏ (đến từ quá trình xử lý raster của bạn và tương ứng với pixel raster (trên ảnh, chúng ta có thể thấy 4 đa giác nhưng có 25 đa giác nhỏ khác). Điều này làm cho truy vấn rất chậm để thực hiện tạo một tính năng cho mỗi cặp tính năng từ hai lớp).


Tôi gặp lỗi khi chạy truy vấn thông qua nút 'tạo lớp ảo'. "Lỗi thực thi truy vấn trên CREATE TEMP XEM _tview AS VỚI r AS (" .... phần còn lại của mã ở đây ... theo sau: "1 - gần" VỚI ": lỗi cú pháp" Tôi khá mới đối với QGIS. Tôi có thể tạo lớp ảo này programatically Nhờ sự giúp đỡ của bạn?!
dnormous

Đây là một liên kết để tải xuống các shapefiles: link
dnormous

Xin lỗi, một bản sao xấu giữa màu xám và màu xám (xin lỗi vì tiếng Anh apro xấp xỉ của tôi). Tôi đã chỉnh sửa truy vấn. Nó nên hoạt động ngay bây giờ. Tại sao bạn muốn tạo lớp progamatically? Ưu điểm của lớp ảo là không phá hủy và nếu bạn chỉnh sửa dữ liệu của mình (đa giác màu xám hoặc đỏ), lớp ảo sẽ tự động cập nhật.
Pierma

Đây chỉ là một phần nhỏ của quá trình. Tôi có ~ 1000 bản đồ này để làm, vì vậy tự động hóa quá trình sẽ vô cùng hữu ích.
đáng sợ

Tôi vẫn nhận được cùng một lỗi -> "1 - gần" VỚI ": lỗi cú pháp". Tôi đã cắm tên cục bộ cho từng lớp cho GrayLayer và redLayer. Là tên địa phương những gì tôi nên được sử dụng? tức là: lớp màu xám được gắn nhãn là "Basins_800", vì vậy tôi có mã như "Basins_800.geometry"
dnormous

2

Sau khi thấy liên kết đến các shapefile SeverityBasins800 , tôi có thể hiểu được công cụ địa lý cần thiết. Tôi đã sửa đổi mã trong:

Lập trình tìm các đa giác có> 90% chồng chéo bởi một lớp đa giác vector khác bằng cách sử dụng QGIS?

để có được cái này:

mapcanvas = iface.mapCanvas()

layers = mapcanvas.layers()

#for Severity
feats_lyr1 = [ feat for feat in layers[0].getFeatures() ]

#for Basins800
feats_lyr2 = [ feat for feat in layers[1].getFeatures() ]

selected_feats = []

print "processing..."

for i, feat1 in enumerate(feats_lyr1):
    for j, feat2 in enumerate(feats_lyr2):
        if feat1.geometry().intersects(feat2.geometry()):
            area1 = feat1.geometry().intersection(feat2.geometry()).area()
            area2 = feat1.geometry().area()
            print i, j, area1, area2
    crit = area1/area2
    print crit
    if crit > 0.9:
        selected_feats.append(feat1)

epsg = layers[0].crs().postgisSrid()

uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           "mem_layer",
                           "memory")

prov = mem_layer.dataProvider()

for i, feat in enumerate(selected_feats):
    feat.setAttributes([i])

prov.addFeatures(selected_feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

Sau khi chạy mã, với các shapefiles này trong Bảng điều khiển Python của QGIS, trong vài phút tôi đã nhận được kết quả tương tự như Pierma ; trong đó lớp bộ nhớ có 31 tính năng (khác với 29 đa giác có được của anh ta).

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

Tôi sẽ không gỡ lỗi kết quả vì có 1901 * 3528 = 6706728 tương tác cho các tính năng. Tuy nhiên, mã có vẻ đầy hứa hẹn.

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.