Mam funkcję wielokąta i chcę być w stanie generować w niej punkty. Potrzebuję tego do jednego zadania klasyfikacyjnego.
Generowanie losowych punktów, dopóki jeden nie znajdzie się w wielokącie, nie zadziałałoby, ponieważ to naprawdę nieprzewidywalny czas, jaki zajmuje.
Odpowiedzi:
Zacznij od rozłożenia wielokąta na trójkąty, a następnie wygeneruj punkty wewnątrz nich . (Aby uzyskać równomierny rozkład, zważ każdy trójkąt według jego powierzchni.)
źródło
Gdy umieścisz znacznik QGIS w tym pytaniu: narzędzia Losowe punkty można używać z warstwą graniczną.
Jeśli szukasz kodu, pomocny może być kod źródłowy wtyczki.
źródło
Możesz określić zasięg wielokąta, a następnie ograniczyć generowanie liczb losowych dla wartości X i Y w tych zakresach.
Podstawowy proces: 1) Określ maxx, maxy, minx, miny wierzchołków wielokąta, 2) Wygeneruj losowe punkty, używając tych wartości jako granic 3) Przetestuj każdy punkt pod kątem przecięcia z wielokątem, 4) Przestań generować, gdy masz wystarczającą liczbę punktów spełniających przecięcie test
Oto algorytm (C #) dla testu skrzyżowania:
źródło
Istnieje kilka dobrych bibliotek, które wykonują większość ciężkich zadań dla Ciebie.
Przykład użycia [foremnego] [1] w pythonie.
Lub użyj,
.representative_point()
aby uzyskać punkt w obiekcie (jak wspomniano przez dain):źródło
representative_point
metody: shapely.readthedocs.io/en/latest/…Jeśli R jest opcją, patrz
?spsample
wsp
pakiecie. Wielokąty można odczytać z dowolnego formatu obsługiwanego przez GDAL wbudowanego w pakiet rgdal, a następniespsample
działa bezpośrednio na importowanym obiekcie z różnymi opcjami próbkowania.źródło
Chciałbym zaoferować rozwiązanie, które wymaga niewiele w zakresie analizy GIS. W szczególności nie wymaga triangulacji żadnych wielokątów.
Poniższy algorytm, podany w pseudokodzie, odnosi się do kilku prostych operacji oprócz podstawowych możliwości obsługi list (tworzenie, znajdowanie długości, dołączanie, sortowanie, wyodrębnianie podlist i konkatenację) oraz generowanie losowych liczb zmiennoprzecinkowych w przedziale [0, 1):
Wszystkie są dostępne w prawie każdym środowisku programowania GIS lub graficznym (i łatwe do kodowania, jeśli nie).
Clip
nie mogą zwracać zdegenerowanych wielokątów (tzn. tych o zerowym obszarze).Procedura
SimpleRandomSample
skutecznie uzyskuje listę punktów losowo rozmieszczonych w wielokącie. Jest to opakowanie dlaSRS
, która rozbija wielokąt na mniejsze kawałki, aż każdy kawałek będzie wystarczająco zwarty, aby można było z niego efektywnie pobrać próbki. Aby to zrobić, wykorzystuje wstępnie obliczoną listę liczb losowych, aby zdecydować, ile punktów należy przeznaczyć na każdy kawałek.SRS można „dostroić”, zmieniając parametr
t
. Jest to maksymalny stosunek ramki granicznej: pola powierzchni wielokąta, który może być tolerowany. Zmniejszenie (ale większe niż 1) spowoduje, że większość wielokątów zostanie podzielona na wiele części; jej powiększenie może spowodować odrzucenie wielu punktów próbnych dla niektórych wielokątów (faliste, z fragmentami lub pełne dziur). Gwarantuje to, że maksymalny czas na próbkowanie oryginalnego wielokąta jest przewidywalny.Następna procedura wywołuje się rekurencyjnie, jeśli to konieczne. Tajemnicze wyrażenie
t*N + 5*Sqrt(t*N)
konserwatywnie szacuje górną granicę liczby punktów, które będą potrzebne, uwzględniając zmienność szans. Prawdopodobieństwo, że to się nie powiedzie, wynosi tylko 0,3 na milion wywołań procedur. Zwiększ od 5 do 6 lub nawet 7, aby zmniejszyć to prawdopodobieństwo, jeśli chcesz.źródło
Jeśli twój wielokąt jest wypukły i znasz wszystkie wierzchołki, możesz rozważyć wykonanie „losowego” wypukłego ważenia wierzchołków, aby wypróbować nowy punkt, który z pewnością będzie leżał wewnątrz wypukłego kadłuba (w tym przypadku wielokąta).
Powiedzmy na przykład, że masz wielokąt wypukły N z wierzchołkami
Następnie wygeneruj losowo N wypukłych wag
Losowo próbkowany punkt jest następnie podawany przez
Może być inny sposób próbkowania N wypukłych wag
Kiedy twój wielokąt nie jest bardzo niezbyt wypukły, możesz najpierw rozważyć przekształcenie go w wypukły kadłub. Powinno to przynajmniej w dużym stopniu ograniczyć liczbę punktów leżących poza twoim wielokątem.
źródło
Zadanie jest bardzo łatwe do rozwiązania w GRASS GIS (jedno polecenie) za pomocą v.random .
Poniżej przykład, jak dodać 3 losowe punkty do wybranych wielokątów (tutaj obszary kodu pocztowego miasta Raleigh, NC) ze strony podręcznika. Zmieniając instrukcję SQL „where”, można wybrać wielokąt (y).
źródło
Link do odpowiedzi
https://gis.stackexchange.com/a/307204/103524
Trzy algorytmy wykorzystujące różne podejścia.
Git Repo Link
Funkcja ================================================= ==================
Użyj funkcji z prostym zapytaniem, geometria musi być poprawna i wielokąta, wielokąta lub obwiedni
SELECT I_Grid_Point_Distance(geom, 50, 61) from polygons limit 1;
Wynik ================================================= =====================
Druga funkcja oparta na Nicklas Avén algorytmie . Próbowałem obsłużyć dowolny identyfikator SRID.
Zastosowałem następujące zmiany w algorytmie.
Funkcja ================================================= ==================
Użyj go za pomocą prostego zapytania.
SELECT I_Grid_Point(geom, 22, 15, false) from polygons;
Wynik ================================================= ==================
Funkcja ================================================= =================
Użyj go za pomocą prostego zapytania.
SELECT I_Grid_Point_Series(geom, 22, 15, false) from polygons;
Wynik ================================================= =========================źródło