1x1 kmセルのフィッシュネットを受け取る陸上プロトコルがあります。一部のセルはランダムに選択されます。各セルに4つのポイントを配置する必要があり、これらのポイントも道路上になければなりません。ポイント間の最小距離は、すべての細胞のすべてのポイントのために500メートルでなければならない、可能な場合、またはそれがない場合は、我々は可能な最大距離を求めています。
最初の試行では、ST_CreateFishnetを使用してすべてのセルを4つの500x500 mセルに分割し、次にサブセルの重心にポイントを配置してから、最も近い道路(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つのレイヤー(ランダムなセルを含むフィッシュネット、サブフィスネット、および道路)をここにあるアーカイブに配置します。
多くの可能性を試す再帰アルゴリズムは避けられないと思いますが、よくわかりません。