Fungsi membandingkan fitur PostGIS?

9

Saya ingin dapat membandingkan fitur di Layer 1 (sumber) dengan fitur di Layer 2 (pembaruan ke sumber) untuk melihat apakah ada fitur geometri dan / atau atribut yang berubah. Saya juga ingin memiliki "laporan" yang dihasilkan menyatakan apa yang telah berubah.

Edit untuk Klarifikasi: Perubahan pada geometri juga termasuk menemukan fitur yang telah ditambahkan ke lapisan data baru. Penghapusan mungkin menarik untuk dimiliki, tetapi penambahan lebih penting.

Saya telah melihat-lihat fungsi PostGIS dan sepertinya tidak dapat menemukan alat yang dirancang untuk membandingkan dan melaporkan perbedaan antara fitur 2 layer, baik geometri maupun atribut.

Saya mencari sesuatu yang mirip dengan alat " Bandingkan Fitur " ArcGIS .

Jika tidak ada yang seperti ini di PostGIS, apakah ada alat open-source lain yang akan menjawab jenis pertanyaan ini? Terima kasih.

RyanKDalton
sumber
Bukankah lebih mudah menggunakan semacam sistem versi? Atau apakah Anda sudah memiliki dua lapisan itu dan Anda harus menghadapinya sekarang?
underdark
Tentunya akan lebih mudah untuk menggunakan versi, kecuali bahwa data tidak dimiliki atau dikelola oleh saya. Ini adalah data yang disediakan dalam pembaruan triwulanan, dalam berbagai format (biasanya shapefile), dan saya ingin mengetahui fitur dan atribut mana yang telah berubah di antara pembaruan.
RyanKDalton

Jawaban:

7

Anda dapat melakukan perbandingan baris-bijaksana di PostgreSQL dengan konstruktor baris . Saya menduga ini akan bekerja dengan bidang geometri tapi saya belum mencobanya.

Diberikan dua tabel di mana fitur yang cocok memiliki bidang id yang sama di masing-masing Anda dapat melakukan sesuatu seperti:

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

Pembaruan: Ini berfungsi dengan bidang geometri dalam pengujian saya.

Pembaruan 2: Berikut adalah contoh yang lebih lengkap berdasarkan kriteria Anda.

Tabel: 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)

Itu akan memberi Anda apa yang Anda cari. Anda mungkin ingin mengubah klausa 'tidak ada' menjadi 'tidak ada' untuk kinerja yang lebih baik.

Sean
sumber
Itu akan mengabaikan penambahan atau penghapusan pada dataset (di mana id hanya ada dalam satu tabel), bukan?
Relet
1
Pertanyaannya tidak menyebutkan penghapusan atau penambahan tetapi Anda dapat dengan mudah menyatukannya dengan kueri untuk menemukan yang baru atau dihapus. Anda juga dapat bekerja dalam perbedaan antara fitur-fiturnya.
Sean
Sean, ini adalah konsep hebat yang terlihat sangat menjanjikan. 1) Ini menemukan semua fitur yang sama, bagaimana saya menemukan semua perubahan? 2) Apa yang akan menjadi metode terbaik untuk menggabungkan hasil ini kembali ke fitur yang diubah (geometri), sehingga Anda dapat secara visual membandingkan fitur yang diubah dengan fitur sumber?
RyanKDalton
@Ryan: Ia menemukan keduanya - ia harus kembali jika barisnya identik (Benar atau Salah) untuk setiap pasangan id identik.
Relet
@Sean: Saya sangat dekat dengan membuat karya ini, tetapi ketika saya mencoba melakukan UNION (seperti yang saya gunakan dalam jawaban ST_EQUALS) untuk memasukkan semua geometri baru, saya tidak bisa membuatnya bekerja karena katanya saya membutuhkan jumlah baris yang sama dalam kueri gabungan saya. Baris () = Baris () membuat kolom boolean yang tidak ada dalam data sumber saya (bagian dari pernyataan UNION), jadi bagaimana cara membuat / referensi kolom "palsu" dalam kueri UNION saya untuk mencocokkan dengan ROW ( ) = ROW () pilih pernyataan?
RyanKDalton
2

Fungsi ST_Equals(geometryA, geometryB)mengembalikan TRUE jika mereka secara spasial sama.

Pablo
sumber
Apakah ini membandingkan dua lapisan atau hanya dua fitur spesifik ? Juga, apa artinya "sederajat secara spasial"? Apakah itu berarti bahwa mereka mewakili set poin yang sama di bumi, atau apakah itu berarti mereka mewakili set poin yang sama persis dengan cara yang sama ? (Yang terakhir lebih ketat.)
whuber
Apa yang saya benar-benar ingin dapatkan sebagai hasilnya adalah semua geometri di lapisan A (diperbarui) yang telah ditambahkan atau diubah sejak lapisan B (asli). Saya dapat mencapai hasil itu dengan sintaks berikut: SELECT A.fields DARI SELECT SELECT A.fields DARI A, B WHERE ST_EQUALS (A.geom, B.geom). Hasilnya adalah semua fitur geometri dari lapisan A yang telah diubah atau ditambahkan. Terima kasih!
RyanKDalton