Tham gia theo thuộc tính / spatialite với SQL / bên ngoài tham gia trong QGIS


8

Tôi có một lớp với các đa giác (hãy gọi nó là "rừng") được giao nhau bởi các đối tượng đường "n" ("đường"). Mỗi con đường có một thuộc tính độc nhất vô nhị.

Tôi cần thêm TẤT CẢ các con đường (không chỉ những người đầu tiên tìm thấy) vào lớp gỗ-đa giác mà chúng giao nhau để sử dụng sau. Tốt nhất là tất cả các con đường nên ở trong một cột thuộc tính mới của "rừng", được chia cho ví dụ ",".

Nếu chỉ có một con đường trong mỗi gỗ, tôi có thể sử dụng công cụ "tham gia theo vị trí" để có được đường trên đa giác. Thuộc tính mong muốn là một chuỗi duy nhất, do đó, nó không giúp tổng hợp / trung bình / phút / tối đa các trường và không có tùy chọn để liên kết chúng lại với nhau dưới dạng các chuỗi chia cho ",".

Chỉnh sửa: Hiện tại không có giải pháp nào mà không có sự trợ giúp của các plugin hoặc chương trình bên ngoài (xem bình luận của Matthias Kuhn bên dưới).

(QGIS 2.10.1-Pisa)


Vui lòng làm rõ những gì bạn cần ở cuối quá trình. Một trường chứa nhiều giá trị riêng biệt hoặc chỉ một giá trị? Và nếu cần một giá trị duy nhất thì giá trị nào phải được giữ khi bạn có nhiều kết quả khớp? (ví dụ: giữ đường dài nhất, đường chồng chéo hơn, id nhỏ nhất, v.v ...)
MarHoff 2/2/2016

Tôi cần tất cả các giá trị, câu hỏi được cập nhật - cảm ơn vì gợi ý.
Papierwolf 2/2/2016

1
Đây là loại nhiệm vụ tôi sẽ thực hiện bên trong PostGIS bằng cách sử dụng LEFT OUTER THAM GIA ... nếu tình cờ bạn sử dụng PostGis tôi có thể cung cấp câu trả lời nhanh chóng nhưng chỉ sử dụng QGIS có thể cần nhiều bước hơn.
MarHoff 2/2/2016

1
Đây là điều chưa thể (chưa) có thể xảy ra với QGIS. Nói chung, điều này được thảo luận dưới thuật ngữ "các hàm tổng hợp" và tôi tin tưởng rằng chúng ta sẽ thấy điều này trong một bản phát hành không quá xa trong tương lai. Trong khi đó, tôi khuyên bạn nên sử dụng giải pháp cơ sở dữ liệu (ví dụ postgres) hoặc có thể có một công cụ xử lý mà tôi không biết ngay bây giờ.
Matthias Kuhn

2
Bạn có thể giao cắt lớp đa giác với lớp đa tuyến, Bằng cách này bạn có được id đa giác và đa giác giao nhau. Bạn có thể viết tập lệnh / plugin Python để thu thập id đa tuyến thành id đa giác, nhưng đó không phải là giải pháp tốt nhất theo quan điểm quan hệ.
Zoltan

Câu trả lời:


6

Sử dụng cơ sở dữ liệu Spatialite!

Đây là một DB không gian dựa trên tập tin nhẹ được hỗ trợ ra khỏi hộp bởi QGIS.

  1. Đầu tiên thiết lập một DB không gian theo hướng dẫn của luận án

  2. Đẩy hai bảng của bạn tới DB không gian này bằng trình quản lý DBIS DB

  3. Giả sử rằng các bảng của bạn được gọi là "đa giác" và "dòng" chạy lệnh SQL sau trong giao diện truy vấn của trình quản lý DB.

SELECT polygon.id,
polygon.lib, -- Place here any field releveant for you (they must also be in grouping clauses, see below)
group_concat(line.id,',') as list_id_line -- this function concatenate the id of every line that touch you polygon
FROM polygon LEFT OUTER JOIN line
ON Intersects(polygon.geom,line.geom) -- Spatial Dabatabase Rule !
GROUP BY polygon.id, polygon.lib -- theses are the grouping clauses
  1. Thưởng thức!

Giải thích thêm và thú vị bằng cách đọc về các hàm tổng hợp SQLite tại đây và các hàm spatialite tại đây


Cảm ơn MarHoff, điều này có vẻ đầy hứa hẹn! Tôi sẽ có một cái nhìn sâu hơn về giải pháp của bạn vào ngày mai và cung cấp cho bạn "câu trả lời chấp nhận" và upvote xứng đáng của bạn.
Papierwolf

Thực sự kiểm tra xem nó có hoạt động trước đó không;) Tôi thực sự rất ngạc nhiên bởi tiềm năng của Spatialite là tùy chọn không có máy chủ. Vì tôi làm việc trên PostGis, bạn đã cho tôi một dịp tốt để thử nó!
MarHoff

Giải pháp của bạn chỉ hoạt động tốt. Cảm ơn một lần nữa vì đã cung cấp các nguồn và kịch bản. Họ thực sự giúp một người mới bắt đầu hiểu làm thế nào điều này hoạt động. Tôi sẽ cố gắng cập nhật lại câu hỏi và thẻ để giúp người khác tìm thấy câu hỏi này và câu trả lời của bạn.
Papierwolf

Không có gì! Và tôi yêu tiêu đề mới. IMHO cũng có thể công bằng khi thay thế thẻ "biểu thức" bằng "spatialite". Tạm biệt;)
MarHoff

1
Học hỏi từ những sai lầm của tôi: Hãy nhớ rằng bạn phải kiểm tra "Tạo chỉ mục không gian" khi nhập dữ liệu vào SpatiaLite (hoặc thực hiện sau đó bằng cách nhấp chuột phải vào các bảng). Truy vấn SQL của bạn bao gồm các hoạt động hình học sẽ mất nhiều thời gian nếu bạn quên làm như vậy.
Papierwolf
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.