在线串上时,在随机鱼网的像元中以彼此指定的距离创建点


10

我们有一个陆地协议,在该协议中,我们收到一个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

Answers:


1

您是否愿意通过链接到PostGIS数据库在R或python中执行此操作?如果在每个1x1 km像元中的所有线上都使用ST_DumpPoints,则应该能够使用许多可用算法中的一种来选择4个点,且每个点之间的距离> 500m,或尽可能远。

也许Wikipedia上提到的背包问题的一种算法https://en.wikipedia.org/wiki/Knapsack_problem会给您一些想法。或者,我认为MCMC算法会很好用。

如果两个网格彼此邻接,相邻网格中的点之间的距离是否重要?


回答您的最后一个问题。是的,正如我在上一条评论中所说的那样:“在整个网格上,点必须彼此保持最小距离”。感谢您的帮助。
Nicolas Boisteault
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.