Визначення топологічних зв’язків за допомогою 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;

Я також не впевнений, яка функція внутрішнього з'єднання - це приєднує результат до вихідного об'єкта?


4
Я знаю, що підкреслив відповів на це своїми характерно чіткими діаграмами, але я не впевнений у тому, чи спочатку ваші багатокутники топологічно пов'язані. Топологія в цьому випадку передбачає логічні відносини між сутностями, як окремі від їх візуального подання, і (в PostGIS) вимагає встановлення схеми з CreateTopologyі так далі ( bit.ly/oLk8QY ) Але так, як на мене виглядає дигіталізація ваших будівель наче вони топологічно відрізняються, незважаючи на візуальну близькість їхніх країв. Просто щось, про що мають знати майбутні розпитувачі.
— MerseyViking

Чи означає це, що мені потрібно додати AddTopoGeometryColumnтаблицю до запуску запиту? На основі результатів зі ST_Touchesзначень я перевірив все, що має сенс, але, можливо, це було випадково.
— djq

1
Вам не тільки потрібно дзвонити AddTopoGeometryColumn, але і ваші дані повинні бути оцифровані топологічно послідовно. Наприклад, за традицією ви оцифрували два двоквартирні будинки як два багатокутники та використовували "прив'язку до вершини" у вашому ГІС для забезпечення спільних дотиків до стіни, але вони зберігатимуться як дві збігаються лінії з збігом точок на кожному кінці. Але топологічно оцифровувати їх означає, що спільна стіна насправді є лише однією лінією та двома вузлами, що розділяються кожним багатокутником. ST_Touchesпросто проводить просторову перевірку близькості, а не топологічну.
— MerseyViking

Відповіді:


19

Ви можете використовувати ST_Touches замість цього:

ST_Touches - повертає ІСТИНА, якщо геометрії мають принаймні одну точку спільного, але їх інтер'єри не перетинаються.

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
Я щойно зрозумів, що він повертає справжнє / хибне значення для кожного випадку, тому все, що мені потрібно зробити, - це порахувати, скільки існує справжніх значень. Спасибі!
— djq

5
Додано можливий запит підрахунку.
— underdark
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.