Обчисліть паралельні лінії вздовж центральної лінії в PostGIS


10

У мене в базі даних PostgreSQL є вулиці (лінія дорожнього руху) та побудова полігонових таблиць. Приклад сценарію такий:

Зразок сценарію

Проблема:

Мені потрібно обчислити паралельні лінії вздовж вулиці на перетині 50 метрів буфера навколо вулиці та найближчого будівельного полігону з обох сторін. Бажаний вихідний сценарій:

Бажаний вихідний сценарій

Що я спробував:

Мій підхід:

 1) Generate 50m buffer around street layer
 2) get the intersection of buffer and polygons
 3) Compute the distance
 4) Draw offset curves (parallel lines) at both sides of street layer
 5) Merge both curves to get parallel lines at the intersection

Ось моя спроба:

    WITH street_buffer AS (
     SELECT
      street.gid street_id,
      street.geom street_geom,
      ST_Buffer(street.geom, 50, 'endcap=square join=round') geom1,
      building.geom  geom2  
     FROM street
     LEFT JOIN building on ST_DWithin(building.geom, street.geom, 50)
     ORDER BY street_id
    ),
    selected_buildings AS (
     SELECT
      street_id,
      street_geom,
      ST_Intersection(geom1, geom2) geom
     FROM street_buffer
    ),
    distance AS (
     SELECT 
      street_id,
      street_geom,
      ST_Distance(street_geom, geom) as dist
     FROM selected_buildings 
    ),
    curves AS (
     SELECT 
      street_id,
      ST_OffsetCurve(ST_LineMerge(street_geom), dist) as curve1,
      ST_OffsetCurve(ST_LineMerge(street_geom), -dist) as curve2
     FROM distance
     ORDER BY street_id
    )
    SELECT 
     street_id,
     ST_Union(curve1, curve2) geom 
    FROM curves
    ORDER BY street_id

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

EDIT_1:

Фактичний вихід вищевказаного коду:

code_output

Тоді як у наведеному вище висновку потрібні лише жовті паралельні лінії (зміщення кривих до найближчих багатокутників по обидва боки вулиці):

необхідні рядки фактичного виводу

Хто-небудь може підказати мені, як отримати бажаний вихід?


Чи можете ви також додати зображення фактичного виводу? Це допомагає зрозуміти проблему.
нахил

@tilt: я змінив питання. Щойно додали фактичний вихід і потрібні паралельні рядки у фактичному виході.
хайлк

Питання складніше, ніж ви думаєте. Жадає вам дізнатися, з якого боку вулиці стоять будинки. Тільки тоді ви можете знайти найближчих з обох сторін. Ось публікація з прикладом коду для пошуку правильної сторони: gis.stackexchange.com/questions/156578/…
tilt

Насправді можуть бути випадки, коли будівлі знаходяться лише на одній стороні (я б назвав це винятками). Я можу змінити свій код для обробки винятків, як тільки я зможу досягти бажаного результату. Угорі ви все ще бачите будівництво багатокутників з обох сторін. У цей момент моя вимога - отримати паралельні лінії по обидва боки вулиці (як ті, які я показав на малюнку). Що стосується вашого посилання, я можу використати приклад коду, щоб поліпшити свій вищезгаданий код, можливо, пізніше.
хайлк

Я бачу одне, що буфер є зайвим. Ви можете просто використовувати stdwithin і використовувати 50 як відстань. (Виберіть вулиці, будинки, де st_dwithin (вулиці, будинки, 50))
jbalk

Відповіді:


1

Якщо ви змінили CTE відстані таким чином:

distance AS (
 SELECT 
  street_id,
  street_geom,
  MIN(ST_Distance(street_geom, geom)) as dist
 FROM selected_buildings
 GROUP BY street_id, street_geom
)

тоді для кожної вулиці буде повернуто лише найкоротшу відстань, і одна пара зміщених ліній буде створена на цій відстані.


Дякую за пропозицію. Я перевірю його і побачу, чи дає він очікуваний результат. Я копав, щоб вирішити цю проблему. Я виявив одну божевільну ідею: щоб почати з буфера на 1 м навколо вулиці та програматично наростити буфер І шукати будівлі з обох сторін, поки кількість будівель не дорівнює 2, а потім повернути цю відстань буфера як ширину вулиці. Кінцева мета всіх вищезазначених вправ.
khajlk

Це правда, що за допомогою вашої пропозиції генерується лише одна пара зміщення. Однак жовті паралельні лінії, показані вище, все ще відсутні :(
khajlk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.