Tỷ lệ đa giác trong một shapefile trong đa giác của một đa giác khác


13

Tôi là người mới, xin lỗi nếu điều này là rõ ràng / đã được hỏi và trả lời nhưng tôi không thể tìm thấy bất cứ điều gì.

Tôi có hai shapefile: 1. một lớp ranh giới hành chính cho một quận ở Anh được gọi là ranh giới LSOA có 500 vùng nhỏ trong đó 2. một vùng lũ lụt.

Lý tưởng nhất là tôi muốn tìm ra khu vực LSOA nhỏ nào ≥50% trong vùng lũ và kết thúc bằng có / không hoặc 1/0 cho mỗi trong số 500 khu vực LSOA.

Nhưng tôi không biết làm thế nào để làm điều này. Tôi hình dung mình có thể tham gia hai shapefile, nhưng không có thuộc tính chung giữa chúng. Sau đó, tôi nghĩ rằng tôi có thể sử dụng chức năng Tham gia theo vị trí, hoạt động và cho tôi biết LSOA nào đang ở trong vùng lũ lụt, nhưng đó gần như là tất cả trong số họ (xem hình 2).

Tôi nghĩ rằng đây là một vấn đề SQL nhưng tôi không biết. Tôi mới sử dụng QGIS và chưa bao giờ sử dụng PostgreSQL.

Mọi sự trợ giúp sẽ rất được trân trọng. Tôi có thể cung cấp bất cứ thông tin nào mà những người đáng yêu của bạn cần để giúp tôi.

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

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

Câu trả lời:


11

Đây là một nhiệm vụ tương đối đơn giản bằng cách sử dụng các công cụ xử lý địa lý có trong QGIS.

  1. Tính diện tích khu LSOA của bạn.

    • Mở bảng thuộc tính lớp LSOA.
    • Kích hoạt chế độ chỉnh sửa.
    • Mở máy tính trường.
    • Tạo một trường mới loại "Số thập phân (thực)" với biểu thức "$ area".
    • Tắt chế độ chỉnh sửa (lưu chỉnh sửa).
  2. Hợp nhất lớp vùng lũ thành một tính năng đa phần duy nhất.

    • Vector > Geometry Tools > Singleparts to Multipart.
    • Chọn "--- Hợp nhất tất cả ---" cho trường ID duy nhất.
  3. Giao cắt lớp khu vực LSOA với lớp vùng lũ nhiều tầng.

    • Vector > Geoprocessing Tools > Intersect.
    • Lớp đầu vào là vùng LSOA, lớp giao nhau là vùng lũ.
  4. Lớp kết quả sẽ là các phần của vùng LSOA (với các thuộc tính từ lớp vùng LSOA) chồng lấp với lớp vùng lũ. Để tính tỷ lệ của từng vùng LSOA trong vùng lũ:

    • Tính diện tích của các đối tượng giao nhau (như trong bước 1), sau đó
    • Thêm một trường khác, chia khu vực (tổng) ban đầu cho khu vực giao nhau. Kết quả là số thập phân từ 0 đến 1. Nhân với 100 để cho tỷ lệ phần trăm.
  5. Tham gia lớp LSOA ban đầu với lớp giao nhau, sử dụng ID duy nhất được chia sẻ bởi cả hai lớp.

  6. Xuất lớp đã tham gia dưới dạng shapefile mới.

  7. Xóa các thuộc tính trùng lặp.

Et voilà!

Nếu không có bước # 2, một tính năng riêng lẻ sẽ được tạo cho từng tính năng vùng lũ khác nhau cho từng tính năng LSOA. Đây có lẽ không phải là điều bạn muốn nếu bạn chỉ quan tâm đến tổng phạm vi bảo hiểm cho từng khu vực LSOA. Nếu bạn muốn phân biệt giữa lũ lụt theo dòng chảy / thủy triều / phù sa (và dữ liệu vùng lũ hỗ trợ), bạn có thể chuyển đổi một phần thành nhiều phần xác định trường "TYPE" làm trường ID duy nhất.


Cảm ơn sự giúp đỡ của bạn! Nhiều đánh giá cao. Tuy nhiên, tôi đang gặp một số rắc rối. Tôi đã làm theo các bước. Bước 3, Giao lộ, mất 10 giờ để hoàn thành và khi hoàn thành tất cả những gì tôi nhận được là một shapefile trống: i.imgur.com/QIM6Gtg.png Có điều gì tôi đã bỏ lỡ không? Tôi đã cố gắng hoàn thành quy trình và thực hiện bước 4 nhưng không có dữ liệu để tính diện tích giao cắt.
KJGarbutt

Tôi đã có vấn đề khi thực hiện giao lộ với các lớp lũ trước đây. Các tính năng là lớn và phức tạp. Cách tôi đã làm việc xung quanh nó trong quá khứ là chia chúng thành các tính năng nhỏ hơn, vì vậy chỉ số không gian có thể thực hiện nhiều công việc hơn. Để làm điều này, tạo một lưới vectơ có cùng mức độ với lớp lũ ( Vector > Research Tools > Vector Grid... Output grid as polygons), sau đó giao lưới với lớp lũ. Sau đó sử dụng đầu ra thay vì lớp lũ ở bước 3. Tôi đoán lý do lớp trống là do nó bị hỏng.
Snorfalorpagus

