Створення односторонніх буферів або паралельних ліній у PostGIS?


19

Я шукаю спосіб створення так званих однобічних буферів або паралельних ліній в PostGIS. Приклад: 1. буфер, 2. односторонній, 3. обидві сторони

alt текст

Я знайшов дещо обговорення у списку розсилки з 2009 року та інформацію про те, що він реалізований у GEOS , але нічого про поточний статус PostGIS.

Якщо функція ще не реалізована, чи знаєте ви якісь обхідні шляхи? Чи можна відрізати одну сторону звичайного буфера?


Отже, ви шукаєте еквівалент "компенсувати" в AutoCAD?
dassouki

@dassouki: Вибачте, я не знаю AutoCAD. Але я думаю, що у сервера UMN Mapserver є варіант «офсет», який би робив те, що я шукаю.
underdark

Як створити односторонні буфери або паралельні лінії з таблиці, що містить 600 рядків?

Ласкаво просимо на сайт. Якщо поточний набір відповідей не вирішує вашу проблему, слід відкрити це як нове запитання (і вказати, чому це питання не відповідає вашій проблемі). У форматі веб-сайту це невідповідне місце для заявки, оскільки це не є відповіддю на запитання.
Енді Ш

Як я можу створити паралельні лінії в таблиці MULTILINESTRING?
Феліпе Коста,

Відповіді:


13

Належні однобічні буфери повинні були висадитися в 1,5 , але мені здається, що в той час, як стилі приземлялися, однобічність не встигла . Однак є поточний набір патчів, який розкриває GEOSSingleSidedBufferі виконує однобічний буфер, як очікувалося , під назвою ST_OffsetCurve; дивіться подальшу інформацію в квитку № 413 . У вживанні:

select ST_AsText(ST_OffsetCurve(
ST_GeomFromText('LINESTRING(10 10,10 20, 20 20 )'),
1,'right', 'join=mitre mitre_limit=5.0'));
--------------
LINESTRING(20 19,11 19,11 10)

Привіт, я намагаюся використовувати це рішення, але не використовую postgis часто - я перевірив цей запит і отримаю деякі вихідні значення, але як я перекладаю їх у функції? Я просто хочу, щоб рядки були зрештою, або як частина оригінальної таблиці, або нова. Це мій запит: виберіть ST_AsText (ST_OffsetCurve (test_data_.geom, test_data_.buffer_dis, 'join = miter mitre_limit = 5.0')) від test_data_;
kflaw

@kflaw - ви, мабуть, це вже з'ясували, але вам просто потрібно додати до початку запиту: "створити нову таблицю як" або для перегляду ", створити або замінити перегляд нового перегляду як", після чого слід зазначити оператор select.
jbalk

4

Цей зразок створює два полігони по обидві сторони від рядкової лінії. Для нього потрібен PostGIS 1.5 або вище. Я не впевнений, наскільки добре він впорається з лініями, що перетинаються між собою.

SELECT ST_AsText(geom)

FROM ST_Dump ((

SELECT 
  ST_Polygonize(GEOMUNION(ST_Boundary(ST_Buffer(the_geom, 0.5, 'endcap=flat join=round')), the_geom)) AS buffer_sides 
FROM
  (SELECT ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)') AS the_geom) AS table1

));

Він виводить:

                        st_astext

------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------
 POLYGON((0.5 5,0.509607359798385 5.09754516100806,0.538060233744357 5.19134171618254,0.584265193848727 5.2777851165098,
0.646446609406726 5.35355339059327,0.722214883490199 5.41573480615127,0.808658283817455 5.46193976625564,0.9024548389919
36 5.49039264020162,1 5.5,5 5.5,5 5,1 5,1 1,0.5 1,0.5 5))
 POLYGON((5 5,5 4.5,1.5 4.5,1.5 1,1 1,1 5,5 5))
(2 rows)

Код працює наступним чином:

  1. Буферуйте рядок за допомогою ST_Buffer. Ми скористаємося функцією PostGIS 1.5, яка підтримує спеціальні кінцеві шафи, щоб взагалі не вказати кінцеву кришку. Дивіться приклад нижче.
  2. Розбийте буферизований багатокутник на два, використовуючи оригінальну лінію, використовуючи метод, зафіксований у вікі .

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

Буферизований рядковий рядок з плоскою накладкою


3

Ця модифікація створює дві паралельні рядкові рядки. Для нього потрібен PostGIS 1.5 або вище.

необхідна геометрія або wkt та відстань у буфері


SELECT astext(
     st_removepoint( 
     st_removepoint(        st_linemerge(ST_Difference(st_boundary(geom),ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)')))         ,0),
      st_npoints(st_linemerge(ST_Difference(st_boundary(geom),ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)'))))-2)

    ) as parallel
    FROM ST_Dump ((
    SELECT 
    ST_Polygonize(st_union(ST_Boundary(ST_Buffer(geometria, 0.5, 'endcap=flat join=mitre mitre_limit=5.0')), geometria)) AS buffer_sides 
    FROM
    (SELECT ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)') 
        AS geometria) AS tabla))

-------------- РЕЗУЛЬТАТИ

"LINESTRING(0.5 1,0.5 5.5,5 5.5)"
"LINESTRING(5 4.5,1.5 4.5,1.5 1)"


0

Оскільки я досі не можу тут коментувати, я додаю цю відповідь

SCW дасть найкращу відповідь,

select ST_AsText(ST_OffsetCurve(
ST_GeomFromText('LINESTRING(10 10,10 20, 20 20 )'),
1, 'right', 'join=mitre mitre_limit=5.0'));
--------------
LINESTRING(20 19,11 19,11 10)

Але схоже на зміну функції
http://postgis.refractions.net/docs/ST_OffsetCurve.html

Тепер 'right'параметр не потрібен. Використання позитивної відстані створить ліву сторону, а негативну відстань створить праву частину

Також не потрібен патч з моїми постгітами

SELECT PostGIS_full_version();
"POSTGIS="2.0.3 r11132" GEOS="3.3.8-CAPI-1.7.8" 
PROJ="Rel. 4.8.0, 6 March 2012" GDAL="GDAL 1.9.2, 
released 2012/10/08" LIBXML="2.7.8" LIBJSON="UNKNOWN" RASTER"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.