Identificando relacionamentos topológicos usando o PostGIS

16

Estou tentando realizar uma análise tipológica básica usando o PostGIS. Meu objetivo é encontrar polígonos que toquem outros polígonos. Para fazer isso, pensei ST_GetFaceEdgesque funcionaria ( referência ). Quero verificar todos os polígonos no meu banco de dados e listar todos os outros polígonos que o tocam. Na imagem abaixo, eu esperaria que o resultado dissesse que dois dos polígonos (que são edifícios) tocam em um edifício, e os resultados dos outros 4 dizem que eles tocam 0 polígonos.

insira a descrição da imagem aqui

No entanto, estou tendo dificuldades para entender o que fazer. Quando tentei copiar o exemplo, havia algumas partes que não entendi.

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

Não tenho certeza se topologyé o nome de uma tabela, coluna ou parte da função. Presumi que fosse a mesa, mas não tenho certeza.

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

Também não tenho certeza de qual é a função da junção interna - isso une o resultado ao objeto original?

djq
fonte
4
Sei que o underdark respondeu a isso com seus diagramas caracteristicamente claros, mas algo que não tenho certeza é se os polígonos estão topologicamente relacionados em primeiro lugar. A topologia, nesse caso, implica em um relacionamento lógico entre entidades como separado de sua representação visual, e (no PostGIS) requer a configuração de um esquema com CreateTopologye assim por diante ( bit.ly/oLk8QY ) Mas a maneira como seus edifícios são digitalizados parece-me como se fossem topologicamente distintos, apesar da proximidade visual de suas bordas. Apenas algo para os futuros questionadores estarem cientes.
MerseyViking
Isso significa que eu preciso adicionar um AddTopoGeometryColumnà tabela antes de executar a consulta? Com base nos resultados dos ST_Touchesvalores que verifiquei, tudo fazia sentido, mas talvez isso fosse por acaso.
DJQ
1
Você não precisaria apenas ligar AddTopoGeometryColumn, mas seus dados precisariam ser digitalizados de uma maneira topologicamente consistente. Por exemplo, tradicionalmente, você digitaria duas casas geminadas como dois polígonos e usaria "snap ao vértice" em seu GIS para garantir que a parede compartilhada tocasse, mas ela será armazenada como duas linhas coincidentes com pontos coincidentes em cada extremidade. Mas digitalizá-las topologicamente significa que a parede compartilhada é realmente apenas uma linha e dois nós compartilhados por cada polígono. ST_Touchesapenas faz uma verificação espacial de proximidade, não topológica.
MerseyViking

Respostas:

19

Você poderia usar ST_Touches :

ST_Touches - Retorna TRUE se as geometrias tiverem pelo menos um ponto em comum, mas seus interiores não se cruzam.

ST_Touches retorna TRUE por exemplo

insira a descrição da imagem aqui

Obter as contagens deve funcionar mais ou menos assim:

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
fonte
Estou interessado em saber quantos polígonos cada polígono toca. Caso contrário, é perfeito, e eu consegui rodar!
DJQ
1
Acabei de perceber que ele retorna um valor verdadeiro / falso para cada caso, então tudo o que preciso fazer é contar quantos valores verdadeiros existem. Obrigado!
DJQ
5
Adicionada uma possível consulta de contagem.
underdark