Cảm ơn một lần nữa. Vấn đề duy nhất bây giờ là QGIS gặp sự cố mỗi khi tôi cố gắng tạo lưới vector. Tôi đã làm theo lời khuyên từ đây nhưng nó bị sập mỗi lần. Tôi đã thay đổi các tham số nhiều lần và chỉ thử sử dụng shapefile vùng lũ, thay vì mở toàn bộ tệp dự án của tôi và nó bị lỗi mỗi lần. Có ý kiến ​​gì không? ! Ảnh chụp màn hình ở đây .
KJGarbutt

Các tham số X và Y bạn đã chỉ định quá nhỏ. Hãy thử một cái gì đó như 1000 x 1000. Bạn thậm chí có thể làm điều này nhiều lần, tức là làm 5000 x 5000 trước, sử dụng đầu ra để tạo 500 x 500. Xem câu trả lời liên quan tại đây: gis.stackexchange.com/a/66319/12420
Snorfalorpagus

Tôi gần như đã phá vỡ nó với sự giúp đỡ của bạn! Tuy nhiên, khi tôi tham gia lớp LSOA ban đầu với lớp giao nhau, tôi mất rất nhiều dữ liệu. Tôi nghĩ rằng đó là do một số ô vuông vectơ được tạo nằm trong cùng một khu vực LSOA và do đó có cùng mã LSOA với nhau. Do đó, tôi kết thúc với hơn 2 con số phần trăm cho mỗi khu vực LSOA khi tôi tham gia và dường như tôi chỉ nhận được một trong số chúng. Có cách nào để tính tổng từng phần trăm cho mỗi ô vuông vectơ với cùng LSOA không?
KJGarbutt

6

Bạn có thể sử dụng spatialite và một số hàm SQL không gian.

Select t1.geometry, t1.ID, area(t1.geometry), area(t2.geometry) ...... (anything you need to have in the table results)

(area(intersection(t1.geometry,t2.geometry))) as "Commun_AREA"

, ("Commun_AREA"*100/(area(t1.geometry))) as "Percent_AREA"

From lsoa as t1, flood_zone as t2

Where Intersects( t1.geometry,t2.geometry ) = 1

3

Điều này có vẻ như một cái gì đó có thể được thực hiện dễ dàng hơn nhiều so với câu trả lời được gửi. Tôi sẽ sử dụng một kịch bản python đơn giản cá nhân:

floodName = "the layer name here"
boundryName = "the layer name here"
fieldName = "the name of the field to contain the output 1/0"
minCoverage = 0.5 # the minimum amount of area covered to write 1
updateMap = [] # this will store values to be written    

# get layers
floodLayer = QgsMapLayerRegistry.instance().mapLayersByName(floodName)[0]
boundryLayer = QgsMapLayerRegistry.instance().mapLayersByName(boundryName)[0]
fieldIndex = boundryLayer.dataProvider().fieldNameIndex(fieldName)    

# iterate through boundries
for b in boundryLayer.getFeatures():
    # get only flood features that intersect with this feature's bounding box
    # this will make the script go way faster than it would otherwise
    request = QgsFeatureRequest().setFilterRect(b.geometry().boundingBox())
    floodGeom = geometry()
    floodFeat = QgsFeature()
    iter = floodLayer.getFeatures(request)
    iter.nextFeature(feat)
    while iter.nextFeature(feat):
        floodGeom = floodGeom.combine(feat.geometry())
    intersectGeom = b.geometry().intersection(feat.geometry())
    if intersectGeom.area() > minCoverage * b.geometry().area():
        updateMap[b.id()] = {fieldIndex : 1}
    else:
        updateMap[b.id()] = {fieldIndex : 0}

boundryLayer.dataProvider().changeAttributeValues(updateMap)

điều này chỉ đánh giá các đa giác lũ giao nhau với hộp giới hạn của mỗi lớp liên kết nên nó khá nhanh để chạy, sau đó nó chỉ cập nhật một trường trong lớp hiện tại (thay vì một thao tác phức tạp là tạo một lớp hoàn toàn mới và sao chép các giá trị cũ sau đó xóa)


2

Tôi gặp vấn đề tương tự như KJ theo hướng dẫn của Snorfalorpagus bằng cách sử dụng phương pháp "Intersect" trong Bước 3. Mất khá nhiều thời gian để tính toán và những gì tôi còn lại là trống.

Tôi đã thử làm theo các bước tương tự ngoại trừ sử dụng phương pháp "Clip" trong QGIS thay vì Intersect - vì vậy, trong ví dụ của bạn, phần còn lại sẽ là các phần của khu vực KHÔNG nằm trong vùng lũ. Điều này dường như hoạt động vì một số lý do và tôi đã có thể sử dụng phép tính trường "Khu vực" từ bước trước đó, cộng với phép tính "Khu vực" mới trên các phần còn lại của mỗi đa giác, để tìm ra% của mỗi khu vực KHÔNG được bao phủ bởi lớp Đa giác khác.

Đó là kỹ thuật ngược lại với những gì bạn yêu cầu. Nhưng từ đó, chỉ cần trừ đi từng giá trị từ 1 để có được những gì được bao phủ bởi vùng lũ lụt.

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.