; ; CANTESRS OPTIMIERUNG DES FLÄCHENTREUEN ZYLINDERENTWURFES FÜR AMERIKA (P07) ; ========================================================================== ; ; Name: Flächentreuer Zylinderentwurf in beliebiger (freier) Lage, ; Canters Optimierung für beide Amerika (Canters Partial Projection P07) ; 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, Zylinderachse und eine Längenverdrehung werden abgefragt. ; Die Zielbildgeometrie wird dem Sekundäroperanden oder einem Fixbild entnommen. ; Der Berührungspunkt wird bildmittig gesetzt. ; ; Zusätzlich erfolgt ein Breitenversatz um Phi00 = 18.5° (Cap Dame Marie/Haiti), der Haiti ; auf dem Kartenblatt mittig stellt. (Ansonsten würde Nordkanada im N aus dem Kartenblatt herauslaufen, ; während im S zuviel Platz bliebe. ; ; Literatur: ; Wagner: Kartographische Netzentwürfe, Leipzig: Bibliographisches Institut 1949 ; Fiala: Mathematische Kartographie, Berlin: Verlag Technik 1957 ; Canters: Small-scale Map Projection Design. London: Taylor&Fracis 2002. ; ; **) empirische Anpassungen ; 15.12.2005 RB Überarbeitet ; 15.05.2008 RB Canters ; (C) Rolf Böhm 2004, 2008 ; Benutzte Variablen ; ================== ; ; Die Variablennamen entsprechen weitgehend denen von Karlheinz Wagner, ; ; Laufende Koordinaten ; _name Canters~Optimierung~des~flächentreuen~Zylinderentwurfes~für~Amerika~(P07) _var phi ; Geographische Breite _var lambda ; Geographische Länge _var delta ; Poldistanz/geographisch, auch Schiefdistanz _var sinl ; Sinus(Lambda) _var cosl ; Cosinus(Lambda) _var sinp ; Sinus(Phi) _var cosp ; Cosinus(Phi) _var phi' ; Kartographische Breite _var lambda' ; Kartographische Länge in 4 Varianten _var lambda" _var lambda- _var lambda= _var d11 _var d12 _var d21 _var d22 _var dx ; Differenzen »gekreuzt« _var d= ; Differenzen »even« _var t1 ; Temporäre Variablen _var t2 _var t3 _var t4 ; ; Konstanten der Transformation ; _var scale ; Kartenmaßstabszahl (also 1000000, nicht 1/1000000) _var phiP ; Breite des Pols _var lambdaP ; Länge des Pols _var lambda0 ; Geogr. Länge des Bildmittelpunktes _var phiP( ; dito im Bogenmaß _var lambdaP( ; dito im Bogenmaß _var lambda0( ; dito im Bogenmaß _var phi00 ; Breitenversatz _var phi00( ; Bogenmaß _var sinphiP ; Sin(phiP) _var cosphiP ; cos(phiP) _var phi1 ; Phi1 _var phi1( _var cosphi1 _var -pi _var 2pi _var initial _var -------- ; End of Symbol Table 000$: ; ; x, y, x', y', Rx', Ry', °(, (°, pi, pi/2 etc. sind vordefinierte globale Konstanten ; ; Initialisierung ; =============== ; tstne initial 77$ ; Dialog input scale Maßstabszahl mov phiP -21.52 ; Canters Table 5.21 p. 222 mov lambdaP -157.28 ; Canters Table 5.21 p. 222 mov phi1 7.98 mov lambda0 90 ; Shift ; Eingegebene Werte auf Min/Max bringen clip scale 1 1E12 ; Eingegebene Werte vorbehandeln neg phiP ; **) Phi zählt falschrum add lambda0 180 ; **) Zu Lambda 180 Grad dazu cmod lambda0 -180 180 ; **) und clippen ; In Bogenmaß umrechnen mov phiP( phiP mul phiP( °( mov lambdaP( lambdaP mul lambdaP( °( mov lambda0( lambda0 mul lambda0( °( mov sinphiP phiP( sin sinphiP mov cosphiP phiP( cos cosphiP mov phi1( phi1 mul phi1( °( mov cosphi1 phi1( cos cosphi1 ; Pi-Konstanten mov 2pi pi add 2pi pi mov -pi pi neg -pi pi ; Programm ist initialisiert mov initial 1 77$: ; ; SIMD-Laufbereich ; ================ ; ; Maßstab, Kartenmittelpunkt etc. einrechnen ; ------------------------------------------ ; mov r0 x ; 90-Grad-Rotation mov x y mov y r0 sub x Cy' ; Bildmittelpunkt div x Rx' ; Erdradius mul x scale ; Kartenmaßstab sub y Cx' div y Ry' mul y scale ; neg x ; neg y ; ; Eigentlicher Entwurf, dieser invers ; ----------------------------------- ; mov lambda x ; Geographische Länge div lambda cosphi1 mov phi y ; Geographische Breite mul phi cosphi1 asin phi errjump out ; ; Zylinderverdrehung ; ------------------ ; add lambda lambda0( ; im Bogenmaß! ; ; Umrechnung der schief (gedachten) phi/lambda in polständige phi'/lambda'-Koordinatenpaare ; ----------------------------------------------------------------------------------------- ; ; 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 sinphiP mov t2 cosp mul t2 cosphiP 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 cosphiP neg t1 mul t1 sinp mov t2 sinphiP 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: ; ; Polverdrehung ; ------------- ; add lambda' lambdaP( ; im Bogenmaß! cmod lambda' -pi pi ; ; In Gradmaß umrechnen ; -------------------- ; mul phi' (° mul lambda' (° ; ; Schlussarbeiten ; --------------- ; mov x' lambda' mov y' phi' exit out: mov x' -9999 mov y' -9999 exit _end