Створіть багатокутник із ліній у PostGIS


13

Я намагаюся розділити багатокутник на менші багатокутники від лінії, але думаю, що я не можу використовувати функцію st_split. Що мені потрібно - це створити невеликі багатокутники всередині великого, використовуючи сітку для рядкових рядків.

Я спробував деякі способи, але не можу отримати результат. Що я спробував:

Розділіть один многокутник від LineString за допомогою st_split ()

Від граничного багатокутника.

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

Таблиця рядків рядків:

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

Мені знадобляться такі багатокутники:

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

Проблема : Я не можу розділити багатокутник на кілька рядків, ані багатокутник від багаторядкових.

Інший метод, який я намагаюся, - це створити багатокутники з рядків з st_polygonize () SQL, який я намагався:

SELECT 
   g.path[1] as gid, 
   g.geom::geometry(polygon, 22033) as geom 
FROM
   (SELECT 
     (ST_Dump(ST_Polygonize(geom))).* 
   FROM linestable
) as g;

Витягується зі створення полігонів із сегментів рядків за допомогою PostgreSQL та PostGIS

Проблема : я можу отримати лише один многокутник (межа).

Може хтось скаже мені, який був би найкращий спосіб дістати полігони з рядкової лінії, або якщо я щось пропускаю?

Примітка: таблиці мають один і той же SRID, а геометрії вставляються в сітку. У QGIS я можу ідеально запустити процес полігонізації від ліній до багатокутника.

Як вимагає Джон, ось таблиця рядків. https://drive.google.com/file/d/0B603y_m735jfS014S0EyVnpMUEU/view?usp=sharing


1
Чи можете ви розмістити десь геометричні лінії рядків? ST_Polygonize разом зі ST_Dump має працювати.
Джон Пауелл

Звичайно. Я відредагував публікацію за посиланням на таблицю.
Пабло Пардо

@ JohnPowellakaBarça ви можете це подивитися. Це питання чудове. ST_Polygonize на його вибірковому наборі повертає один багатокутник. Нам по суті потрібно розкласти його безлад відкритих ЛІНІСТРИНГІВ і знайти їх усіх, які можуть скласти прямокутники?
Еван Керролл

1
@EvanCarroll. Звичайно. Я божевільно зайнятий банкоматом, так що, мабуть, не на кілька днів.
Джон Пауелл

1
@ppardoz. Espero que esto te ayude. Я помітив, що всі ваші столові дефіси були всіма іспанською мовою :-)
Джон Пауелл

Відповіді:


4

Я працював над цим, використовуючи спочатку ST_Node , спільно з ST_Collect , для перетворення рядків у набір кивнутих рядків у MultiLinestring .

Як сказано в документах для ST_Node :

Повністю вузол набору рядків рядків, використовуючи якнайменше можливу кількість вузлів, зберігаючи всі вхідні.

Це означає, що всі рядки рядків поєднуються у всіх можливих комбінаціях, щоб скласти еквівалент зовнішньому кільцю багатокутника. Оскільки, якщо ви намагаєтесь ST_Polygonize набір LineStrings, жоден з яких самостійно не описує багатокутник, ви просто повернете LineStrings назад. Отже, це працює:

WITH multi(geom) AS (
  SELECT ST_Node(ST_Collect(geom))
  FROM leyenda_digitalizar00
)
SELECT ST_AsText( (ST_Dump(ST_Polygonize(geom))).geom )
FROM multi;

Якщо ви просто запустите першу частину цього, тобто CTE multi, результат виглядає так:

МУЛЬТИЛІНЕСТРІНГ ((204,5 69,9000000000004,204,5 69,9000000000004), (204,5 68,9,205,4 68,9), (204,5 68,9,204,5 69,204,5 69,1,204,5 69,2,204,5 69,3,204,5 69,4,204,5 69,5,204,5 69,6,204,5 69,7,204,5 69,8,204,5 204,5 69,9000000000004), (209,5 68,9,209,5 68,8,209,5 68,7,209,5 68,6,209,5 68,5,209,5 68,4,209,5 68,3,209,5 68,2,209,5 68,1,209,5 68,209,5 67,9,209,5 67,8,209,5 67,7,209,5 67,6,209,5 67,5,209,5 67,4 , 209,5 .......

Тепер, коли ви зараз подаєте цю MultiLinestring для ST_Polygonize, вона працює як очікувалося, наприклад,

ПОЛІГОН ((205,4 68,9,204,5 68,9,204,5 69,204,5 69,1,204,5 69,2,204,5 69,3,204,5 69,4,204,5 69,5,204,5 69,6,204,5 69,7,204,5 69,8,204,5 69,9,204,5 69,9000000000004,205,4 69,9,205,4 69,3,205,4 68,9))

ПОЛІГОН ((204,5 69,9000000000004,204,5 70,204,5 70,1,204,5 70,2,204,5 70,3,204,5 70,4,206,8 70,4,209,5 70,4,209,5 70,3,209,5 70,2,209,5 70,1,209,5 70,209,5 69,9,205,4 69,9,204,5 69,9000000000004))

ПОЛІГОН ((206,8 70,4,204,5 70,4,204,5 70,5,204,5 70,6,204,5 70,7,204,5 70,8,204,5 70,9,204,5 71,204,5 71,1,204,5 71,2,204,5 71,3,204,5 71,4,206,8 71,4,206,8 70,4))

Очевидно, що ST_AsText - це лише для ілюстрації, і вам доведеться налаштувати, якщо ви хочете ідентифікатор шляху.

Ключовим висновком є те, що ST_Polygonize очікує рядки рядків, які вже описують контур многокутника , що і є ST_Node (ST_Collect (....) у вищесказаному.


Це дійсно круто, я можу підтвердити, що це рішення працює! З іншого боку, мені цікаво, чому ST_Polygonize()кажуть, що для цього потрібні рядкові рядки, або який випадок використання для цього, не вимагаючи ST_Node()спочатку
Еван Керролл

1
@EvanCarroll. Я думаю, що відповідь полягає в тому, що ST_Polygonize приймає рядки, які вже є в наборі, що представляє собою багатокутник, тоді як рядки в цьому питанні складають кілька можливих багатокутників. Я розумію, що саме це робить ST_Node. Я спробую далі розслідувати та оновити відповідь.
Джон Пауелл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.