PostGIS: ST_Buffer ด้านเดียวของ linestring ให้ผลลัพธ์แปลก ๆ
ในตัวอย่างด้านล่างฉันมีตาราง PostGIS แบบ Linestring (สีดำและสีเหลือง) และรูปหลายเหลี่ยมเอาต์พุต ST_Buffer ด้านเดียว (สีแดง) ระยะห่างของบัฟเฟอร์ขึ้นอยู่กับค่าแอตทริบิวต์ที่เก็บไว้ในตาราง linestring
อย่างที่คุณเห็นว่าบัฟเฟอร์ตัวใดตัวหนึ่งไม่ถูกต้องและตัดส่วนของตัวมันเองออกไปจำนวนหนึ่ง เหตุใดจึงเกิดขึ้น แก้ไขได้หรือไม่ ดูเหมือนจะเป็นปัญหาที่ส่วนของเส้นไลเนอร์กลายเป็นเว้า

ลองทำด้วยตัวคุณเองโดยใช้ข้อความค้นหาที่คล้ายกัน:
SELECT ST_BUFFER('LineString (638327 331059, 638337 331048, 638337 331037, 638343 331023, 638358 331014, 638380 330991, 638382 330978, 638391 330966, 638410 330959, 638420 330953)',50,'side=right')
ในอีกตัวอย่างหนึ่งที่ฉันเห็นสิ่งนี้เกิดขึ้น (เส้นสีดำคือ 1 คุณลักษณะเช่นเดียวกับรูปหลายเหลี่ยมบัฟเฟอร์):

และลองใช้สิ่งนี้กับสิ่งนี้:
SELECT ST_BUFFER('LineString (600296 172961, 600304 172962, 600307 172965, 600307 172969, 600307 172971, 600309 172974, 600308 172976, 600307 172979, 600306 172981, 600307 172982, 600311 172980, 600313 172979, 600317 172979, 600321 172982, 600325 172982, 600327 172979, 600328 172976, 600331 172974, 600338 172974)',10,'side=right')
เพิ่มระยะห่างบัฟเฟอร์สำหรับผลลัพธ์ของคนแปลกหน้า EPSG: 27700 ในทั้งสองกรณี
คำตอบ
สิ่งเหล่านี้เกิดจากข้อบกพร่องในอัลกอริทึมบัฟเฟอร์ด้านเดียว (ไม่ใช่ข้อบกพร่องซึ่งเป็นข้อ จำกัด ที่ทราบกันดีของการออกแบบอัลกอริทึม)
นี้ถูกบันทึกไว้เป็น GEOS ปัญหา ยังไม่มี ETA สำหรับการแก้ไข
ฉันได้สร้างไปป์ไลน์วิธีแก้ปัญหาที่แก้ไขปัญหานี้แล้ว มันเกี่ยวข้องกับการสร้างตารางกลางชั่วคราวระหว่างทาง แต่คุณสามารถลบได้ทันที
- บัฟเฟอร์สายของคุณโดยใช้
ST_BUFFER
ปกติคุณจะไม่มีเอาต์พุตที่วุ่นวาย (เช่นอย่าใช้'side=left/right'
พารามิเตอร์) - ใช้
ST_Split
เพื่อแบ่งบัฟเฟอร์จากขั้นตอนที่ 1 ครึ่งตามแนวกึ่งกลางโดยใช้เส้นST_UNION
เส้นที่มีเส้นเชื่อมติดกัน! สิ่งนี้จะช่วยให้มั่นใจได้ว่าเส้นตัดขยายผ่านและเกินบัฟเฟอร์ มันจะไม่ตัดอะไรเป็นอย่างอื่น - บัฟเฟอร์บรรทัดของคุณอีกครั้ง แต่คราวนี้จะบัฟเฟอร์ด้านเดียวเท่านั้น นี่ต้องเป็นด้านที่คุณไม่ต้องการ
- สร้างตารางจุดโดยใช้
ST_PointOnSurface
สำหรับรูปร่างบัฟเฟอร์ด้านข้างที่ 'ผิด' - ใช้ตารางจุดใหม่นี้เพื่อลบรูปหลายเหลี่ยมใด ๆ ออกจากบัฟเฟอร์รูปหลายเหลี่ยมแบบแยก (จากขั้นตอนที่ 2) ที่พบที่ตัดกันจุด
- ตอนนี้คุณเหลือรูปร่างบัฟเฟอร์เต็มรูปแบบโดยเอาด้าน 'ผิด' ออก กล่าวคือ. คุณเหลือด้านที่ถูกต้องที่ต้องการ
ฉันได้สรุปสิ่งนี้อย่างหนาแน่นและสันนิษฐานสำหรับแต่ละส่วนของเส้นตรงคุณมีเส้นเชื่อมที่อยู่ติดกันเพื่อช่วยในการตัด ฉันทำเช่นนี้กับแนวชายฝั่งที่มีส่วนต่างๆกว่า 1,000 ส่วน ดังนั้นฉันจึงใช้ตารางโฮสต์เพื่อแทรกการทำซ้ำแต่ละขั้นตอนข้างต้นลงใน ในการวนซ้ำแต่ละส่วนของเส้นตรงฉันตรวจสอบให้แน่ใจว่าตารางบรรทัดมีคอลัมน์รหัสที่เพิ่มขึ้นโดยอัตโนมัติ (ดังนั้นสำหรับแต่ละส่วนของบรรทัดฉันสามารถรวมเข้ากับส่วนก่อนและหลังได้เช่น n-1, n, n + 1) ฉันจะอัปเดตคำตอบนี้เร็ว ๆ นี้เพื่อชี้แจงเพิ่มเติม