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