; ; ABSTANDSTREUER AZIMUTALENTWURF IN BELIEBIGER LAGE ; ================================================ ; ; Nr. bei Wagner: 11 ; Kurzname: Abstandstreuer Azimutalentwurf ; Autor: alt ; Quelle: Karlheinz Wagner, Kartographische Netzentwürfe, Leipzig 1949, S. 34ff. ; Richtung: Inverse Transformation ; ; Das Programm übernimmt die Koordinaten eines Punktes (x/y) und transformiert ; diese in einen Punkt (x'/y'). ; ; x/y sind ebene Zielpunktkoordinaten, x'/y' geben die geogr. Breite und Länge ; der Position auf der Quell-Erdkugel, auf der der Zielpunkt gelesen werden ; kann. ; ; Maßstab und Berührungspunkt werden abgefragt. ; Die Zielbildgeometrie wird dem Sekundäroperanden oder einem Fixbild entnommen. ; Der Berührungspunkt wird bildmittig gesetzt. ; ; Literatur: ; Wagner: Kartographische Netzentwürfe, Leipzig: Bibliographisches Institut 1949 ; Fiala: Mathematische Kartographie, Berlin: Verlag Technik 1957 ; ; Vom Wagner stammen die meisten Formelzeichen, vom Fiala die Umrechnungsformeln ; in schiefe (kartographische) Koordinaten. Man kommt mit beiden Büchern sehr gut ; klar. ; (C) Rolf Böhm Bad Schandau 2004 ; Benutzte Variablen ; ================== ; ; Die Variablennamen entsprechen weitgehend denen von Karlheinz Wagner, ; (Daher auch die eigenwillige Doppelbelegung von alpha und delta, ; die Formel zur schiefachsigen Transformation habe ich allerdings aus dem Fiala) ; ; Laufende Koordinaten ; _name Abstandstreuer~Azimutalentwurf _var phi ; Geographische Breite _var lambda ; Geographische Länge _var alpha ; Azimut ebene Polarkoord., auch Schiefazimut _var delta ; Poldistanz/geographisch, auch Schiefdistanz _var m ; Radius ebene Polarkoordinaten _var phi' ; Kartographische Breite _var lambda' ; Kartographische Länge in 4 Varianten _var lambda" _var lambda- _var lambda= ; ; Differenzen ; _var d11 _var d12 _var d21 _var d22 _var dx ; Differenzen »gekreuzt« _var d= ; Differenzen »even« ; ; Konstanten der Transformation ; _var phi0 ; Geogr. Breite des Berührungspunkts _var sinphi0 ; Sinus davon _var cosphi0 ; Cosinus davon _var lambda0 ; Geogr. Länge des Berührungspunktes _var scale ; Kartenmaßstabszahl (also 1000000, nicht 1/1000000) ; ; Sonstiges ; _var sinl ; Sinus(Lambda) _var cosl ; Cosinus(Lambda) _var sinp ; Sinus(Phi) _var cosp ; Cosinus(Phi) _var dlambda ; Deltalambda (=lambda-lambda0) _var sindl ; Sinus davon _var cosdl ; cosinus davon _var t1 ; Temporäre Speicherzelle 1 _var t2 ; Temporäre Speicherzelle 2 _var t3 ; Temporäre Speicherzelle 3 _var initial ; wenn <>0 ist das Programm initialisiert ; ; x, y, x', y', Rx', Ry', Cx', Cy', °(, (°, pi, pi/2 etc. sind vordefinierte globale Konstanten ; ; Initialisierung ; =============== ; tstne initial 077$ ; Dialog input scale Abstandstreuer~Azimutalentwurf~in~beliebiger~Lage\\Maßstabszahl input phi0 Berührungspunktbreite~in~Grad input lambda0 Berührungspunktlänge~in~Grad ; Eingegebene Werte auf Min/Max bringen clip scale 1 1E12 clip phi0 -90 90 clip lambda0 -180 180 ; Phi0 in Bogenmaß und Standardwinkelfunktionen ... mul phi0 °( mov cosphi0 phi0 ; Cos(phi0) braucht man nur einmal rechnen cos cosphi0 mov sinphi0 phi0 ; Sin(phi0) braucht man nur einmal rechnen sin sinphi0 ; Programm ist initialisiert mov initial 1 077$: ; ; SIMD-Laufbereich ; ================ ; ; Maßstab, Kartenmittelpunkt etc. einrechnen ; ------------------------------------------ sub x Cx' ; Bildmittelpunkt div x Rx' ; Erdradius mul x scale ; Kartenmaßstab sub y Cy' div y Ry' mul y scale ; ; Kartesische Koordinaten x/y in Polarkoordinaten m/alpha umwandeln ; ----------------------------------------------------------------- mov alpha x ; kartesische Koord. x y in Polarkoordinaten m alpha div alpha y atan alpha tstgt y 151$ ; Der atan ist doppeldeutig!: Wenn y negativ dann ... add alpha pi ; 180° addieren 151$: power x 2 power y 2 clr m add m x add m y root m 2 cmpgt m pi out ; Ausserhalb ; ; Eigentlicher abstandstreuer Entwurf, dieser invers ; -------------------------------------------------- ; delta = (hier) Poldistanz mov lambda alpha ; Geographische Länge mov delta m ; Geographische Breite ; div delta 2 ; atan delta ; mul delta 2 mov phi pi/2 sub phi delta ; ; Umrechnung der polständigen phi/lambda in schiefe delta/alpha-Koordinatenpaare ; ------------------------------------------------------------------------------ ; alpha = (hier) Azimut Transformationspunkt-Erdnordpol im ; Berührungspunkt (also schiefe Länge) ; delta = (hier) Distanz Berührungspunkt-Transformationspunkt ; (also schiefe Poldistanz) ; Das Problem ist, dass die Rechnung über arcsin läuft und dieser doppeldeutig ist. ; Die Lösung: Die Sache wird ein zweitesmal mit einer Formal angegangen, die einen ; arccos liefert. Dieser ist nun zwar auch doppeldeutig. Es ist aber nun diejenige Lösung ; richtig, die sowohl arcsin als auch arccos liefern. Wegen Rundungsunsicherheiten wird ; nicht auf Identität, sondern auf Differenzminimum getestet. ; Vorab: Delta-Lambda, sin/cos von Delta-Lambda, Lambda und Phi berechnen mov sinl lambda sin sinl ; Sin(Lambda) mov cosl lambda cos cosl ; Cos(Lambda) mov sinp phi sin sinp ; Sin(Phi) mov cosp phi cos cosp ; Cos(Phi) ; phi' berechnen mov t1 sinp ; phi' berechnen (Formeln Fiala, S. 79f.) mul t1 sinphi0 mov t2 cosp mul t2 cosphi0 mul t2 cosl add t1 t2 mov phi' t1 asin phi' ; Lambda (1): lambda' berechnen: Mittels Arcsin mov t1 cosp neg t1 mul t1 sinl mov t2 phi' cos t2 div t1 t2 mov lambda' t1 asin lambda' ; Lambda (2): lambda- berechnen: Die zweite Lösung, die der Arcsin liefert tstlt lambda' 201$ mov lambda- pi sub lambda- lambda' jump 203$ 201$: clr lambda- sub lambda- pi sub lambda- lambda' 203$: ; Lambda (3): lambda" berechnen: Mittels Arccos mov t1 cosphi0 neg t1 mul t1 sinp mov t2 sinphi0 mul t2 cosp mul t2 cosl mov t3 phi' cos t3 add t1 t2 div t1 t3 mov lambda" t1 acos lambda" ; Lambda (4): lambda= berechnen: Die zweite Lösung, die der arccos liefert mov lambda= lambda" ; Gleichheitszeichen lies als Doppelstrich quer neg lambda= ; Lambda (5): Ein Lambda aus demjenigen Paar ist richtig, welches die kleinste Differenz aufweist ; Differenzen für 2. Entscheidungsstufe berechnen mov d11 lambda' sub d11 lambda" abs d11 mov d12 lambda' sub d12 lambda= abs d12 mov d21 lambda- sub d21 lambda" abs d21 mov d22 lambda- sub d22 lambda= abs d22 ; Differenzen für 1. Entscheidungsstufe berechnen mov dx d12 ; "gekreuzt" mul dx d21 mov d= d11 ; "even" mul d= d22 ; 1. Entscheidungsstufe: gekreuzt oder even cmpgt dx d= =richtig ; 2. Entscheidungsstufe: Einzellösung xrichtig: cmpgt d12 d21 21richtig jump 12richtig =richtig: cmpgt d11 d22 22richtig jump 11richtig ; Lösungen zusammensuchen 21richtig: mov lambda' lambda- jump ok 22richtig: mov lambda' lambda- 12richtig: 11richtig: ok: onerr ; ; Schiefe Koordinaten aus Bogenmaß in Gradmaß umrechnen ; ----------------------------------------------------- mul phi' (° mul lambda' (° ; ; Schlussarbeiten ; --------------- ; ; Jetzt haut alles soweit hin, nut Lambda hat einen 180°-Phasen- ; sprung und Delta-Lambda muss noch eingerechnet werden ... ; mov x' lambda' mov y' phi' add x' 180 add x' lambda0 cmpgt x' -180 3$ add x' 360 3$: cmplt x' 180 4$ sub x' 360 4$: exit ; ; Ausserhalb ; ---------- out: mov x' -9999 mov y' -9999 exit _end