เรามีโปรโตคอลที่ดินที่เราได้รับแหอวนของเซลล์ 1x1 กม. เซลล์บางส่วนได้รับการสุ่มเลือก เราต้องใส่ 4 คะแนนในแต่ละเซลล์และคะแนนเหล่านี้จะต้องอยู่บนถนนด้วย ระยะห่างต่ำสุดระหว่างจุดต้องมี 500m สำหรับทุก ๆ จุดของทุกเซลล์หากเป็นไปได้หรือหากไม่ใช่เราต้องการระยะทางที่เป็นไปได้สูงสุด
ในการทดลองครั้งแรกเราแบ่งทุกเซลล์ในสี่เซลล์ 500x500 m ด้วยST_CreateFishnetจากนั้นเราวางจุดที่ centroid ของเซลล์ย่อยแล้วบนถนนที่ใกล้ที่สุด (ST_ClosestPoint) เราได้รับผลลัพธ์ที่ดี แต่ในตัวอย่างด้านล่างคุณสามารถเห็นจุดที่ 5 อยู่ใกล้เกินไปจาก 6 และสามารถเคลื่อนย้ายบนถนนด้านซ้าย
WITH
r1 AS ( -- only sub-cells which intersects random cells
SELECT id_maille, ROW_NUMBER() OVER() AS id_grille, fishnet_500.geomgrille
FROM fishnet_500
JOIN t_mailles
ON ST_Intersects(ST_Buffer(t_mailles.geom,-200), fishnet_500.geomgrille) -- buffer < 0 to not select neightbours
)
,
r2 AS ( -- cut roads in every cells
SELECT id_maille, id_grille, ST_Intersection((ST_Dump(roads.geom)).geom, r1.geomgrille) as geomroute
FROM roads
JOIN r1
ON ST_Intersects(roads.geom, r1.geomgrille)
)
-- select point on each road the closest to cell centroid
SELECT r2.id_maille, r2.id_grille, ST_ClosestPoint(ST_Union(r2.geomroute),ST_Centroid(r1.geomgrille)) as geomipa
FROM r2
JOIN r1
ON r2.id_grille = r1.id_grille
GROUP BY r2.id_maille, r2.id_grille, r1.geomgrille
ORDER BY r2.id_maille, r2.id_grille
หากคุณต้องการที่จะให้มันลองผมใส่ 3 ชั้น (ตาข่ายกับเซลล์สุ่มย่อย fisnet และถนน) ในที่เก็บที่คุณสามารถหาที่นี่
ฉันเดาว่าเราไม่สามารถหลีกเลี่ยงอัลกอริทึมแบบเรียกซ้ำที่พยายามเป็นไปได้มากมาย แต่ฉันไม่แน่ใจ