Buat poin pada jarak tertentu dari satu sama lain dalam sel jala acak saat berada di linestrings

10

Kami memiliki protokol pertanahan tempat kami menerima jala sel 1x1 km. Beberapa sel dipilih secara acak. Kita perlu menempatkan 4 titik di setiap sel dan titik-titik ini harus berada di jalan juga. Jarak minimum antara titik harus 500 m untuk setiap titik di setiap sel JIKA MUNGKIN atau jika tidak, kami ingin jarak maksimum yang dimungkinkan.

Dalam percobaan pertama kami membagi setiap sel dalam empat sel 500x500 m dengan ST_CreateFishnet lalu kami menempatkan titik pada centroid dari sub-sel kemudian di jalan terdekat (ST_ClosestPoint). Kami mendapatkan beberapa hasil bagus, tetapi dalam contoh di bawah ini Anda dapat melihat bahwa titik 5 terlalu dekat dari 6 dan dapat dipindahkan di jalan kiri.

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

Jika Anda ingin mencobanya, saya letakkan 3 layer (jala ​​dengan sel acak, sub-fisnet, dan jalan) di arsip yang dapat Anda temukan di sini .

Saya kira kita tidak bisa menghindari algoritma rekursif yang mencoba banyak kemungkinan tetapi saya tidak yakin.

masukkan deskripsi gambar di sini

Nicolas Boisteault
sumber
Bisakah Anda membagikan kode yang telah Anda gunakan sejauh ini?
Cushen
Apakah ada kendala lain? Ini akan membuatnya lebih mudah, misalnya, untuk memulai dengan titik di sudut terjauh dari sel, sehingga kecil kemungkinan Anda harus membuang titik lain karena terlalu dekat?
Simbamangu
Ya itu baik untuk memulai dengan poin di sudut-sudut ketika tidak ada sel lain menyentuh sel di sudut dianggap. Poin harus berada pada jarak minimum satu sama lain di seluruh grid.
Nicolas Boisteault

Jawaban:

1

Apakah Anda bersedia melakukan ini dalam R atau python dengan menautkan ke database PostGIS Anda? Jika Anda menggunakan ST_DumpPoints pada semua baris di setiap sel 1x1 km, Anda harus dapat menggunakan salah satu dari banyak algoritma yang tersedia untuk memilih 4 titik dengan jarak antara masing-masing> 500m, atau sejauh mungkin terpisah.

Mungkin salah satu algoritma yang disebutkan di Wikipedia untuk masalah ransel, https://en.wikipedia.org/wiki/Knapsack_problem , akan memberi Anda beberapa ide. Atau, saya pikir algoritma MCMC akan bekerja dengan baik.

Jika dua grid berbatasan satu sama lain, apakah jarak antara titik-titik dalam grid yang berdekatan itu penting?

jgm_GIS
sumber
Untuk menjawab pertanyaan terakhir Anda. Ya, seperti yang dikatakan dalam komentar terakhir saya: "Poin harus berada pada jarak minimum satu sama lain di seluruh grid". Terima kasih untuk bantuannya.
Nicolas Boisteault