ฉันกำลังทำงานในด้านของไอโซนีและอัลกอริธึมพื้นฐาน ตอนนี้สิ่งที่ทำให้เกิดปัญหาไม่ใช่การคำนวณถ้า isochrone ตัวเอง แต่การสร้างภาพของผลลัพธ์
ผลลัพธ์ของอัลกอริทึม isochrone ของฉันคือจุดและขอบ ในความเป็นจริงฉันมีวิธีแก้ปัญหาการทำงาน แต่สำหรับ 3873 edge และสำหรับ 1529 nodes สิ่งต่าง ๆ ดูเหมือนจะใช้ตลอดไป (ประมาณ 2.0 วินาทีบนแล็ปท็อป Lenovo T440 ของฉันซึ่งมี CPU Core i7 และ SSD ความเร็วสูง) แทนที่จะวินาทีฉันต้องการอะไรมากกว่าเช่น msec :-)
บางทีใครบางคนสามารถช่วยฉันในการลดเวลาการคำนวณที่จำเป็นในการสร้างรูปหลายเหลี่ยมซึ่งมองเห็นพื้นที่ที่สามารถเข้าถึงได้
แต่รอ ... สิ่งแรกก่อน!
นี่คือการมองเห็นของขอบที่ฉันเป็นผลการคำนวณของ isochrone ของฉัน:
ขอบเหล่านี้จะถูกเก็บไว้ในตารางฐานข้อมูล PostGIS และเป็น linestrings ง่าย
สิ่งที่ฉันต้องการแสดงต่อผู้ใช้มีลักษณะดังนี้: สังเกตบริเวณที่ไม่ได้เชื่อมต่อในทิศใต้และทิศตะวันออกของภาพ สิ่งเหล่านี้ควรวาดเป็นพื้นที่แยกต่างหาก (ดังนั้นจึงไม่อนุญาตการรวมที่นี่ :-))
ขณะนี้ฉันกำลังใช้การค้นหานี้:
SELECT ST_AsGeoJson(St_Transform(ST_Multi(ST_Collect(polygons)), 4326)) AS coverage FROM (
SELECT ST_MakePolygon(ST_ExteriorRing(ST_GeometryN(segments, generate_series(1, ST_NumGeometries(segments))))) AS polygons FROM (
SELECT ST_Union(ST_Buffer("GEOMETRY", 20, 'quad_segs=2')) AS segments FROM my_edges AS a
) AS b
) AS c
ฉันทำการทดลองแล้วและยังอ่านเอกสารจำนวนมาก แต่ฉันไม่สามารถหาทางออกที่ดีกว่าได้
ในสายตาของฉันปัญหาใหญ่คือการใช้ ST_Union (ตามที่ระบุไว้ในเอกสารฟังก์ชั่นนี้อาจช้า) สิ่งที่น่าสนใจมากคือการแทนที่ด้วย ST_Collect ดูเหมือนจะทำให้การคำนวณ ST_Buffer ช้าลงดังนั้นแบบสอบถามทั้งหมดต่อไปนี้จะใช้เวลานานยิ่งขึ้นแม้ว่าจะไม่เติมเต็มพื้นที่ระหว่างขอบ (มันจะสร้างบัฟเฟอร์รอบ ๆ เส้นเท่านั้น ):
SELECT ST_AsGeoJson(St_Transform(ST_Multi(ST_Collect(polygons)), 4326)) AS coverage FROM (
SELECT ST_Buffer(ST_Collect(ST_LineMerge("GEOMETRY")), 20, 'quad_segs=2') AS polygons FROM my_edges AS a
) AS b
ระบบของฉันใช้เวลาประมาณ 3.8 วินาที (เกือบสองเท่าของเวลา) ข้อสรุปแรกของฉันจากเกณฑ์มาตรฐานเล็กน้อยนี้คือ ST_Buffer เริ่มช้าลงอย่างไม่คาดคิดเมื่อพูดถึง MultiLineStrings (ยิ่งช้ากว่าเมื่อสร้างบัฟเฟอร์สำหรับแต่ละบรรทัดและรวมบัฟเฟอร์ - ซึ่งในสายตาของฉันแปลกไป)
ฉันยังพยายามใช้รูปร่างอัลฟา (โดยใช้การดำเนินการจาก pgRouting) แต่เนื่องจากไม่มีค่าอัลฟาที่จะตั้งค่า (และในความเป็นจริงฉันจะไม่จริงตอนนี้ซึ่งเป็นค่าที่จะตั้งค่าดังกล่าว) ฉันเพิ่งได้รูปหลายเหลี่ยม ดังนั้นฉันจะสูญเสียพื้นที่ในภาคใต้และตะวันออกเป็นภูมิภาคแยกซึ่งไม่ใช่สิ่งที่ฉันต้องการ)
ST_Polygonize (ซึ่งเป็นสิ่งแรกที่อยู่ในใจของฉัน) ไม่ได้ให้ผลลัพธ์ที่ใช้ได้ แต่บางทีฉันอาจพลาดบางสิ่งที่นี่ ...
มีวิธีที่ดีกว่าในการสร้างพื้นที่ที่แสดงใน PostGIS หรือไม่ อาจจะด้วยการใช้รหัสจาวา (jts) หรือรหัสจาวาสคริปต์ฝั่งไคลเอ็นต์ (jsts)? ในความเป็นจริงฉันสามารถอยู่กับการสูญเสียรายละเอียดตราบใดที่พื้นที่ที่แสดงในผลลัพธ์ของฉันแยกจากกันและการคำนวณได้เร็วขึ้น (มาก)