Weisen Sie ihren Polygonen Zentroide zu und verschieben Sie sie

9

Ich verwende QGIS 1.8 Lisboa. Wenn nach der Berechnung der Schwerpunkte aus einem Polygon-Shapefile einige außerhalb der Polygonumrisse liegen, möchte ich sie auf das Polygon verschieben, aus dem sie stammen. Das Kriterium sollte eindeutig sein, da ich sie verwenden muss, um Koordinaten zu extrahieren, die als Identifikationscode für das Polygon selbst verwendet werden sollen. Daher sollte die Prozedur bei jeder Ausführung für dasselbe Polygon dieselbe Punktposition ausgeben (keine zufällige Position wie die durch die Funktion "Zufallspunkte" angegebene, die bei jeder Ausführung ein neues Ergebnis liefert).

umbe1987
quelle
1
Klingt nach zwei Fragen. Wenn ich das richtig verstehe, möchten Sie (a) zufällige Punkte innerhalb eines Polygons hinzufügen und (b) ihnen oder dem Polygon eine eindeutige ID geben, die darauf basiert. Das Einfachste, was Ihnen für (a) in den Sinn kommt, ist, die vorhandenen Funktionen für zufällige Punkte in QGIS zu verwenden und diese Punktwolke dann einfach mit Ihrem Polygon zu schneiden.
Lynxlynxlynx
Die Verwendung von "Zufallspunkten" -Funktionen zu unterschiedlichen Zeiten mit denselben Polygonen führt zu unterschiedlichen Ergebnissen (dh die Position der von jedem Polygon abgeleiteten Punkte ist bei jeder neuen Verwendung der Funktion unterschiedlich), und ich möchte eine Methode erstellen, die mir dies ermöglicht Immer derselbe Punkt pro Polygon, von dem aus ich Koordinaten extrahieren konnte, die ich als Identifikationscode für die Polygone selbst verwenden möchte.
umbe1987
Verwenden Sie das fTools-Tool "True Centroid" unter Geometrie-Tools - docs.qgis.org/html/en/docs/user_manual/plugins/…
Mapperz
es gibt mir nur den Schwerpunkt, aber dies könnte auch außerhalb des Poligons liegen, was ich vermeiden muss. Ich muss sie auf dem Polygon, von dem sie abgeleitet sind, mithilfe einer Funktion wie Mindestentfernung verschieben (aber die Entfernung interessiert mich nicht, ich möchte, dass sie verschoben wird). In einem anderen Blog sagte mir jemand, ich solle ST_PointOnSurface von PostGIS verwenden (aber ich verwende QGIS).
umbe1987
2
Ist dies jetzt ein Duplikat von gis.stackexchange.com/questions/50029/… ?
Underdark

Antworten:

7

Sie können die Shapely-Python-Bibliothek verwenden, die eine Funktion bietet representative_point(), die garantiert innerhalb des Polygons liegt.

Hier ist ein Python-Skript, das in der QGIS Python-Konsole ausgeführt werden kann. Die Polygonebene, für die Sie das Attribut erstellen möchten, sollte ausgewählt werden. Die Funktion übernimmt den Namen des Attributs, das Sie aktualisieren möchten. Das Attribut muss bereits in Ihrer Ebene vorhanden sein, es muss ein Zeichenfolgentyp sein und es sollte lang genug sein (30 Zeichen).

Hier ist ein Beispiel für die Punkte, die der Algorithmus gefunden hat:

import shapely.wkb

def setIDPoint(attributename):
 layer = qgis.utils.iface.activeLayer()
 provider = layer.dataProvider()
 fields = provider.fields()
 provider.select(provider.attributeIndexes() )
 attributeID = provider.fieldNameIndex(attributename)
 feature = QgsFeature()
 layer.startEditing()
 while provider.nextFeature(feature):
  wkb = feature.geometry().asWkb()
  polygon = shapely.wkb.loads(wkb)
  reprPoint = ','.join([str(polygon.representative_point().x), str(polygon.representative_point().y)] )
  feature.changeAttribute(attributeID, reprPoint)
  layer.updateFeature(feature)
 layer.commitChanges()
