Creazione di buffer unilaterali o linee parallele in PostGIS?


19

Sto cercando un modo per creare i cosiddetti buffer unilaterali o linee parallele in PostGIS. Esempio: 1. buffer, 2. un lato, 3. entrambi i lati

testo alternativo

Ho trovato alcune discussioni sulla mailing list del 2009 e informazioni che sono state implementate in GEOS , ma nulla sullo stato attuale di PostGIS.

Nel caso in cui la funzione non sia ancora implementata, conosci qualche soluzione? È possibile tagliare un lato di un buffer normale?


Quindi stai cercando un equivalente di "offset" in AutoCAD?
Dassouki,

@dassouki: mi dispiace, non conosco AutoCAD. Ma penso che UMN Mapserver abbia un'opzione "offset" che farebbe quello che sto cercando.
underdark

Come creare buffer unilaterali o linee parallele, da una tabella con 600 linee?

Benvenuti nel sito. Se l'attuale set di risposte non risolve il tuo problema, dovresti aprirlo come una nuova domanda (e indicare perché questa domanda non risponde al tuo problema). All'interno del formato del sito, questo non è un posto adatto per fare questa affermazione, in quanto non è una risposta alla domanda.
Andy W,

Come posso creare una linea parallela in una tabella MULTILINESTRING?
Felipe Costa,

Risposte:


13

Si supponeva che i buffer a un lato corretti fossero atterrati in 1.5 , ma mi sembra che mentre gli stili sono atterrati, il lato non ce l'ha fatta. Esiste tuttavia un patchset corrente che espone GEOSSingleSidedBuffered esegue il buffer a un lato come previsto , sotto il nome ST_OffsetCurve; vedere ulteriori dettagli nel ticket n . 413 . In 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)

Ciao, sto cercando di usare questa soluzione ma non uso spesso Postgis: ho testato questa query e ho ottenuto alcuni valori di output, ma come posso tradurli in funzionalità? Voglio solo le linee alla fine, sia come parte della tabella originale, sia una nuova. Questa è la mia domanda: selezionare ST_AsText (ST_OffsetCurve (test_data_.geom, test_data_.buffer_dis, 'join = mitre mitre_limit = 5.0')) da test_data_;
kflaw,

@kflaw - probabilmente l'hai già capito, ma devi solo aggiungere all'inizio della query: "crea newtable come" o per una vista ", crea o sostituisci vista newview come" seguito dall'istruzione select.
jbalk

4

Questo esempio crea due poligoni su entrambi i lati di una stringa lineare. Richiede PostGIS 1.5 o versione successiva. Non sono sicuro di come riuscirà a far fronte alle linee che si incrociano.

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

));

Emette:

                        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)

Il codice funziona nel modo seguente:

  1. Buffer il linestring usando ST_Buffer. Approfittiamo della funzione PostGIS 1.5 che supporta endcaps personalizzati per non specificare alcun limite. Vedi esempio sotto.
  2. Dividi il poligono bufferizzato in due, usando la linea originale, usando il metodo documentato nel wiki .

Ciò potrebbe essere migliorato per far fronte alle linee auto-attraversanti in futuro.

Un linestring tamponato con un tappo piatto


3

Questa modifica crea due linee parallele. Richiede PostGIS 1.5 o versione successiva.

geometria o wkt richiesti e distanza nel buffer


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

-------------- RISULTATI

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


0

Perché non posso ancora commentare qui, aggiungo questa risposta

SCW dà la risposta migliore,

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)

Ma sembra che il cambio di funzione
http://postgis.refractions.net/docs/ST_OffsetCurve.html

Ora il 'right'parametro non è necessario. L'uso della distanza positiva creerà il lato sinistro e la distanza negativa creerà il lato destro

Inoltre non è necessaria alcuna patch con il mio 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"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.