Mengidentifikasi hubungan topologi menggunakan PostGIS

16

Saya mencoba melakukan analisis tipologi dasar menggunakan PostGIS. Tujuan saya adalah menemukan poligon yang menyentuh poligon lain. Untuk melakukan ini, saya pikir ST_GetFaceEdgesakan berhasil ( referensi ). Saya ingin memeriksa setiap poligon di basis data saya dan mendaftar semua poligon lain yang menyentuhnya. Pada gambar di bawah ini saya akan mengharapkan hasil untuk mengatakan bahwa dua poligon (yang merupakan bangunan) menyentuh satu bangunan, dan hasil 4 lainnya mengatakan bahwa mereka menyentuh 0 poligon.

masukkan deskripsi gambar di sini

Namun, saya mengalami kesulitan memahami apa yang harus dilakukan. Ketika saya mencoba menyalin contoh ada beberapa bagian yang tidak saya mengerti.

-- Returns the sequence, edge id
-- , and geometry of the edges that bound face 1
-- If you just need geom and seq, can use ST_GetFaceGeometry
SELECT t.seq, t.edge, geom
FROM topology.ST_GetFaceEdges('tt',1) As t(seq,edge)
    INNER JOIN tt.edge AS e ON abs(t.edge) = e.edge_id;

Saya tidak yakin apakah topologynama tabel, kolom atau bagian dari fungsi. Saya berasumsi bahwa itu adalah meja, tetapi saya tidak yakin.

-- try out on sample of data
-- Table is called 'TestArea', column used is 'fid_1'
SELECT t.seq, t.edge, geom
FROM  TestArea.ST_GetFaceEdges('fid_1', 1) As t(seq,edge)
    INNER JOIN tt.edge AS e ON abs(t.edge) = e.edge_id;

Saya juga tidak yakin apa fungsi gabungan dalam - apakah ini menggabungkan hasil ke objek asli?

djq
sumber
4
Saya tahu underdark telah menjawab ini dengan diagram yang secara karakteristik jelas, tetapi sesuatu yang saya tidak yakin adalah apakah poligon Anda terkait secara topologi. Topologi, dalam hal ini, menyiratkan hubungan logis antara entitas sebagai terpisah dari representasi visual mereka, dan (dalam PostGIS) memerlukan pengaturan skema dengan CreateTopologydan sebagainya ( bit.ly/oLk8QY ) Tapi cara bangunan Anda didigitalkan terlihat oleh saya seperti mereka berbeda secara topologi meskipun kedekatan visual tepi mereka. Hanya sesuatu yang perlu diperhatikan oleh penanya di masa depan.
MerseyViking
Apakah ini berarti bahwa saya perlu menambahkan AddTopoGeometryColumntabel sebelum menjalankan kueri? Berdasarkan hasil dari ST_Touchesnilai-nilai yang saya periksa semua masuk akal tapi mungkin itu kebetulan.
djq
1
Anda tidak hanya perlu menelepon AddTopoGeometryColumn, tetapi data Anda harus didigitalkan dengan cara yang konsisten secara topologi. Misalnya, secara tradisional Anda akan mendigitalkan dua rumah semi-terpisah sebagai dua poligon dan menggunakan "snap to vertex" di GIS Anda untuk memastikan dinding bersama menyentuh, tetapi itu akan disimpan sebagai dua garis yang bertepatan dengan titik yang bertepatan di setiap ujungnya. Namun, mendigitalkan secara topologi berarti bahwa dinding yang dibagikan benar-benar hanya satu baris dan dua simpul dibagi oleh setiap poligon. ST_Toucheshanya melakukan pemeriksaan spasial untuk kedekatan, bukan yang topologis.
MerseyViking

Jawaban:

19

Anda dapat menggunakan ST_Touches sebagai gantinya:

ST_Touches - Mengembalikan BENAR jika geometri memiliki setidaknya satu titik yang sama, tetapi interiornya tidak berpotongan.

ST_Touches mengembalikan TRUE untuk mis

masukkan deskripsi gambar di sini

Mendapatkan hitungan harus bekerja seperti ini:

SELECT a.id, count(*)
FROM polygon_table as a
JOIN polygon_table as b
  ON ST_Touches(a.the_geom,b.the_geom)
GROUP BY a.id
underdark
sumber
Saya tertarik mengetahui berapa banyak poligon yang disentuh setiap poligon. Kalau tidak, itu sempurna, dan aku harus berlari!
djq
1
Saya baru menyadari itu mengembalikan nilai benar / salah untuk setiap kasus sehingga yang perlu saya lakukan adalah menghitung berapa banyak nilai benar yang ada. Terima kasih!
djq
5
Menambahkan kueri penghitungan yang mungkin.
underdark