Wie finde ich das Polygon, in dem ein Punkt liegt?

8

Ich habe eine Ebene mit polygonalen Merkmalen. Jedes Feature hat Attribute und Werte. Ich habe auch eine Liste von Koordinaten und möchte wissen, in welchem ​​Merkmal (oder Polygon) die Koordinaten liegen.

Könnte mich bitte jemand anleiten, wie ich das anstellen soll? Gibt es eine Funktion in der API, die mir helfen kann, mein Ziel zu erreichen, oder sollte ich einen Algorithmus für die rechnerische Geometrie verwenden, um dies selbst zu tun? Ich weiß, wie man Letzteres macht, aber es würde mir einige Zeit sparen, wenn es bereits eine eingebaute Funktion gäbe.

Vielen Dank.

Shubham Goyal
quelle

Antworten:

6

Nur wenige Funktionen

Was Sie wahrscheinlich tun möchten, ist:

  1. Erstellen Sie eine Liste von QgsPoint aus Ihren Koordinaten
  2. Durchlaufen Sie alle Ebenenmerkmale (Polygone).
  3. Schleife über die Liste der Punkte (innerhalb der Iteration)
  4. Rufen Sie feature.geometry (). Includes (point) auf, um zu überprüfen, ob Sie eine Übereinstimmung haben

Natürlich können Sie jetzt die Leistung verbessern, wenn Sie z. B. wissen, dass ein Punkt nur in einem Polygon enthalten sein kann. Sie können einen Punkt aus der Liste entfernen, sobald das entsprechende Polygon gefunden wurde.

Viele Funktionen (mit SpatialIndex)

Wie in den Kommentaren ausgeführt, kann ein räumlicher Index verwendet werden, um den Prozess erheblich zu beschleunigen.

Die Schritte hier wären

  1. Erstellen Sie eine Liste von QgsPoint aus Ihren Koordinaten
  2. Erstellen Sie einen QgsSpatialIndex
  3. Durchlaufen Sie alle Ebenenmerkmale (Polygone).
  4. Fügen Sie die Funktionen mit insertFeature zu Ihrem Index hinzu
  5. Iterieren Sie über alle Ihre Punkte
  6. Rufen Sie index.intersects (QgsRectangle (Punkt, Punkt)) auf, um zu überprüfen, ob Sie eine Übereinstimmung haben

Es gibt auch ein Codebeispiel von NathanW

Matthias Kuhn
quelle
Ah, ich wusste nichts über den Aufruf von feature.geometry.contains (point). Ich habe Mathplotlib verwendet. pastebin.com/61LSeMWv Bitte verzeihen Sie die Unordnung meines Codes. Ich habe es eilig und werde es später reinigen.
Shubham Goyal
Ich habe Ihre Lösung nicht implementiert und kann daher nicht mit Sicherheit sagen, ob sie funktioniert oder nicht. Aber ich glaube es sollte und so markiere ich dies als die richtige Antwort :)
Shubham Goyal
2
Könnte dies mit einem QgsSpatialIndex beschleunigt werden?
Snorfalorpagus
1
Ich würde die Verwendung eines QgsSpatailIndex sehr empfehlen. Es gibt ein Beispiel bei nathanw.net/2013/01/04/…
Nathan W
6

Zunächst müssen Sie die Koordinatenliste in Ihr Projekt importieren. In diesem Tutorial wird gut erklärt, wie das geht: http : //qgis.spatial Thoughts.com/2012/01/importing-spreadsheets-or-csv-files-to.html

Wenn Ihr Projekt beide Ebenen (Polygone und Punkte) enthält, gehen Sie zu Vektor> Datenverwaltungstools> Attribute nach Standort verknüpfen

Geben Sie hier die Bildbeschreibung ein

Sie erhalten ein Fenster, in dem Sie definieren können, welche Ebenen Sie kombinieren möchten:

Geben Sie hier die Bildbeschreibung ein

  • Legen Sie Ihre Punktebene als 'Zielvektorebene' fest.
  • Legen Sie Ihre Polygonebene als "Vektorebene verbinden" fest.
  • Definieren Sie Ihr Ausgabe-Shapefile (es wird ein neues erstellt. Wenn Sie es verpasst haben, bleiben die Originaldaten erhalten).
  • Sie können festlegen, dass alle Daten im neuen Shapefile beibehalten werden, auch wenn keine Übereinstimmung mit einem Polygon besteht: Aktivieren Sie "Alle Datensätze beibehalten (einschließlich nicht übereinstimmender Zieldatensätze)".

OK klicken'. Das neue Shapefile wird erstellt und Sie werden gefragt, ob Sie die neue Ebene zum Inhaltsverzeichnis hinzufügen möchten. Klicken Sie erneut auf OK.

Öffnen Sie die Attribut-Tabelle des neu hinzugefügten Shapefiles, und Sie werden sehen, dass alle Features des entsprechenden Polygons zu dem Punkt hinzugefügt werden, der in diesem Polygon liegt.

PieterB
quelle
2

Eine einfachere Möglichkeit, dies mit PyQGIS zu tun. Ich dachte mir, dass Sie ein QgsRectangleObjekt mit einem einzelnen Punkt konstruieren und damit QgsFeatureRequestFeatures aus der Ebene filtern können, die es schneidet.

point = QgsPoint(10, 10)
# Construct a QgsRectange with the same point
rect = QgsRectangle(point, point)
req = QgsFeatureRequest()
req.setFilterRect(rect)
# You get the feature that intersects the point
f = layer.getFeatures(req).next()
räumliche Gedanken
quelle
0

In QuantumGIS können Sie die Liste der Koordinaten mit der Funktion 'Begrenzte Textebene hinzufügen' hinzufügen (wenn es sich um eine CSV-Datei handelt). Fügen Sie auch die Polygone hinzu. Dann können Sie einen 'Schnittpunkt' oder 'Punkte im Polygon' erstellen.

Stefan
quelle