Ich habe ein Polygon-Feature und möchte darin Punkte erzeugen können. Ich brauche das für eine Klassifizierungsaufgabe.
Zufällige Punkte zu generieren, bis man sich innerhalb des Polygons befindet, würde nicht funktionieren, da es wirklich unvorhersehbar ist, wie lange es dauert.
Antworten:
Zerlegen Sie das Polygon zunächst in Dreiecke und generieren Sie dann Punkte in diesen . (Für eine gleichmäßige Verteilung gewichten Sie jedes Dreieck nach seiner Fläche.)
quelle
Wenn Sie ein QGIS-Tag auf diese Frage setzen: Das Random Points-Tool kann mit einer Grenzfläche verwendet werden.
Wenn Sie nach Code suchen, sollte der zugrunde liegende Quellcode des Plugins hilfreich sein.
quelle
Sie können die Ausdehnung des Polygons bestimmen und dann die Zufallszahlengenerierung für X- und Y-Werte innerhalb dieser Ausdehnungen einschränken.
Grundlegende Vorgehensweise: 1) Bestimmen Sie maxx, maxy, minx, miny der Polygonscheitelpunkte. 2) Generieren Sie zufällige Punkte unter Verwendung dieser Werte als Grenzen. 3) Testen Sie jeden Punkt auf Schnittpunkte mit Ihrem Polygon Prüfung
Hier ist ein Algorithmus (C #) für den Schnittpunkttest:
quelle
Es gibt einige gute Bibliotheken, die das meiste für Sie tun.
Beispiel mit [shapely] [1] in Python.
Oder verwenden Sie
.representative_point()
, um einen Punkt innerhalb des Objekts zu erhalten (wie von dain erwähnt):quelle
representative_point
Methode verwenden: shapely.readthedocs.io/en/latest/…Wenn R eine Option ist, siehe
?spsample
imsp
Paket. Die Polygone können aus jedem von GDAL unterstützten Format eingelesen werden, das in das rgdal-Paket integriert ist, und können dannspsample
mit einer Vielzahl von Abtastoptionen direkt auf importierte Objekte angewendet werden .quelle
Ich möchte eine Lösung anbieten, die sehr wenig GIS-Analyse erfordert. Insbesondere müssen keine Polygone trianguliert werden.
Der folgende Algorithmus, der im Pseudocode angegeben ist, bezieht sich auf einige einfache Operationen zusätzlich zu den grundlegenden Funktionen zur Listenverarbeitung (Erstellen, Suchen von Längen, Anhängen, Sortieren, Extrahieren von Unterlisten und Verketten) und Generieren von zufälligen Gleitkommazahlen im Intervall [0, 1):
Diese sind alle in fast jeder GIS- oder Grafikprogrammierungsumgebung verfügbar (und wenn nicht, einfach zu codieren).
Clip
darf keine degenerierten Polygone zurückgeben (dh solche mit einer Fläche von Null).Die Prozedur
SimpleRandomSample
erhält effizient eine Liste von Punkten, die zufällig innerhalb eines Polygons verteilt sind. Es ist eine Hülle fürSRS
, die das Polygon in kleinere Stücke zerlegt, bis jedes Stück kompakt genug ist, um effizient abgetastet zu werden. Dazu verwendet es eine vorberechnete Liste von Zufallszahlen, um zu entscheiden, wie viele Punkte jedem Stück zugewiesen werden sollen.SRS kann durch Ändern des Parameters "abgestimmt" werden
t
. Dies ist das maximale Verhältnis von Begrenzungsrahmen zu Polygonfläche, das toleriert werden kann. Wenn Sie es klein (aber größer als 1) machen, werden die meisten Polygone in viele Teile geteilt. Wenn Sie es groß machen, werden möglicherweise viele Testpunkte für einige Polygone verworfen (gewunden, mit Splittern oder voller Löcher). Dies garantiert, dass die maximale Zeit zum Abtasten des ursprünglichen Polygons vorhersehbar ist.Die nächste Prozedur ruft sich bei Bedarf rekursiv auf. Der mysteriöse Ausdruck
t*N + 5*Sqrt(t*N)
schätzt konservativ eine Obergrenze für die Anzahl der benötigten Punkte unter Berücksichtigung der Zufallsvariabilität. Die Wahrscheinlichkeit, dass dies fehlschlägt, beträgt nur 0,3 pro Million Prozeduraufrufe. Erhöhen Sie 5 bis 6 oder sogar 7, um diese Wahrscheinlichkeit zu verringern, wenn Sie möchten.quelle
Wenn Ihr Polygon konvex ist und Sie alle Scheitelpunkte kennen, sollten Sie eine "zufällige" konvexe Gewichtung der Scheitelpunkte in Betracht ziehen, um einen neuen Punkt abzutasten, der garantiert innerhalb der konvexen Hülle liegt (in diesem Fall Polygon).
Angenommen, Sie haben ein N-seitiges konvexes Polygon mit Eckpunkten
Dann erzeugen Sie zufällig N konvexe Gewichte
Der zufällig ausgewählte Punkt ist dann gegeben durch
Es gibt verschiedene Möglichkeiten, N konvexe Gewichte abzutasten
Wenn Ihr Polygon nicht sehr stark nicht konvex ist, sollten Sie es zunächst in eine konvexe Hülle umwandeln. Dies sollte zumindest die Anzahl der Punkte, die außerhalb Ihres Polygons liegen, stark einschränken.
quelle
Die Aufgabe ist in GRASS GIS (ein Befehl) mit v.random sehr einfach zu lösen .
Im Folgenden finden Sie ein Beispiel zum Hinzufügen von 3 zufälligen Punkten zu ausgewählten Polygonen (hier Postleitzahlenbereiche der Stadt Raleigh, NC) auf der Handbuchseite. Durch Ändern der SQL-Anweisung "where" können die Polygone ausgewählt werden.
quelle
Link beantworten
https://gis.stackexchange.com/a/307204/103524
Drei Algorithmen mit unterschiedlichen Ansätzen.
Git Repo Link
Funktion =============================================== =================
Verwenden Sie die Funktion mit einer einfachen Abfrage. Die Geometrie muss gültig sein und ein Polygon, mehrere Polygone oder eine Hüllkurve
SELECT I_Grid_Point_Distance(geom, 50, 61) from polygons limit 1;
Ergebnis =============================================== ====================
Zweite Funktion basierend auf dem Nicklas Avén- Algorithmus. Habe versucht mit irgendwelchen SRID umzugehen.
Ich habe folgende Änderungen am Algorithmus vorgenommen.
Funktion =============================================== =================
Verwenden Sie es mit einer einfachen Abfrage.
SELECT I_Grid_Point(geom, 22, 15, false) from polygons;
Ergebnis ====================================== =================
Funktion ====================================== =================
Verwenden Sie es mit einer einfachen Abfrage.
SELECT I_Grid_Point_Series(geom, 22, 15, false) from polygons;
Ergebnis ====================================== ========================quelle