我们有一个陆地协议,在该协议中,我们收到一个1x1公里网孔的鱼网。一些单元格是随机选择的。我们需要在每个单元格中放置4个点,这些点也必须在路上。如果可能,则每个像元的每个点的最小距离必须为500m,否则,我们希望最大距离。
在第一次尝试中,我们使用ST_CreateFishnet将每个像元划分为四个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层(带有随机单元格的鱼网,子Fisnet和道路)放在可以在此处找到的档案中。
我想我们不能避免尝试很多可能性的递归算法,但是我不确定。
您可以共享到目前为止使用的代码吗?
—
库申
还有其他限制吗?例如,从子单元格最远角的一个点开始比较容易,这样就不太可能因为太靠近而不得不舍弃其他点?
—
Simbamangu
是的,当没有其他像元触及所考虑的角上的像元时,最好从角上的点开始。在整个网格上,点之间的距离必须最小。
—
Nicolas Boisteault