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?


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.