Chúng tôi có một giao thức trên mặt đất nơi chúng tôi nhận được một mạng lưới các tế bào 1x1 km. Một số tế bào được chọn ngẫu nhiên. Chúng ta cần đặt 4 điểm trong mỗi ô và những điểm này cũng phải nằm trên một con đường. Khoảng cách tối thiểu giữa các điểm phải là 500m cho mỗi điểm của mỗi ô NẾU KHẢ NĂNG hoặc nếu không, chúng tôi muốn khoảng cách tối đa có thể.
Trong lần thử đầu tiên, chúng tôi đã chia mỗi ô thành bốn ô 500x500 m với ST_CreateFishnet sau đó chúng tôi đặt các điểm tại tâm của các ô phụ sau đó trên con đường gần nhất (ST_ClosestPoint). Chúng tôi nhận được một số kết quả tốt nhưng trong ví dụ bên dưới, bạn có thể thấy điểm 5 quá gần từ 6 và có thể được di chuyển trên đường bên trái.
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
Nếu bạn muốn dùng thử, tôi đặt 3 lớp (fishnet với các ô ngẫu nhiên, fisnet phụ và đường) trong một kho lưu trữ mà bạn có thể tìm thấy ở đây .
Tôi đoán chúng ta không thể tránh một thuật toán đệ quy thử nhiều khả năng nhưng tôi không chắc chắn.