19 votos

Cómo crear una cara tampones o líneas paralelas en PostGIS?

Estoy buscando una manera de crear los llamados a una cara tampones o líneas paralelas en PostGIS. Ejemplo: 1. buffer, 2. de un lado, 3. de ambos lados

alt text

He encontrado alguna discusión en la lista de correo de 2009 y la información que se ha implementado en GEOS, pero nada acerca de la actual PostGIS estado.

En caso de que la función no está implementada aún, ¿sabe usted las soluciones? Es posible para cortar uno de los lados de un normal buffer?

13voto

Robert Höglund Puntos 5572

Adecuada a una cara con amortiguadores se supone que han aterrizado en la 1.5, pero me parece que mientras que los estilos que se hizo de la tierra, unilateralidad no lo hacen. Sin embargo, existe una corriente de conjunto de parches que expone GEOSSingleSidedBuffer y realiza la cara de amortiguamiento como se esperaba, bajo el nombre ST_OffsetCurve; véase más información en el boleto #413. En uso:

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)

4voto

akdom Puntos 6724

Este ejemplo crea dos polígonos en cualquiera de los lados de un linestring. Se requiere PostGIS 1.5 o superior. No estoy seguro de lo bien que va a hacer frente a las líneas que se cruzan a sí mismas.

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

));

Se emite:

                        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)

El código funciona de la siguiente manera:

  1. El búfer de la cadena de línea utilizando ST_Buffer. Tomamos ventaja de la PostGIS 1.5 cuentan con el apoyo personalizado de tapones con el fin de no especificar la tapa de extremo. Vea el ejemplo de abajo.
  2. Dividir el búfer polígono en dos, utilizando la línea original, utilizando el método documentado en la wiki.

Esto podría ser mejorado para hacer frente con el auto-cruce de líneas en el futuro.

A buffered linestring with a flat endcap

0voto

Porque yo todavía no puedo comentar aquí, puedo añadir a esta respuesta

SCW dar la mejor respuesta,

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)

Pero se parece a la función de cambio
http://postgis.refractions.net/docs/ST_OffsetCurve.html

Ahora el 'right' el parámetro no es necesario. El uso positivo de la distancia creará lado izquierdo y negativo de la distancia creará el lado derecho

También no hay ninguna revisión necesaria con mi 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"

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X