Drehen einer Vektorebene in QGIS mit qgsAffine (oder einer anderen Methode)?

10

Ich möchte einen Satz von Vektorpunkten in QGIS um eine beliebige Anzahl von Grad um einen zentralen Punkt (oder einen beliebigen Punkt) drehen.

Dies ähnelt einer aktuellen Frage zum Erstellen eines regulären Rasters . Es wurde dort vorgeschlagen, das Werkzeug "Affine Transformation" (von dem ich annehme, dass es das Plugin bedeutet) zu verwenden, um ein Punktgitter um einen beliebigen Winkel oder Abstand zu drehen oder zu verschieben. Ich vermute, ich verstehe nicht, wie es funktioniert, und konnte es nicht zum Laufen bringen.

Ich erstelle ein regelmäßiges Punktraster in QGIS und stelle sicher, dass die UTM-Zone sowohl für die Ebene als auch für das Projekt korrekt eingestellt ist. Aktiviere die Bearbeitung für die Ebene und öffne dann das Plugin-Dialogfeld (qgsAffine): Dialog "Affine Transformation"

Ich wähle 'ganze Ebene' und möchte dann, um das gesamte Punktfeld um 15 ° zu drehen, 15 in beide 'Rotations'-Felder einfügen (wo möglicherweise etwas schief geht). Die Operation führt dazu, dass die Punkte irgendwo außerhalb des Planeten gedreht werden!

Ist das das richtige Werkzeug für den Job? Ich möchte im Idealfall eine Reihe von Punkten um ihr gemeinsames Zentrum drehen.

Update : qgsAffine ist nur ein Gedanke; Wenn wir dies in einem QGIS-Tool tun können , bin ich glücklich!

Update 2 : qgsAffine ist verwendbar, wenn Sie die richtigen Nummern zum Einstecken kennen (siehe Antwort unten, danke Mike!). Tabellenkalkulation / Taschenrechner funktioniert einwandfrei, oder hier ist die R-Funktion, um die Zahlen direkt abzurufen:

## Compute correct affine numbers for qgsAffine plugin
affine <- function(originX, originY, rotAngle) {
  A <- rotAngle * pi / 180
  scaleX <- scaleY <- cos(A)
  rotX <- sin(A)
  rotY <- -sin(A)
  transX <- originX - cos(A) * originX + sin(A) * originY
  transY <- originY - sin(A) * originX - cos(A) * originY
  aff <- data.frame(scaleX, scaleY, rotX, rotY, transX, transY)
  return(aff)
}

Um ein Punktgitter in Norduganda (UTM 36N) zu drehen, erhalten Sie affine(578988, 419210, 30):

     scaleX    scaleY rotX rotY   transX    transY
1 0.8660254 0.8660254  0.5 -0.5 287174.7 -233330.5

... die im qgsAffine-Dialogfeld eingegeben werden und die Punkte korrekt drehen.

Simbamangu
quelle
schöne R Anpassung!
Mike T

Antworten:

10

Sie können dies in PostGIS mit ST_Affine tun . Die Funktion zum Drehen um einen beliebigen Punkt wurde ST_Rotate für PostGIS 2.0 hinzugefügt .

Wenn Sie eine frühere Version haben (wie PostGIS 1.5 oder noch früher), können Sie folgende Funktionen hinzufügen:

CREATE OR REPLACE FUNCTION st_rotate(geometry, double precision, geometry)
  RETURNS geometry AS
'SELECT ST_Affine($1,  cos($2), -sin($2), 0,  sin($2),  cos($2), 0, 0, 0, 1, ST_X($3) - cos($2) * ST_X($3) + sin($2) * ST_Y($3), ST_Y($3) - sin($2) * ST_X($3) - cos($2) * ST_Y($3), 0)'
  LANGUAGE sql IMMUTABLE STRICT
  COST 100;
COMMENT ON FUNCTION st_rotate(geometry, double precision, geometry) IS 'args: geomA, rotRadians, pointOrigin - Rotate a geometry rotRadians counter-clockwise about an origin.';

CREATE OR REPLACE FUNCTION st_rotate(geometry, double precision, double precision, double precision)
  RETURNS geometry AS
'SELECT ST_Affine($1,  cos($2), -sin($2), 0,  sin($2),  cos($2), 0, 0, 0, 1,    $3 - cos($2) * $3 + sin($2) * $4, $4 - sin($2) * $3 - cos($2) * $4, 0)'
  LANGUAGE sql IMMUTABLE STRICT
  COST 100;
COMMENT ON FUNCTION st_rotate(geometry, double precision, double precision, double precision) IS 'args: geomA, rotRadians, x0, y0 - Rotate a geometry rotRadians counter-clockwise about an origin.';

