Kami memiliki protokol pertanahan tempat kami menerima jala sel 1x1 km. Beberapa sel dipilih secara acak. Kita perlu menempatkan 4 titik di setiap sel dan titik-titik ini harus berada di jalan juga. Jarak minimum antara titik harus 500 m untuk setiap titik di setiap sel JIKA MUNGKIN atau jika tidak, kami ingin jarak maksimum yang dimungkinkan.
Dalam percobaan pertama kami membagi setiap sel dalam empat sel 500x500 m dengan ST_CreateFishnet lalu kami menempatkan titik pada centroid dari sub-sel kemudian di jalan terdekat (ST_ClosestPoint). Kami mendapatkan beberapa hasil bagus, tetapi dalam contoh di bawah ini Anda dapat melihat bahwa titik 5 terlalu dekat dari 6 dan dapat dipindahkan di jalan kiri.
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
Jika Anda ingin mencobanya, saya letakkan 3 layer (jala dengan sel acak, sub-fisnet, dan jalan) di arsip yang dapat Anda temukan di sini .
Saya kira kita tidak bisa menghindari algoritma rekursif yang mencoba banyak kemungkinan tetapi saya tidak yakin.