Mehr

Transformieren eines einzelnen QgsGeometry-Objekts von einem CRS in ein anderes mit PyQGIS?

Transformieren eines einzelnen QgsGeometry-Objekts von einem CRS in ein anderes mit PyQGIS?


Ich habe einen Polylinien-Layer mit Straßen in WGS84, der mehrere UTM-Zonen abdeckt. Für jede Straße muss ich eine Reihe von Punkten in unterschiedlichen Abständen (in Metern) platzieren. Dazu möchte ich jede Straße in die entsprechende UTM-Zone reprojizieren, Punkte in dieser UTM-Zone erstellen, Punkte auf WGS84 reprojizieren und sie einem respektvollen Layer hinzufügen. Da ist einQgsCoordinateTransform()-Klasse, die es ermöglicht, Transformationen für einzelne Punkte durchzuführen, aber keine Polylinien akzeptiert. Ich denke, ich könnte Polylinien manuell in die Menge von Punkten zerlegen, jeden von ihnen transformieren und eine Polylinie neu erstellen, aber ich hoffe, dass es eine eingebaute Methode oder Klasse gibt, die ich übersehen habe, die es ermöglicht, einzelne Polylinien zu transformieren.


Verwenden Sie QgsGeometry.transform( QgsCoordinateTransform tr ). Nachdem Sie beispielsweise Ihre Instanz von QgsCoordinateTransform mit source und dest crs erstellt haben, führen Sie für jede Geometrieinstanz Folgendes aus:

sourceCrs = QgsCoordinateReferenceSystem(4326) destCrs = QgsCoordinateReferenceSystem(2154) tr = QgsCoordinateTransform(sourceCrs, destCrs, QgsProject.instance()) myGeometryInstance.transform(tr)

https://qgis.org/api/classQgsCoordinateTransform.html#aa5ad428819ac020f8f5716e835ab754f

Beachten Sie, dass die Transformation (Anwenden von QgsCoordinateTransform) die QgsGeometry-Instanz ändert.


Alte Frage, aber duckduckgo bringt Sie hierher für "pyqgis Transform Single Geometrie"

Genau wie Riccardo darauf hingewiesen hat, funktioniert die akzeptierte Antwort nicht für Skripte in QGIS 3, die Situation wird in der API-Referenz erklärt:

Python-Skripte sollten beim Erstellen von QgsCoordinateTransform die Projektinstanz QgsProject.instance() verwenden. Dadurch wird sichergestellt, dass alle im Projekt definierten Datumstransformationen bei Koordinatentransformationen korrekt berücksichtigt werden. Z.B.

transform = QgsCoordinateTransform(QgsCoordinateReferenceSystem("EPSG:3111"), QgsCoordinateReferenceSystem("EPSG:4326"), QgsProject.instance())

Die Verwendung von QgsCoordinateTransform in QGIS 3 transformiert die Geometrieinstanz direkt und gibt 0 zurück:

geom = QgsGeometry(QgsPoint(5,20)) sourceCrs = QgsCoordinateReferenceSystem(4326) destCrs = QgsCoordinateReferenceSystem(2154) tr = QgsCoordinateTransform(sourceCrs, destCrs, QgsProject.instance()) geom.transform(tr) #[out]: 0 geom #[aus]:  back_tr = QgsCoordinateTransform(destCrs, sourceCrs, QgsProject.instance()) geom.transform(back_tr) #[out]: 0 geom #[out]: 

Wenn Sie eine bereits vorhandene QgsGeometry-Instanz kopieren möchten, macht der QgsGeometry-Klassenkonstruktor den Trick. Aus den Dokumenten:

Klasse: QgsGeometry-Klasse qgis.core.QgsGeometry Basen: sip.wrapper

Konstrukteur

QgsGeometry(QgsGeometry) Der Kopierkonstruktor fordert eine tiefe Kopie des Objekts an

Beispiel:

geom2 = QgsGeometry(geom) geom2 #[out]:  geom #[out]:  geom2.transform(tr) #[out]: 0 geom2 #[out]:  geom #[out]: