Выявление топологических связей с использованием PostGIS

16

Я пытаюсь выполнить базовый анализ типологии с помощью PostGIS. Моя цель - найти любые полигоны, которые касаются других полигонов. Для этого я думал, что ST_GetFaceEdgesбудет работать ( ссылка ). Я хочу проверить каждый полигон в моей базе данных и перечислить все остальные полигоны, которые его касаются. На изображении ниже я ожидаю, что результат скажет, что два из полигонов (которые являются зданиями) касаются одного здания, а результаты других 4 - что они касаются 0 полигонов.

введите описание изображения здесь

Однако мне трудно понять, что делать. Когда я попытался скопировать пример, в нем было несколько частей, которые я не понимал.

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

Я не уверен, topologyявляется ли имя таблицы, столбца или частью функции. Я предполагал, что это был стол, но я не уверен.

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

Я также не уверен, что функция внутреннего соединения - это соединяет результат с исходным объектом?

djq
источник
4
Я знаю, что Подземье ответило на это своими характерно четкими диаграммами, но кое-что, в чем я не уверен, так это то, связаны ли ваши полигоны топологически. В данном случае топология подразумевает логические отношения между объектами в отдельности от их визуального представления, и (в PostGIS) требуется настроить схему с помощью CreateTopologyи так далее ( bit.ly/oLk8QY ) Но способ оцифровки ваших зданий выглядит мне как они топологически различимы, несмотря на визуальную близость их краев. Просто кое-что для будущих спрашивающих, чтобы быть в курсе.
MerseyViking
Означает ли это, что мне нужно добавить AddTopoGeometryColumnв таблицу перед выполнением запроса? Основываясь на результатах ST_Touchesзначений, которые я проверил, все имело смысл, но, возможно, это было случайно.
DJQ
1
Вам нужно будет не только позвонить AddTopoGeometryColumn, но и оцифровать ваши данные топологически согласованным способом. Например, традиционно вы оцифровываете два двухквартирных дома как два многоугольника и используете «привязку к вершине» в вашей ГИС, чтобы обеспечить касание общей стены, но она будет сохранена в виде двух совпадающих линий с совпадающими точками на каждом конце. Но топологически их оцифровка означает, что общая стена - это всего лишь одна линия и два узла, совместно используемые каждым полигоном. ST_Touchesпросто выполняет пространственную проверку на близость, а не топологическую.
MerseyViking

Ответы:

19

Вместо этого вы можете использовать ST_Touches :

ST_Touches - возвращает TRUE, если геометрия имеет хотя бы одну общую точку, но их внутренности не пересекаются.

ST_Touches возвращает TRUE, например,

введите описание изображения здесь

Получение подсчета должно работать примерно так:

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
Подземье
источник
Мне интересно знать, сколько полигонов касается каждый полигон. В противном случае это идеально, и я получил его для запуска!
djq
1
Я только что понял, что возвращает значение true / false для каждого случая, поэтому все, что мне нужно сделать, это подсчитать, сколько есть истинных значений. Благодарность!
djq
5
Добавлен возможный запрос подсчета.
Подземье