선 스트링에있는 동안 임의의 어망의 셀에서 서로 지정된 거리에서 점을 만듭니다.


10

우리는 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 및 도로가있는 어망)를 넣 습니다 .

많은 가능성을 시도하는 재귀 알고리즘을 피할 수는 없지만 확실하지 않습니다.

여기에 이미지 설명을 입력하십시오


지금까지 사용한 코드를 공유 할 수 있습니까?
Cushen

다른 제약이 있습니까? 예를 들어 하위 셀의 가장 먼 곳에서 시작하는 것이 더 쉬워 지므로 너무 가까운 다른 지점을 버릴 필요가 없습니까?
Simbamangu

그렇습니다. 구석에서 셀에 닿는 다른 셀이없는 경우 모퉁이의 점으로 시작하는 것이 좋습니다. 점은 전체 그리드에서 서로 최소 거리에 있어야합니다.
Nicolas Boisteault

답변:


1

R 또는 python에서 PostGIS 데이터베이스에 연결하여이 작업을 수행 하시겠습니까? 각 1x1km 셀의 모든 선에서 ST_DumpPoints를 사용하는 경우 사용 가능한 많은 알고리즘 중 하나를 사용하여 각> 500m 사이 또는 가능한 멀리 떨어져있는 4 개의 점을 선택할 수 있어야합니다.

배낭 문제에 대해 Wikipedia에서 언급 한 알고리즘 중 하나 인 https://en.wikipedia.org/wiki/Knapsack_problem 은 몇 가지 아이디어를 제공합니다. 또는 MCMC 알고리즘이 잘 작동한다고 생각합니다.

두 개의 격자가 서로 인접하면 인접한 격자의 점 사이 거리가 중요합니까?


마지막 질문에 답하십시오. 그렇습니다. 마지막 의견에서 말했듯이 "점은 전체 그리드에서 서로 최소 거리에 있어야합니다". 도와 주셔서 감사합니다.
Nicolas Boisteault
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.