Benutzerdefinierte Matplotlib-Projektion: So transformieren Sie Punkte

8

Ich arbeite mit einer benutzerdefinierten Projektion von Matplotlib und verstehe nicht, wie man Vektortransformationen innerhalb der Projektion durchführt ( Hinweis: Die benutzerdefinierte Projektion ist eine Lambert-Azimutal-Projektion mit äquatorialem Aspekt ) .

In meinem Beispiel möchte ich einen Punkt umwandeln, der um 30 ° nach Norden (dh, der Punkt ist 60 ° N des Äquators) in einen Punkt eintaucht, der um 30 ° nach Osten abfällt (das heißt liegt 60 ° östlich von der Nullmeridian). Ich möchte dies mit Hilfe einer Vektortransformationsmatrix tun, um in Zukunft kompliziertere Berechnungen mit dem Programm durchführen zu können. Aber ich verstehe nicht wirklich, wie man die Länge des transformierten Vektors richtig berechnet (oder die richtige Länge und Breite dieses Punktes erhält).

Ich untersuche auch dieses Beispiel, aber es verwendet einen etwas anderen Ansatz für die Transformationen: Ссылка

Testdatei:

%Vor%

Benutzerdefinierte Projektion:

%Vor%     
tobias47n9e 23.12.2014, 14:06
quelle

1 Antwort

4

Es scheint, dass das Problem in den Funktionen vectorToGeogr und spherical2vector liegt. Basierend auf den Kommentaren in denen und der Stange, die du drehst, sieht es so aus (?) Wie du die folgende Beziehung haben wolltest:

%Vor%

Sie hatten jedoch an Orten, die mathematische Koordinaten angenommen haben, Mathe gemischt:

%Vor%

Ein schneller, aber nicht narrensicherer Test ist es, alle Koordinatenumwandlungsfunktionen zu "runden". Es garantiert nicht, dass das, was Sie tun, korrekt ist, aber es garantiert, dass es intern konsistent ist. Ihre aktuelle Version der Dinge versagt diesen Test:

%Vor%

Abgesehen davon empfehle ich dringend, mindestens ein paar Tests zu machen und einen Testläufer zu benutzen ( py.test ist mein Favorit). Es wird dir auf lange Sicht viel Schmerz ersparen!

Schnelle Randnotiz:

Persönlich bevorzuge ich es, den "realen" kartesischen Raum vom kartesischen Raum zu trennen, der in einem Stereonet verwendet wird.

Es macht die Mathematik einfacher und die Konvertierung zwischen realem und stereonalem Raum ist einfach (siehe z. B. die Funktionen mplstereonet.xyz2stereonet und mplstereonet.stereonet2xyz . Sie befinden sich beide in der Datei, mit der Sie verbunden sind.). Die Beispiele in stereonet_math.py verwenden alle die zweite Konventionen. Wenn Sie mit "echten" Vektoren arbeiten müssen (z. B. das Beispiel contour_normal_vectors.py ) ) Sie können entweder mit xyz2stereonet (Ausgänge lon, lat) oder einer der verschiedenen Funktionen normal2<foo> (Ausgänge plunge / peiling, strike / dip, usw.) umgewandelt werden.

Wenn Sie jedoch "echte" kartesische Koordinaten intern verwenden möchten, müssen Sie Ihre Konvertierungsfunktionen ändern.

Ihre ursprüngliche Funktion sphericalToVector :

%Vor%

Sollte geändert werden zu:

%Vor%

Und deine ursprüngliche Funktion vectorToGeogr :

%Vor%

Sollte geändert werden zu:

%Vor%

Die modifizierte Version Ihres Beispiels ist hier: Ссылка Es wurden nur die oben genannten Funktionen in test.py geändert. Als ein Beispiel für das Ergebnis:

    
Joe Kington 27.12.2014, 07:21
quelle