우리는 1x1km 셀의 어망을받는 육상 프로토콜을 가지고 있습니다. 일부 세포는 무작위로 선택됩니다. 우리는 각 셀에 4 개의 포인트를 배치해야하며이 포인트도 도로에 있어야합니다. 가능 하다면 모든 셀의 모든 포인트에 대해 포인트 사이의 최소 거리는 500m가되어야 합니다.
첫 번째 시도에서 우리는 ST_CreateFishnet 을 사용 하여 모든 셀을 500x500m 셀 4 개로 나누고 하위 셀의 중심점에 포인트를 놓고 가장 가까운 도로 (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 및 도로가있는 어망)를 넣 습니다 .
많은 가능성을 시도하는 재귀 알고리즘을 피할 수는 없지만 확실하지 않습니다.