Створіть точки на вказаній відстані одна від одної у клітинках випадкових мереж, перебуваючи на рядках


10

У нас є наземний протокол, де ми отримуємо рибну сітку з 1х1 км комірок. Деякі клітини вибираються випадковим чином. Нам потрібно поставити 4 бали у кожній комірці, і ці точки теж повинні бути на дорозі. Мінімальна відстань між точками повинна бути 500 м для кожної точки кожної комірки, ЯКЩО МОЖЛИВО, або якщо її немає, ми хочемо максимально можливу відстань.

У першій спробі ми розділили кожну клітинку на чотири комірки 500x500 м за допомогою ST_CreateFishnet, потім поставимо точки у центроїді підклітинок, а потім на найближчій дорозі (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 шари (рибальська мережа зі випадковими клітинками, суб-фішнет і дороги) в архів, який ви можете знайти тут .

Я думаю, ми не можемо уникнути рекурсивного алгоритму, який намагається використовувати багато можливостей, але я не впевнений.

введіть тут опис зображення


Чи можете ви поділитися кодом, яким ви користувалися до цього часу?
Cushen

Чи є інші обмеження? Так було б легше, наприклад, почати з точки в найвіддаленішому куті підклітини, зробивши менше шансів, що вам доведеться відкинути інші точки за занадто близько?
Сімбамангу

Так, добре почати з точок у кутах, коли на розглянутому куті немає інших комірок, що торкаються комірки. Точки повинні бути на мінімальній відстані один від одного по всій сітці.
Ніколя Буасто

Відповіді:


1

Чи готові ви це зробити в R або python, посилаючись на вашу базу даних PostGIS? Якщо ви використовували ST_DumpPoints на всіх лініях у кожній клітинці 1x1 км, ви повинні мати можливість використовувати один з багатьох доступних алгоритмів для вибору 4 балів з відстанню між кожніми> 500 м або якомога далі один від одного.

Можливо, один із алгоритмів, згаданих у Вікіпедії для проблеми з рюкзаком, https://en.wikipedia.org/wiki/Knapsack_problem , дасть вам кілька ідей. Або я думаю, що алгоритм MCMC спрацював би добре.

Якщо дві сітки опираються одна на одну, чи має значення відстань між точками сусідніх сіток?


Щоб відповісти на ваше останнє запитання. Так, як сказано в моєму останньому коментарі: "Бали повинні бути на мінімальній відстані один від одного по всій сітці". Дякую за твою допомогу.
Nicolas Boisteault
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.