Jake
quelle
Ich versuche es zu testen, scheint genau das zu sein, wonach ich gesucht habe. Ich werde es dich wissen lassen, sobald ich es laufen lasse!
umbe1987
Eine Sache, die ich nicht verstanden habe, ist, was Sie mit "Es muss ein Zeichenfolgentyp sein und es sollte lang genug sein (30 Zeichen)" meinen. Funktioniert diese Bibliothek direkt mit Polygon-Shpfiles? Wenn ja, soll ich auf der Registerkarte "Att" ein neues Feld für den Zeichenfolgentyp mit mindestens 30 Zeichen erstellen, das aktualisiert werden soll?
umbe1987
@ user9518: Ja, so wie die Funktion geschrieben ist, müssen Sie das Attribut in der Tabelle selbst erstellen und dann nur den Namen des Felds an die Funktion übergeben. Das Skript kann auch ganz einfach angepasst werden, um das erforderliche Feld selbst zu erstellen, falls dies erforderlich ist.
Jake
Ich vermisse nur eine Sache. Es scheint, dass ich jetzt eine Funktion (oder eine Klasse) durch Eingabe von "def" definiere, aber wenn ich mit dem Schreiben des Skripts ende, passiert nichts. Wie kann ich das Ergebnis endlich in meiner Tabelle haben?
umbe1987
1
Es hat perfekt funktioniert !!! Ich stelle mir vor, dass die Koordinaten gemäß dem Koordinatensystem der Ebene geschrieben sind und dass ich, wenn ich die Punkte haben möchte, einen shp mit diesen Koordinaten erstellen muss, oder? Wenn Sie hier wären, würde ich Ihnen mindestens 3 Biere anbieten! Vielen Dank für Ihre Bemühungen !!!
umbe1987
5

Das Schwerpunktwerkzeug ftools kann den Schwerpunkt außerhalb des Polygons platzieren, wenn er konkav ist.

ST_PointOnSurfacewird auf jeden Fall tun, was Sie wollen. Sie können den Befehl in QGIS verwenden, wenn Sie SPIT installiert haben, um Ihr Shapefile in PostGIS zu übertragen, und dann die Abfrage mit dem PgQuery-Plugin ausführen.

Wenn die Installation von PostGIS für eine einmalige Verwendung etwas schwierig ist, können Sie alternativ Spatialite in QGIS verwenden. Sie können dann das QSpatiaLite-Plugin verwenden, um Ihre Daten in SpatiaLite zu importieren und die Abfrage auszuführen (SpatialLite-Ehrungen ST_PointOnSurface).

MappaGnosis
quelle
2

Wenn ich Sie richtig verstehe, verwenden Sie: Vector-> Research Tools_> Random Points. Wählen Sie nun unter "Stratified Sampling Design (Einzelpolygone)" den Wert aus dem Eingabefeld aus und verwenden Sie das entsprechende Feld, das den numerischen Wert der Punkte angibt, die für jedes unterschiedliche Polygon generiert werden sollen

Kurt
quelle
Was meinst du mit "passendem Feld"? Ich dachte daran, den Schwerpunkt zu verwenden und ihn dann mit dem nächsten Teil des Polygons zu verknüpfen, auf das er sich bezieht, wenn er außerhalb des Umrisses liegt, indem (zum Beispiel) der Mindestabstand dieses Punkts zum nächsten Polygon berechnet wird. Der Zweck besteht dann darin, diese Punktkoordinaten zu extrahieren, um sie als eindeutigen spezifischen Identifikationscode des Polygons zu verwenden.
umbe1987
Grundsätzlich versuche ich, jeden Schwerpunkt seinem relativen Polygon zuzuweisen und ihn so zu verschieben, dass er innerhalb seines Polygons liegt (oder zumindest seine Grenzlinie berührt).
umbe1987
@ user9518: Entschuldigung, ich habe Ihre Frage falsch verstanden. Ich dachte, Sie möchten eine bestimmte Anzahl von zufälligen Punkten innerhalb jeder Poly, z. B. 2 Punkte für Poly 1, 10 Punkte innerhalb von Poly2 usw., daher der Begriff "geeignetes Feld". Natürlich können Sie 1 für "Diese Anzahl von Punkten verwenden" auswählen, um nur einen Punkt für jede Poly zu generieren. Dieser Punkt befindet sich innerhalb der Poly oder berührt zumindest deren Grenzlinie. Aber dieser Punkt wird immer noch zufällig gefunden. Wenn Sie also die Prozedur wiederholen, erhalten Sie andere Punkte :-(
Kurt
1

Das Realcentroids-Plugin, das über Plugins> Plugins verwalten und installieren installiert werden kann, hat in QGIS 2.2 für mich funktioniert, um Schwerpunkt-ähnliche Punkte zu generieren, die in jedem Polygon erzwungen werden, wenn sie konkav sind (der Punkt liegt sehr nahe am Rand). Ich habe das von Kurt vorgeschlagene Werkzeug für zufällige Punkte ausprobiert und obwohl ich 1 Punkt pro Polygon angegeben habe, werden stattdessen zwei generiert. Ein zusätzlicher Nachteil ist, dass die Punkte in den meisten Fällen nicht den Schwerpunkt darstellen, da sie zufällig sind.

http://www.agt.bme.hu/gis/qgis/realcentroid/

Alexandra Mates
quelle