การสร้างบัฟเฟอร์ด้านเดียวหรือเส้นคู่ขนานใน PostGIS


19

ฉันกำลังมองหาวิธีในการสร้างสิ่งที่เรียกว่าบัฟเฟอร์ด้านเดียวหรือเส้นคู่ขนานใน PostGIS ตัวอย่าง: 1. บัฟเฟอร์, 2. ด้านเดียว, 3. ทั้งสองด้าน

ข้อความแสดงแทน

ฉันได้พบการสนทนาบางอย่างในรายชื่อผู้รับจดหมายตั้งแต่ปี 2009และข้อมูลที่นำมาใช้ใน GEOSแต่ไม่มีอะไรเกี่ยวกับสถานะ PostGIS ปัจจุบัน

ในกรณีที่ฟังก์ชั่นยังไม่ได้ใช้งานคุณรู้จักการแก้ไขปัญหาใด ๆ หรือไม่? เป็นไปได้หรือไม่ที่จะตัดบัฟเฟอร์ด้านหนึ่งด้านใดด้านหนึ่ง?


ดังนั้นคุณกำลังมองหาสิ่งที่เทียบเท่ากับ "ชดเชย" ใน AutoCAD หรือไม่
dassouki

@dassouki: ขออภัยฉันไม่รู้ AutoCAD แต่ฉันคิดว่า UMN Mapserver มีตัวเลือก "ชดเชย" ที่จะทำสิ่งที่ฉันกำลังมองหา
underdark

วิธีสร้างบัฟเฟอร์ด้านเดียวหรือเส้นคู่ขนานจากตารางที่มี 600 บรรทัด

ยินดีต้อนรับสู่เว็บไซต์ หากชุดคำตอบปัจจุบันไม่สามารถแก้ปัญหาของคุณคุณควรเปิดเป็นคำถามใหม่ (และระบุว่าทำไมคำถามนี้ไม่ตอบปัญหาของคุณ) ภายในรูปแบบของเว็บไซต์นี้ไม่ใช่สถานที่ที่เหมาะสมในการจัดทำแถลงการณ์นี้เนื่องจากไม่ใช่คำตอบสำหรับคำถาม
Andy W

ฉันจะสร้างเส้นขนานในตาราง MULTILINESTRING ได้อย่างไร
Felipe Costa

คำตอบ:


13

บัฟเฟอร์ด้านเดียวที่เหมาะสมควรจะลงจอดใน 1.5แต่สำหรับฉันแล้วว่าในขณะที่รูปแบบการลงจอดด้านข้างไม่ได้ทำให้เกิดขึ้นอย่างไรก็ตามมีpatchset ปัจจุบันซึ่งเปิดตัวGEOSSingleSidedBufferและดำเนินการบัฟเฟอร์ด้านเดียวตามที่คาดไว้ ภายใต้ชื่อST_OffsetCurve; ดูต่อไปในพื้นหลังตั๋ว # ในการใช้งาน:

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)

สวัสดีฉันกำลังพยายามใช้วิธีแก้ปัญหานี้ แต่ไม่ได้ใช้ postgis บ่อยครั้ง - ฉันได้ทดสอบแบบสอบถามนี้และรับค่า ouput บางอย่าง แต่ฉันจะแปลสิ่งเหล่านั้นเป็นคุณลักษณะได้อย่างไร ฉันต้องการเส้นในท้ายที่สุดไม่ว่าจะเป็นส่วนหนึ่งของตารางเดิมหรืออันใหม่นี่คือข้อความค้นหาของฉัน: เลือก ST_AsText (ST_OffsetCurve (test_data_.geom, test_data_.buffer_dis, 'join = miter mitre_limit = 5.0') จาก test_data_;
kflaw

@kflaw - คุณอาจจะหาคำตอบได้แล้ว แต่คุณต้องเพิ่มไปยังจุดเริ่มต้นของแบบสอบถาม: "สร้าง newtable เป็น" หรือสำหรับมุมมอง "สร้างหรือแทนที่มุมมอง newview เป็น" ตามด้วยคำสั่ง select
jbalk

4

ตัวอย่างนี้สร้างรูปหลายเหลี่ยมสองรูปที่ด้านใดด้านหนึ่งของ linestring ต้องใช้ 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 ที่สนับสนุน endcaps ที่กำหนดเองเพื่อระบุไม่มีการปิดท้ายทั้งหมด ดูตัวอย่างด้านล่าง
  2. แบ่งรูปหลายเหลี่ยมบัฟเฟอร์ในสองโดยใช้สายเดิมโดยใช้วิธีการบันทึกไว้ในวิกิพีเดีย

สิ่งนี้อาจได้รับการปรับปรุงเพื่อรับมือกับเส้นทางการข้ามตนเองในอนาคต

linestring บัฟเฟอร์ที่มี endcap แบบแบน


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"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.