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


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.