In den Beispielen unter ST_Rotate erhalten Sie eine Vorstellung davon, wie Sie damit eine Geometrie um einen x- , y- Punkt drehen können , einschließlich des Schwerpunkts (gemeinsames Zentrum).

Da wir alle Mathematik mögen, wird die Transformationsmatrix aus den obigen Funktionen wie folgt dargestellt:

[ cos(θ)  | -sin(θ)  ||  x0 - cos(θ) * x0 + sin(θ) * y0 ]
[ sin(θ)  |  cos(θ)  ||  y0 - sin(θ) * x0 - cos(θ) * y0 ]

Dabei ist θ die Drehung gegen den Uhrzeigersinn um einen Ursprung, x0 ist der Osten / Längengrad des Ursprungspunkts und y0 ist der Norden / Breitengrad. Diese Mathematik könnte möglicherweise an jedes affine Transformationswerkzeug angepasst werden .


Um das qgsAffine-Tool verwenden zu können, müssen Sie wissen, wohin die Werte der Matrix fließen. Für Vorberechnungen ist auch eine gute Tabellenvorlage erforderlich. Der qgsAffine-Dialog sieht ungefähr so ​​aus:

              X   Y
            +---+---+
      Scale | a | e |
            +---+---+
   Rotation | d | b |
            +---+---+
Translation | c | f |
            +---+---+

wo:

  • a : cos (θ)
  • b : -sin (θ)
  • c : x0 - cos (θ) * x0 + sin (θ) * y0
  • d : sin (θ)
  • e : cos (θ)
  • f : y0 - sin (θ) * x0 - cos (θ) * y0

Wenn Sie beispielsweise ein Polygon um 30 ° im Uhrzeigersinn um 42 ° S und 174 ° E drehen möchten, geben Sie Folgendes in Ihre Tabelle ein:

  • x0 = 174
  • y0 = -42
  • θ = -30 Grad oder -0,523598776 Bogenmaß

Kopieren Sie dann die Ergebnisse aus einer Tabelle in das rechte Feld. Verwenden der Tab-Reihenfolge im Dialogfeld:

  • a: 0,866025404
  • d: -0,5
  • c: 44.31157974
  • e: 0,866025404
  • b: 0,5
  • f: 81,37306696

qgsAffine

Das gleiche Beispiel aus PostGIS würde ungefähr so ​​aussehen:

SELECT ST_Rotate(geom, -30*pi()/180, 174.0, -42.0)
Mike T.
quelle
Das sieht ziemlich gut aus; Wenn wir dies in Spatialite tun können, gilt dies als "in QGIS ausführen", da wir SQL für Spatialite-Dateien über QGIS-Plugins ausführen können. PostGIS wäre ein weiterer ganzer Installationsschritt für Benutzer, auf die ich nicht eingehen möchte. Irgendeine Idee, ob sich Funktionen für Spatialite auch um einen Schwerpunkt drehen können?
Simbamangu
aha, ich habe qgsAffine entmystifiziert, funktioniert jetzt wie erwartet ... nur viel Kopieren / Einfügen aus einer Tabelle
Mike T
Mike, das funktioniert genau richtig! Ich werde versuchen, diese Arbeit auch mit Spatialite zu machen (PostGIS / Spatialite scheint diese Operationen sooo viel einfacher zu machen), aber zumindest kann ich jetzt qgsAffine zum Laufen bringen und es ist zumindest ein einfaches Plugin.
Simbamangu
Ich habe versucht, es an JavaScript anzupassen: siehe hier , auch jsfiddle
flackend
1
Berechnung der obigen Javascript-Funktion Ich konnte meine affinen Parameter berechnen und einige Vektoren erfolgreich drehen, aber dies ist nicht so benutzerfreundlich: Sie müssen das Koordinatenerfassungs-Plugin verwenden, um die Koordinaten des Rotationszentrums zu erhalten, dann die Transformationsparameter berechnen und zurück kopieren und einfügen QGis! Es wäre viel einfacher, wenn das Plugin selbst die Berechnungen durchführen würde und Benutzer einfach klicken, um die Rotationsmittelpunktkoordinaten einzugeben und einen Rotationswinkel zu definieren.
Bradypus
2

Ich habe noch nie versucht, Vektorebenen mit qgsAffine zu drehen, und ich glaube, ich bin nicht allein. Diese Frage wurde kürzlich im QGIS-Forum gestellt und mit (kostenlosem) OpenJump wurde eine Lösung gefunden. Schauen Sie sich diesen Thread an (gegen Ende):

http://forum.qgis.org/viewtopic.php?f=2&t=10126&sid=28473d53d244a4cd2a6f91887811ef02

Natürlich können Sie dieses Tool auch verwenden, um Ihre Daten einfach zu drehen.

nhopton
quelle