Twórz punkty w określonej odległości od siebie w losowych komórkach kabaretki podczas przebywania na liniach


10

Mamy protokół lądowy, w którym otrzymujemy kabaretkę z komórkami 1x1 km. Niektóre komórki są wybierane losowo. Musimy umieścić 4 punkty w każdej komórce i te punkty też muszą być na drodze. Minimalna odległość między punktami musi wynosić 500 m dla każdego punktu każdej komórki JEŚLI MOŻLIWE, a jeśli nie, chcemy maksymalnej możliwej odległości.

W pierwszej próbie podzieliliśmy każdą komórkę na cztery komórki 500 x 500 m za pomocą ST_CreateFishnet, a następnie umieściliśmy punkty na środku subkomórek, a następnie na najbliższej drodze (ST_ClosestPoint). Mamy dobre wyniki, ale w poniższym przykładzie widać, że punkt 5 jest zbyt blisko od 6 i można go przenieść na lewą drogę.

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

Jeśli chcesz spróbować, umieściłem 3 warstwy (kabaretki z losowymi komórkami, sub-fisnet i drogi) w archiwum, które możesz znaleźć tutaj .

Chyba nie możemy uniknąć algorytmu rekurencyjnego, który próbuje wielu możliwości, ale nie jestem pewien.

wprowadź opis zdjęcia tutaj


Czy możesz udostępnić kod, którego użyłeś do tej pory?
— Cushen

Czy są jakieś inne ograniczenia? Ułatwiłoby to na przykład rozpoczęcie od punktu w najdalszym rogu podkomórki, co zmniejszyłoby prawdopodobieństwo odrzucenia innych punktów, ponieważ znajdują się zbyt blisko?
— Simbamangu,

Tak, dobrze jest zacząć od punktów w rogach, gdy żadna inna komórka nie dotyka komórki w rozważanym rogu. Punkty muszą znajdować się w minimalnej odległości od siebie na całej siatce.
— Nicolas Boisteault,

Odpowiedzi:


1

Czy chcesz to zrobić w języku R lub python, łącząc się z bazą danych PostGIS? Jeśli użyłeś ST_DumpPoints na wszystkich liniach w każdej komórce 1 x 1 km, powinieneś być w stanie użyć jednego z wielu dostępnych algorytmów, aby wybrać 4 punkty z odległością między każdym z nich> 500 m lub jak najdalej od siebie.

Być może jeden z algorytmów wymienionych w Wikipedii dla problemu plecaka, https://en.wikipedia.org/wiki/Knapsack_problem , da ci kilka pomysłów. Lub myślę, że algorytm MCMC działałby dobrze.

Jeśli dwie siatki przylegają do siebie, czy odległość między punktami w sąsiednich siatkach ma znaczenie?


Aby odpowiedzieć na twoje ostatnie pytanie. Tak, jak powiedziałem w moim ostatnim komentarzu: „Punkty muszą znajdować się w minimalnej odległości od siebie na całej siatce”. Dziękuję za pomoc
— Nicolas Boisteault
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.