ฉันใช้PL/R
ฟังก์ชั่นและPostGIS
สร้างรูปหลายเหลี่ยม voronoi รอบจุดต่างๆ ฟังก์ชั่นที่ผมใช้ถูกกำหนดไว้ที่นี่ เมื่อฉันใช้ฟังก์ชั่นนี้บนชุดข้อมูลเฉพาะฉันได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:
Error : ERROR: R interpreter expression evaluation error
DETAIL: Error in pg.spi.exec(sprintf("SELECT %3$s AS id,
st_intersection('SRID='||st_srid(%2$s)||';%4$s'::text,'%5$s')
AS polygon FROM %1$s WHERE st_intersects(%2$s::text,'SRID='||st_srid(%2$s)||';%4$s');",
:error in SQL statement : Error performing intersection: TopologyException: found non-noded
intersection between LINESTRING (571304 310990, 568465 264611) and LINESTRING (568465
264611, 594406 286813) at 568465.05533706467 264610.82749605528
CONTEXT: In R support function pg.spi.exec In PL/R function r_voronoi
จากการตรวจสอบข้อผิดพลาดส่วนนี้:
Error performing intersection: TopologyException: found non-noded intersection between
LINESTRING (571304 310990, 568465 264611) and LINESTRING (568465 264611, 594406 286813)
at 568465.05533706467 264610.82749605528
นี่คือปัญหาที่ปรากฏในรายการด้านบน:
ตอนแรกฉันคิดว่าข้อความนี้อาจเกิดจากการมีจุดที่เหมือนกันและพยายามแก้ไขโดยใช้st_translate()
ฟังก์ชั่นที่ใช้ในวิธีต่อไปนี้:
ST_Translate(geom, random()*20, random()*20) as geom
สิ่งนี้จะแก้ไขปัญหาได้ แต่ข้อกังวลของฉันคือตอนนี้ฉันแปลคะแนนทั้งหมดได้สูงถึง ~ 20m ในทิศทาง x / y ฉันไม่สามารถบอกได้ว่าต้องการจำนวนการแปลที่เหมาะสมเท่าไร ตัวอย่างเช่นในชุดข้อมูลนี้ผ่านการทดลองและข้อผิดพลาด a 20m * random number
ก็โอเค แต่ฉันจะบอกได้อย่างไรว่าสิ่งนี้จะต้องใหญ่กว่านี้
จากภาพด้านบนฉันคิดว่าปัญหาคือจุดตัดกับเส้นตรงในขณะที่อัลกอริทึมพยายามตัดจุดด้วยรูปหลายเหลี่ยม ฉันไม่แน่ใจว่าฉันควรทำอะไรเพื่อให้แน่ใจว่าจุดนั้นอยู่ในรูปหลายเหลี่ยมแทนที่จะตัดกันด้วยเส้น ข้อผิดพลาดเกิดขึ้นในบรรทัดนี้:
"SELECT
%3$s AS id,
st_intersection(''SRID=''||st_srid(%2$s)||'';%4$s''::text,''%5$s'') AS polygon
FROM
%1$s
WHERE
st_intersects(%2$s::text,''SRID=''||st_srid(%2$s)||'';%4$s'');"
ฉันได้อ่านคำถามก่อนหน้านี้แล้วอะไรคือ "จุดตัดที่ไม่ได้ซ้อนกัน" เพื่อพยายามทำความเข้าใจปัญหานี้ให้ดีขึ้นและขอขอบคุณคำแนะนำในการแก้ไขปัญหาให้ดีที่สุด
WHERE ST_IsValid(p.geom)
เพื่อกรองคะแนนในตอนแรก