Mais

Criando buffers unilaterais ou linhas paralelas em PostGIS?

Criando buffers unilaterais ou linhas paralelas em PostGIS?


Estou procurando uma maneira de criar os chamados buffers unilaterais ou linhas paralelas em PostGIS. Exemplo: 1. buffer, 2. um lado, 3. ambos os lados

Encontrei algumas discussões na lista de e-mails de 2009 e informações de que foi implementado no GEOS, mas nada sobre o status atual do PostGIS.

Caso a função ainda não tenha sido implementada, você conhece alguma solução alternativa? É possível cortar um lado de um buffer normal?


Os buffers unilaterais adequados deveriam ter caído no 1.5, mas me parece que, embora os estilos tenham caído, os lados não entraram. No entanto, há um patchset atual que expõeGEOSSingleSidedBuffere executa o buffer unilateral conforme o esperado, sob o nomeST_OffsetCurve; veja mais informações no tíquete # 413. Em uso:

selecione ST_AsText (ST_OffsetCurve (ST_GeomFromText ('LINESTRING (10 10,10 20, 20 20)'), 1, 'right', 'join = mitre_limit = 5,0')); -------------- LINESTRING (20 19,11 19,11 10)

Este exemplo cria dois polígonos em cada lado de uma cadeia de linha. Requer PostGIS 1.5 ou superior. Não tenho certeza se ele vai lidar bem com as linhas que se cruzam.

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));

Ele produz:

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)) polígono ((5 5,5 4,5,1,5 4,5,1,5 1,1 1,1 5,5 5)) (2 linhas)

O código funciona da seguinte maneira:

  1. Faça o buffer da cadeia de linha usando ST_Buffer. Aproveitamos a vantagem do recurso PostGIS 1.5 que suporta tampas de extremidade personalizadas para não especificar nenhuma tampa de extremidade. Veja o exemplo abaixo.
  2. Divida o polígono em buffer em dois, usando a linha original, usando o método documentado no wiki.

Isso poderia ser melhorado para lidar com as linhas que se cruzam no futuro.


Essa modificação cria duas cadeias de linhas paralelas. Requer PostGIS 1.5 ou superior.

geometria necessária ou wkt e distância no buffer


SELECIONE 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) ('LINESTRING (1 1, 1 5, 5 5)')))) - 2)) como paralelo FROM ST_Dump ((SELECT ST_Polygonize (st_union (ST_Boundary (ST_Buffer (geometria, 0.5, 'endcap = flat join = mitre_limit = mitre 5.0 ')), geometria)) AS buffer_sides FROM (SELECT ST_GeomFromText (' LINESTRING (1 1, 1 5, 5 5) ') AS geometria) AS tabla))

-------------- RESULTADOS

"LINESTRING (0,5 1,0,5 5,5,5 5,5)" "LINESTRING (5 4,5,1,5 4,5,1,5 1)"


Porque ainda não posso comentar aqui, adiciono esta resposta

SCW dê a melhor resposta,

selecione ST_AsText (ST_OffsetCurve (ST_GeomFromText ('LINESTRING (10 10,10 20, 20 20)'), 1, 'right', 'join = mitre_limit = 5,0')); -------------- LINESTRING (20 19,11 19,11 10)

Mas parece que a função muda
http://postgis.refractions.net/docs/ST_OffsetCurve.html

Agora o'direito'parâmetro não é necessário. Usar a distância positiva criará o lado esquerdo e a distância negativa criará o lado direito

Também não é necessário patch com meu postgis

SELECT PostGIS_full_version (); "POSTGIS =" 2.0.3 r11132 "GEOS =" 3.3.8-CAPI-1.7.8 "PROJ =" Rel. 4.8.0, 6 de março de 2012 "GDAL =" GDAL 1.9.2, lançado em 2012/10/08 "LIBXML =" 2.7.8 "LIBJSON =" DESCONHECIDO "RASTER"

Assista o vídeo: BUFFER in Postgis STBuffer