Georeferenzierung von Vektorebenen mit Kontrollpunkten mit QGIS?

29

Ich habe eine nicht georeferenzierte Vektorebene, die georeferenziert werden muss. Mit Rasterebenen ist die Aufgabe einfach und unkompliziert, aber ich habe keine Ahnung, was ich mit meiner Vektorebene tun soll. Ich habe ein paar Kontrollpunkte mit bekannten Koordinaten, die eine Grundlage für die Transformation bieten sollten. Angenommen, Punkte mit den IDs 1, 2 und 3 sollten die Koordinaten x1, y1 haben. x2, y2; x3, y3. Neben dem einfachen Verschieben kann es auch zu Rotations- und Skalentransformationen kommen.

Irgendwelche Ideen?

AHaav
quelle
Hast du das qgsAffine Plugin ausprobiert? Ähnliche Frage hier: gis.stackexchange.com/questions/22691/how-to-georeference-a-dxf
Rayner
Das Affine-Plug-in wird wahrscheinlich die Umwandlung durchführen, Sie müssen jedoch die Umwandlungsparameter kennen, um es verwenden zu können. Können Sie die Vektorkoordinaten und die entsprechenden realen Koordinaten für Ihre drei Punkte posten? N.
nhopton
Können Sie das Shapefile mit gdal_rasterize in ein TIFF konvertieren, das TIFF georeferenzieren und dann die Parameter aus der World-Datei extrahieren?
Klewis

Antworten:

10

Verwenden Sie das qgsAffine-Plugin, um eine Vektorebene zu georeferenzieren.

Weitere Informationen finden Sie unter Wo finden Sie Qgsaffine im Menü?

Rayner
quelle
3
Vielen Dank für die Antworten. Ich denke, ich muss dann die qgsAffine verwenden und die Übertragungsparameter manuell herausfinden. Ich hatte nur gehofft, dass es eine Möglichkeit gibt, diesen Prozess zu automatisieren. Vielleicht werde ich versuchen, etwas Python-Code zu schreiben, um das zu tun
AHaav
1
Wenn Sie darüber nachdenken, werden Sie vielleicht feststellen, dass GRASS v.transform (im Sextante-Toolkit enthalten) benutzerfreundlicher ist als das qgsAffine-Plug-in. N.
nhopton
1
So wie es aussieht, wird v.transform auch die Summen für Sie tun, siehe grass.osgeo.org/gdp/html_grass63/v.transform.html
nhopton
8

Angesichts der Tatsache, dass Sie einige Kontrollpunkte haben, sollten Sie in der Lage sein, eine Affintransformation zu verwenden, um Ihre Vektordaten zu verschieben. Schauen Sie sich dieses Rezept an . Der Prozess ist ein zweiteiliger Prozess:

  1. Verwenden Sie Ihre Kontrollpunkte, um die Koeffizienten Ihrer gewünschten affinen Funktion zu definieren
  2. nimm die Koeffizienten und wende sie auf das ST_Affine () in postgis an.

Wenn Sie Ihre Kontrollpunkte in eine CSV-Datei (alt_x, alt_y, neu_x, neu_y) einfügen, können Sie die R-Befehle aus dem Link einfach ausschneiden und einfügen, um den Koeffiziententeil zu lösen.

user12398
quelle
7

Ich empfehle das Vector Bender Plugin für QGIS. Ich habe es versucht und es funktioniert gut und ist benutzerfreundlich. Abhängig von der Anzahl der von Ihnen definierten Punktepaare haben Sie folgende Möglichkeiten:

  • Übersetzungen: Übersetzung von einem Anfangs- bis zum Endpunkt (1 Paar)
  • Uniform: Translation, Skalierung und Rotation (2 Paare)
  • Biegen: zusätzliche Verformung (3 Paare oder mehr)

Sie finden ein kurzes Video hier und ich rate Ihnen , die Vektor - Bender - Hilfe zu lesen , sobald Sie das Plugin installiert.

