हमारे पास एक भूमि प्रोटोकॉल है जहां हमें 1x1 किमी कोशिकाओं का फिशनेट प्राप्त होता है। कुछ कोशिकाओं को यादृच्छिक रूप से चुना जाता है। हमें प्रत्येक सेल में 4 अंक डालने की आवश्यकता है और इन बिंदुओं को एक सड़क पर भी होना चाहिए। अंकों के बीच की न्यूनतम दूरी हर कोशिका के प्रत्येक बिंदु के लिए 500 मीटर होनी चाहिए यदि पॉसबीएलएलई या यदि यह नहीं है, तो हम अधिकतम संभव दूरी चाहते हैं।
पहले प्रयास में हमने हर सेल को ST_CreateFishnet के साथ चार 500x500 मीटर की कोशिकाओं में विभाजित किया, फिर हमने उप-कोशिकाओं के केंद्रक पर बिंदुओं को निकटतम सड़क (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 परतों (यादृच्छिक कोशिकाओं, उप-फिसनेट और सड़कों के साथ फिशनेट) को एक संग्रह में डाल सकता हूं जिसे आप यहां पा सकते हैं ।
मुझे लगता है कि हम एक पुनरावर्ती एल्गोरिथ्म से बच नहीं सकते हैं जो कई संभावनाओं की कोशिश करता है लेकिन मुझे यकीन नहीं है।