Chức năng so sánh PostGIS?


9

Tôi muốn có thể so sánh các tính năng trong Lớp 1 (nguồn) với các tính năng trong Lớp 2 (cập nhật thành nguồn) để xem liệu có bất kỳ tính năng hình học và / hoặc thuộc tính nào đã thay đổi hay không. Sau đó tôi cũng muốn có một "báo cáo" được tạo ra nói rõ những gì đã thay đổi.

Chỉnh sửa để làm rõ: Thay đổi trong hình học cũng bao gồm tìm các tính năng đã được thêm vào lớp dữ liệu mới. Xóa có thể là thú vị để có, nhưng bổ sung là quan trọng hơn.

Tôi đã xem qua các chức năng của PostGIS và dường như không thể tìm thấy bất kỳ công cụ nào được thiết kế để so sánh và báo cáo sự khác biệt giữa các tính năng của 2 lớp, cả hình học và thuộc tính.

Tôi đang tìm kiếm một cái gì đó tương tự như công cụ " So sánh tính năng " của ArcGIS .

Nếu không có gì giống như vậy trong PostGIS, có công cụ nguồn mở nào khác sẽ trả lời các loại câu hỏi này không? Cảm ơn.


Sẽ không dễ dàng hơn để sử dụng một số loại hệ thống phiên bản? Hay bạn đã có hai lớp đó và bạn phải đối phó với chúng bây giờ?
underdark

Việc sử dụng phiên bản chắc chắn sẽ dễ dàng hơn, ngoại trừ việc dữ liệu không do tôi sở hữu hoặc duy trì. Đó là dữ liệu được cung cấp trong các bản cập nhật hàng quý, ở nhiều định dạng (thường là shapefiles) và tôi muốn tìm hiểu các tính năng và thuộc tính nào đã thay đổi giữa các bản cập nhật.
RyanKDalton

Câu trả lời:


7

Bạn có thể thực hiện các so sánh theo hàng trong PostgreSQL với các hàm tạo hàng . Tôi đoán rằng nó sẽ hoạt động với các trường hình học nhưng tôi đã không thử nó.

Đưa ra hai bảng trong đó các tính năng phù hợp có cùng một trường id trong mỗi bảng bạn có thể làm một cái gì đó như:

select ROW(t1.att1, t1.att2, t1.geom) = ROW(t2.att1, t2.att2, t2.geom)
from t1, t2
where t1.id = t2.id

Cập nhật: Điều này không hoạt động với các trường hình học trong thử nghiệm của tôi.

Cập nhật 2: Đây là một ví dụ đầy đủ hơn dựa trên tiêu chí của bạn.

Bảng: t1 (id, att1, att2, geom) t2 (id, att1, att2, geom)

-- return the id and geometry from the updated table if the attributes or
-- geometry have changed or it's a new feature.

select t2.id, t2.geom
from t1, t2
where
  ( t1.id = t2.id and row(t1.att1, t1.att2, t1.geom) != row(t2.att1, t2.att2, t2.geom))
  or
  t2.id not in (select id from t1)

Điều đó sẽ giúp bạn có được những gì bạn đang tìm kiếm. Có lẽ bạn sẽ muốn thay đổi mệnh đề 'không trong' thành 'không tồn tại' để có hiệu suất tốt hơn.


Điều đó sẽ bỏ qua mọi bổ sung hoặc xóa dữ liệu (trong đó một id chỉ có trong một bảng), phải không?
relet

1
Câu hỏi không đề cập đến việc xóa hoặc bổ sung nhưng bạn có thể dễ dàng kết hợp câu hỏi đó để tìm câu hỏi mới hoặc đã xóa. Bạn cũng có thể làm việc trong sự khác biệt giữa các tính năng.
Sean

Sean, đây là một khái niệm tuyệt vời có vẻ rất hứa hẹn. 1) Điều này tìm thấy tất cả các tính năng giống nhau, làm thế nào tôi tìm thấy tất cả các thay đổi? 2) Phương pháp tốt nhất để đưa kết quả này trở lại các tính năng đã thay đổi (hình học) là gì để bạn có thể so sánh trực quan các tính năng đã thay đổi với các tính năng nguồn?
RyanKDalton

@Ryan: Nó tìm thấy cả hai - nó sẽ trả về nếu các hàng giống hệt nhau (Đúng hoặc Sai) cho mỗi cặp id giống nhau.
relet

@Sean: Tôi rất gần với việc thực hiện công việc này, nhưng khi tôi cố gắng thực hiện một UNION (như tôi đã sử dụng trong câu trả lời ST_EQUALS) để bao gồm tất cả các hình học mới, tôi không thể làm cho nó hoạt động được vì nó nói tôi cần cùng số lượng hàng trong truy vấn công đoàn của tôi. Row () = Row () tạo cột boolean không tồn tại trong dữ liệu nguồn của tôi (một phần của câu lệnh UNION), vậy làm cách nào để tạo / tham chiếu cột "giả" trong truy vấn UNION của tôi để khớp với ROW ( ) = ROW () chọn câu lệnh?
RyanKDalton

2

Hàm ST_Equals(geometryA, geometryB)trả về TRUE nếu chúng bằng nhau về mặt không gian.


Điều này so sánh hai lớp hoặc chỉ hai tính năng cụ thể ? Ngoài ra, "không gian bằng nhau" có nghĩa là gì? Điều đó có nghĩa là chúng đại diện cho cùng một tập hợp các điểm trên trái đất, hay có nghĩa là chúng đại diện cho cùng một tập hợp các điểm theo cùng một cách chính xác ? (Cái sau nghiêm ngặt hơn.)
whuber

Điều tôi thực sự muốn có được là tất cả các hình học trong lớp A (đã cập nhật) đã được thêm hoặc thay đổi kể từ lớp B (bản gốc). Tôi đã có thể thực hiện kết quả đó với cú pháp sau: CHỌN A.fields TỪ MỘT NGOẠI LỆ CHỌN A.fields TỪ A, B WHERE ST_EQUALS (A.geom, B.geom). Kết quả là tất cả các hình học đặc trưng từ lớp A đã thay đổi hoặc được thêm vào. Cảm ơn!
RyanKDalton
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.