PostGIS kullanarak topolojik ilişkilerin belirlenmesi


16

PostGIS kullanarak temel tipoloji analizi yapmaya çalışıyorum. Amacım diğer çokgenlere dokunan çokgenler bulmak. Bunu yapmak için ST_GetFaceEdges, işe yarayacağını düşündüm ( referans ). Veritabanımdaki her çokgeni kontrol etmek ve ona dokunan diğer tüm çokgenleri listelemek istiyorum. Aşağıdaki görüntüde, sonucun (bina olan) çokgenlerden ikisinin bir binaya, diğer 4'ün sonucunun da 0 çokgenlere dokunduğunu söylemesini beklerim.

resim açıklamasını buraya girin

Ancak ne yapacağımı anlamakta güçlük çekiyorum. Örneği kopyalamaya çalıştığımda, anlamadığım birkaç kısmı vardı.

-- 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;

topologyTablo, sütun veya işlevin bir parçası adı olup olmadığından emin değilim . Masa olduğunu varsaydım, ama emin değilim.

-- 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;

Ayrıca iç birleşimin işlevinin ne olduğundan emin değilim - bu sonuç orijinal nesneye katılıyor mu?


4
Underdark'ın bunu karakteristik olarak açık diyagramları ile cevapladığını biliyorum, ancak emin olmadığım bir şey çokgenlerin topolojik olarak ilgili olup olmadığıdır. Bu durumda topoloji, varlıklar arasında görsel temsillerinden ayrı olarak mantıklı bir ilişki olduğunu ima eder ve (PostGIS'te), CreateTopologyvb. İle bir şema oluşturmayı gerektirir ( bit.ly/oLk8QY ) Ama binalarınızın sayısallaştırılması bana bakıyor kenarlarının görsel yakınlığına rağmen topolojik olarak farklı oldukları gibi. Sadece geleceğin sorgulayıcılarının farkında olması gereken bir şey.
MerseyViking

Bu AddTopoGeometryColumn, sorguyu çalıştırmadan önce tabloya bir eklemem gerektiği anlamına mı gelir? ST_TouchesKontrol ettiğim değerlerden elde edilen sonuçlara dayanarak mantıklı geldi ama belki de bu tesadüfendi.
djq

1
Sadece aramanız AddTopoGeometryColumndeğil, verilerinizin topolojik olarak tutarlı bir şekilde dijitalleştirilmesi de gerekir. Örneğin, geleneksel olarak, iki yarı müstakil evi iki çokgen olarak sayısallaştırır ve paylaşılan duvar dokunuşlarını sağlamak için CBS'nizde "tepe noktasına yasla" yı kullanırsınız, ancak her iki uçta çakışan iki çakışan çizgi olarak saklanır. Ancak bunların topolojik olarak dijitalleştirilmesi, paylaşılan duvarın gerçekten sadece bir satır ve her çokgen tarafından paylaşılan iki düğüm olduğu anlamına gelir. ST_Touchestopolojik değil, yakınlık için mekânsal bir kontrol yapar.
MerseyViking

Yanıtlar:


19

Bunun yerine ST_Touches kullanabilirsiniz :

ST_Touches - Geometrilerin ortak en az bir noktası varsa ancak iç kısımları kesişmiyorsa TRUE değerini döndürür.

ST_Touches ör.

resim açıklamasını buraya girin

Sayımları almak şu şekilde çalışmalıdır:

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

Her bir çokgenin kaç tane çokgen dokunduğunu bilmekle ilgileniyorum. Aksi takdirde mükemmel ve çalıştırmak için var!
djq

1
Sadece her durum için doğru / yanlış bir değer döndürdüğünü fark ettim, bu yüzden tek yapmam gereken kaç gerçek değerin olduğunu saymak. Teşekkürler!
djq

5
Olası bir sayım sorgusu eklendi.
underdark
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.