Individuazione delle relazioni topologiche con PostGIS


16

Sto cercando di eseguire un'analisi di base della tipologia utilizzando PostGIS. Il mio obiettivo è trovare eventuali poligoni che tocchino altri poligoni. Per fare questo, ho pensato che ST_GetFaceEdgesavrebbe funzionato ( riferimento ). Voglio controllare ogni poligono nel mio database ed elencare tutti gli altri poligoni che lo toccano. Nell'immagine seguente mi aspetterei che il risultato dica che due dei poligoni (che sono edifici) toccano un edificio, mentre i risultati degli altri 4 dicono che toccano 0 poligoni.

inserisci qui la descrizione dell'immagine

Tuttavia, ho qualche difficoltà a capire cosa fare. Quando ho provato a copiare l'esempio c'erano alcune parti che non capivo.

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

Non sono sicuro se topologysia il nome di una tabella, colonna o parte della funzione. Ho pensato che fosse il tavolo, ma non ne sono sicuro.

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

Inoltre, non sono sicuro di quale sia la funzione del join interno: questo unisce il risultato all'oggetto originale?


4
So che underdark ha risposto a questo con i suoi diagrammi caratteristicamente chiari, ma qualcosa di cui non sono sicuro è se i tuoi poligoni sono topologicamente correlati in primo luogo. La topologia, in questo caso, implica una relazione logica tra entità separate dalla loro rappresentazione visiva e (in PostGIS) richiede l'impostazione di uno schema con CreateTopologye così via ( bit.ly/oLk8QY ) Ma il modo in cui i tuoi edifici sono digitalizzati mi sembra come se fossero topologicamente distinti nonostante la vicinanza visiva dei loro bordi. Solo qualcosa di cui i futuri interrogatori devono essere consapevoli.
MerseyViking,

Ciò significherebbe che devo aggiungere AddTopoGeometryColumna alla tabella prima di eseguire la query? Sulla base dei risultati ST_Touchesdei valori che ho verificato, tutti avevano un senso, ma forse era un caso.
djq,

1
Non solo dovresti chiamare AddTopoGeometryColumn, ma i tuoi dati dovrebbero essere digitalizzati in modo topologicamente coerente. Ad esempio, tradizionalmente digitalizzeresti due case bifamiliari come due poligoni e utilizzeresti "aggancia al vertice" nel tuo GIS per garantire i tocchi del muro condiviso, ma sarà memorizzato come due linee coincidenti con punti coincidenti ad ogni estremità. Ma digitalizzarle topologicamente significa che il muro condiviso è in realtà solo una linea e due nodi condivisi da ciascun poligono. ST_Touchesfa solo un controllo spaziale per la vicinanza, non uno topologico.
MerseyViking,

Risposte:


19

È possibile utilizzare invece ST_Touches :

ST_Touches - Restituisce VERO se le geometrie hanno almeno un punto in comune, ma i loro interni non si intersecano.

ST_Touches restituisce TRUE per es

inserisci qui la descrizione dell'immagine

Ottenere i conteggi dovrebbe funzionare in questo modo:

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

Sono interessato a sapere quanti poligoni tocca ogni poligono. Altrimenti è perfetto e l'ho fatto funzionare!
djq,

1
Ho appena realizzato che restituisce un valore vero / falso per ogni caso, quindi tutto ciò che devo fare è contare quanti valori reali ci sono. Grazie!
djq,

5
Aggiunta una possibile query di conteggio.
underdark
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.