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

19

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

альтернативный текст

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

Если функция еще не реализована, знаете ли вы какие-нибудь обходные пути? Можно ли отрезать одну сторону нормального буфера?

Подземье
источник
Итак, вы ищете эквивалент «смещения» в AutoCAD?
Дассуки
@dassouki: Извините, я не знаю AutoCAD. Но я думаю, что UMN Mapserver имеет опцию «смещения», которая будет делать то, что я ищу.
Подземье
Как создать односторонние буферы или параллельные строки из таблицы, содержащей 600 строк?
Добро пожаловать на сайт. Если текущий набор ответов не решает вашу проблему, вы должны открыть его как новый вопрос (и указать, почему этот вопрос не отвечает вашей проблеме). В формате сайта это не подходящее место, чтобы сделать это заявление, так как это не ответ на вопрос.
Энди W
Как я могу создать параллельные линии в таблице 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)
SCW
источник
Привет! Я пытаюсь использовать это решение, но не часто использую postgis - я проверил этот запрос и получил некоторые выходные значения, но как мне перевести их в функции? Я просто хочу, чтобы строки в конце были либо частью исходной таблицы, либо новой. Это мой запрос: выберите ST_AsText (ST_OffsetCurve (test_data_.geom, test_data_.buffer_dis, 'join = miter mitre_limit = 5.0')) из test_data_;
kflaw
@kflaw - вы, наверное, уже поняли это, но вам просто нужно добавить в начало запроса: «создать newtable as» или для представления, «создать или заменить представление newview as», а затем оператор 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. Разделите буферный многоугольник на две части, используя оригинальную линию, используя метод, описанный в вики .

Это может быть улучшено, чтобы справиться с самопересекающимися линиями в будущем.

Буферная подкладка с плоским торцом

fmark
источник
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'параметр не нужен. Использование положительного расстояния создаст левую сторону, а отрицательное расстояние создаст правую сторону

Также не требуется патч с моим postgis

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"
Хуан Карлос Оропеза
источник