Я пытаюсь выполнить базовый анализ типологии с помощью 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;
Я также не уверен, что функция внутреннего соединения - это соединяет результат с исходным объектом?
CreateTopology
и так далее ( bit.ly/oLk8QY ) Но способ оцифровки ваших зданий выглядит мне как они топологически различимы, несмотря на визуальную близость их краев. Просто кое-что для будущих спрашивающих, чтобы быть в курсе.AddTopoGeometryColumn
в таблицу перед выполнением запроса? Основываясь на результатахST_Touches
значений, которые я проверил, все имело смысл, но, возможно, это было случайно.AddTopoGeometryColumn
, но и оцифровать ваши данные топологически согласованным способом. Например, традиционно вы оцифровываете два двухквартирных дома как два многоугольника и используете «привязку к вершине» в вашей ГИС, чтобы обеспечить касание общей стены, но она будет сохранена в виде двух совпадающих линий с совпадающими точками на каждом конце. Но топологически их оцифровка означает, что общая стена - это всего лишь одна линия и два узла, совместно используемые каждым полигоном.ST_Touches
просто выполняет пространственную проверку на близость, а не топологическую.Ответы:
Вместо этого вы можете использовать ST_Touches :
ST_Touches возвращает TRUE, например,
Получение подсчета должно работать примерно так:
источник