Membuat buffer satu sisi atau garis paralel di PostGIS?


19

Saya mencari cara untuk membuat apa yang disebut buffer satu sisi atau garis paralel di PostGIS. Contoh: 1. buffer, 2. satu sisi, 3. kedua sisi

teks alternatif

Saya telah menemukan beberapa diskusi di milis dari 2009 dan informasi bahwa itu telah diimplementasikan dalam GEOS , tetapi tidak ada yang mengenai status PostGIS saat ini.

Jika fungsi ini belum diimplementasikan, apakah Anda tahu ada solusi? Apakah mungkin untuk memotong satu sisi buffer normal?


Jadi, Anda mencari yang setara dengan "offset" di AutoCAD?
dassouki

@dassouki: Maaf, saya tidak tahu AutoCAD. Tapi saya pikir UMN Mapserver memiliki opsi "offset" yang akan melakukan apa yang saya cari.
underdark

Bagaimana cara membuat buffer satu sisi atau garis paralel, dari tabel yang memiliki 600 garis?

Selamat datang di situs ini. Jika rangkaian jawaban saat ini tidak menyelesaikan masalah Anda, Anda harus membuka ini sebagai pertanyaan baru (dan nyatakan mengapa pertanyaan ini tidak menjawab masalah Anda). Dalam format situs ini bukan tempat yang tepat untuk membuat pernyataan ini, karena ini bukan jawaban untuk pertanyaan.
Andy W

Bagaimana saya bisa membuat garis paralel dalam tabel MULTILINESTRING?
Felipe Costa

Jawaban:


13

Buffer satu sisi yang benar seharusnya telah mendarat di 1,5 , tetapi tampak bagi saya bahwa sementara gaya memang mendarat, sisi tidak membuatnya masuk. Namun ada patchset saat ini yang mengekspos GEOSSingleSidedBufferdan melakukan buffer satu sisi seperti yang diharapkan , dengan nama ST_OffsetCurve; lihat latar belakang lebih lanjut di tiket # 413 . Digunakan:

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)

Hai Saya mencoba menggunakan solusi ini tetapi tidak sering menggunakan postgis - Saya telah menguji permintaan ini dan mendapatkan beberapa nilai ouput, tetapi bagaimana cara menerjemahkannya menjadi fitur? Saya hanya ingin baris pada akhirnya, baik sebagai bagian dari tabel asli, atau yang baru. Ini adalah permintaan saya: pilih ST_AsText (ST_OffsetCurve (test_data_.geom, test_data_.buffer_dis, 'join = mitre_limit = 5.0')) dari test_data_;
kflaw

@ kflaw - Anda mungkin sudah menemukan ini, tetapi Anda hanya perlu menambahkan ke awal kueri: "buat tabel baru sebagai" atau untuk tampilan, "buat atau ganti tampilan tampilan baru sebagai" diikuti oleh pernyataan pilih.
jbalk

4

Sampel ini membuat dua poligon di kedua sisi linestring. Itu membutuhkan PostGIS 1.5 atau lebih tinggi. Saya tidak yakin seberapa baik itu akan mengatasi garis yang melintasi diri mereka sendiri.

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

));

Ini menghasilkan:

                        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)

Kode bekerja dengan cara berikut:

  1. Buffer linestring menggunakan ST_Buffer. Kami memanfaatkan fitur PostGIS 1.5 yang mendukung endcaps khusus untuk menentukan tanpa batas sama sekali. Lihat contoh di bawah ini.
  2. Split poligon buffered menjadi dua, menggunakan baris asli, menggunakan metode yang didokumentasikan dalam wiki .

Ini dapat ditingkatkan untuk mengatasi garis penyilangan diri di masa depan.

Linestring buffered dengan endcap datar


3

Modifikasi ini menciptakan dua linestring paralel. Itu membutuhkan PostGIS 1.5 atau lebih tinggi.

diperlukan geometri atau wkt, dan jarak dalam 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))

-------------- HASIL

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


0

Karena saya masih tidak bisa berkomentar di sini, saya menambahkan jawaban ini

SCW memberikan jawaban terbaik,

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)

Tetapi sepertinya fungsinya mengubah
http://postgis.refractions.net/docs/ST_OffsetCurve.html

Sekarang 'right'parameternya tidak perlu. Menggunakan jarak positif akan membuat sisi kiri dan jarak negatif akan membuat sisi kanan

Juga tidak ada tambalan yang diperlukan dengan postgis saya

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"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.