ZKB
quelle
Ich bin damit einverstanden, dass das Vector Bender Plugin intuitiv und schnell zu bedienen ist. Es gelang mir jedoch nicht, Vektoren zu spiegeln / spiegeln . Für diese Operation benutze ich das Affine Transformation Plugin (QGIS v2.18).
Jura
2

Ich musste das einfach tun und tat es am Ende so:

  1. Rastere das Shapefile
  2. Georeferenzieren Sie das Raster mit dem Georeferenzierungs-Plugin
  3. Speichern Sie das GCP als gcps.pointsDatei
  4. Berechnen Sie die affine Transformation mit dieser Datei
  5. Wenden Sie die affine Transformation mit qgsAffine auf das Shapefile an

Das folgende Skript berechnet die affine Transformationsmatrix unter Verwendung der gespeicherten GCPs:

# Computes an affine transform based on QGis GCPs
# Usage: gcp_affine.py gcps.points

import csv
import sys
import numpy as np
from skimage.transform import AffineTransform

u = list(csv.DictReader(open(sys.argv[1], "rb")))
source = [(d["pixelX"], d["pixelY"]) for d in u]
dest = [(d["mapX"], d["mapY"]) for d in u]
source = [map(float, s) for s in source]
dest = [map(float, s) for s in dest]
source = np.array(source)
dest = np.array(dest)
aft = AffineTransform()
aft.estimate(source, dest)
np.set_printoptions(suppress=True)
print aft._matrix
FX
quelle
2

Sehen Sie sich meine Antwort auf das Zusammenfangen von zwei Polygonen an und probieren Sie den kostenlosen openjump aus.

Ich denke, dass seine affine Transformation viel benutzerfreundlicher ist als das affine qgis-Plugin.

Kurt
quelle
2

Nach meinen Kommentaren zu Rayners Antwort kann GRASS v.transform, das über die Sextante-Toolbox ausgeführt werden kann, verwendet werden, um Transformationsparameter zu berechnen und auf eine Vektorebene anzuwenden, um eine affine Transformation durchzuführen. Es wird eine Textdatei mit Kontrollpunkten in dem hier gezeigten Format benötigt .

Es ist sehr einfach zu bedienen und funktioniert gut.

nhopton
quelle
Vielleicht werde ich alt, frage mich aber nur, ob sich Leute an das ShapeWarp-Benutzer-Addon in Arcview 3.0 erinnern. Es war so einfach zu bedienen. Ich habe diese anderen Tools (v.transform / affine) immer als umständlicher empfunden. Hat nicht jemand versucht, die Benutzerfreundlichkeit von ShapeWarp in QGIS wiederherzustellen?
Sharad
1

Einige der hier angegebenen Antworten sind für QGIS 3 nicht mehr verfügbar und / oder ermöglichen nur lineare Transformationen der georeferenzierten Vektordatei. Dies mag die Frage des OP beantworten, aber andere, die sich diesen Beitrag ansehen, möchten möglicherweise andere Transformationsoptionen für die Georeferenzierung von Vektordateien.

Probleme mit einigen Lösungen für die Georeferenzierung von Vektordateien:

  • Das qgsAffine-Plugin erlaubt nur lineare Transformationen. Dies bedeutet, dass die Vektordatei skaliert, gedreht und verschoben werden kann, die Vektordatei jedoch nicht gebogen oder verzogen werden kann. Der Georeferenzierer für Rasterdateien bietet mehr Optionen und ermöglicht eine Vielzahl von Transformationen, einschließlich Polynom zweiter Ordnung und Spline für dünne Platten. Außerdem scheint das qgsAffine-Plugin in QGIS 3 noch nicht verfügbar zu sein.

  • Das GRASS-Modul v.transform ähnelt dem qgsAffine-Plugin und ermöglicht nur lineare Transformationen.

  • Das Vector Bender-Plugin scheint eine gute Option zu sein, wurde jedoch noch nicht vollständig auf QGIS 3 portiert, ist also derzeit keine Option. Es sieht nicht mehr so ​​aus, als würde es gepflegt.

Die Verwendung von ogr2ogr, wie in HeikkiVesantos Beitrag vorgeschlagen, ist eine gute Option. Sie können GCPs (Ground Control Points) verwenden und angeben, welche Art von Transformation Sie wünschen. Ich konnte nirgendwo eine Anleitung dazu finden, daher habe ich nachfolgend einige Anleitungen beigefügt:

  1. Generieren Sie eine Reihe von GCP-Paaren, wobei ein Punkt die ursprüngliche Position in der ungeoreferenzierten Vektordatei und der andere Punkt die gewünschte Position in Ihrem georeferenzierten Arbeitsbereich ist.

  2. Es gibt verschiedene Möglichkeiten, GCPs zu generieren. Ich habe das Georeferencer GDAL-Plugin in QGIS verwendet. Dies ist im Dropdown-Menü Raster verfügbar, nachdem es mit dem Plugin-Manager installiert wurde. Es funktioniert nur mit Rasterdateien, daher müssen Sie zuerst die Vektordatei in eine Rasterdatei konvertieren. Dies ist mit "Processing Toolbox: GDAL: Vektorkonvertierung: Rasterisieren (Vektor in Raster)" möglich. Stellen Sie die Auflösung auf eine Zahl ein, mit der Sie die Funktionen der Vektordatei weiterhin sehen können.

  3. Der Georeferenzierer hat eine schöne Oberfläche, über die Sie viele GCP-Punkte hinzufügen können. Sie können auch verschiedene Transformationen testen und feststellen, welche am besten funktioniert. Und Sie können feststellen, ob einer Ihrer GCP-Punkte möglicherweise fehlerhaft ist, indem Sie sich die Residuen ansehen. Nachdem Sie alle Ihre GCP-Punkte hinzugefügt und überprüft haben, ob Ihnen die Ausgabe gefällt, können Sie die GCP-Datei aus dem Georeferenzierer exportieren, um sie für die Georeferenzierung der ursprünglichen Vektordatei zu verwenden.

  4. Die GCP-Datei muss im folgenden Format geändert werden. Sie können so viele GCP-Punkte hinzufügen, wie Sie möchten. Nach jedem Punkt wird ein -gcp eingefügt und durch ein Leerzeichen getrennt. Ich habe dies mit über 800 GCP-Punkten durchgeführt und es hat großartig funktioniert.

    -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
  1. Es gibt verschiedene Möglichkeiten, die GCP-Punkte in das richtige Format zu ändern. Ich habe sie als CSV-Datei in Excel importiert und eine Spalte erstellt, um für jeden Punkt das richtige Format auszugeben. Dann habe ich diese Spalte in TextEdit eingefügt und die Zeilenenden durch Leerzeichen ersetzt.

  2. Die Vektordatei, die Sie georeferenzieren möchten, sollte mit demselben SRS in Ihren Arbeitsbereich importiert werden, den Sie für die endgültige georeferenzierte Datei benötigen. Dabei sollte es sich um dasselbe SRS wie Ihr Arbeitsbereich handeln. Wenn ursprünglich ein anderer SRS verwendet wurde, ist es möglicherweise ein langer Weg bis dahin, aber die Umwandlung verschiebt ihn an den richtigen Ort.

  3. Greifen Sie auf ogr2ogr über "Processing Toolbox: GDAL: Vektorkonvertierung: Format konvertieren" zu. Auf diese Weise können Sie die zu georeferenzierende Vektordatei und Ihre Ausgabedatei auswählen. Fügen Sie im Feld "Zusätzliche Erstellungsoptionen" einen Befehl hinzu, der den gewünschten Transformationstyp und dann die Linie mit allen GCP-Punkten angibt.

  4. Befehle für verschiedene Transformationstypen umfassen:

    • "-Ordnung 1" für linear
    • "-Ordnung 2" für Polynom zweiter Ordnung
    • "-Ordnung 3" für ein Polynom dritter Ordnung
    • "-tps" für Thin Plate Spline.
  5. Der im Feld "Zusätzliche Erstellungsoptionen" hinzugefügte Code könnte beispielsweise folgendermaßen aussehen:

-order 2 -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
stu
quelle