; ; CANTERS OPTIMIERUNG DES ABSTANDSTREUEN KEGELENTWURFES FÜR AMERIKA (P05) ; ======================================================================= ; ; Nr. bei Wagner: 2 ; Name: Abstandstreuer Kegelentwurf mit 2 längentreuen Parallelkreisen ; in freier (schiefer) Lage, Canters Optimierung für Amerika, ; (Canters Part. Projection P05) ; Variante: Zentrierend ; Richtung: Inverse Transformation ; ; Polversetzend/(Selbst-)Zentrierend: Bei Kegelentwürfen ist das Rechenzentrum (der Pol) meist ; nicht der Kartenmittelpunkt. Dies ist ein (selbst)zentrierendes Programm, welches den Pol ; so versetzt, dass der Mitte der Quellkarte zur Mitte der Zielkarte wird. Das Gegenstück bilden ; polversetzende Polgramme, bei denen der Polversatz "zu Fuss" abgefragt wird. ; ; Anmerkung 1: Die Berührungsparallel oder die Schnittparallele haben k e i n e n ; Einfluss auf die Zentrierung. Entscheidend ist der Quellbildmittelparallel ; ; Anmerkung 2: Auf die X-Lagerung hat die Selbstzentrierung ebenfalls keinen Einfluss, ; dies ist, wie bei allen anderen Programmen, mit lambda0 einzustellen. ; ; Anmerkung 3: Die Selbstzentrierung ist ganz schön aufwändig. Immerhin muss ; dafür zusätzlich zu der Inversformel eine Vorwärtsformel implementiert ; werden (wenngleich diese auch nur ein einziges Mal geerechnet wird) ; ; Anmerkung 4: Schiefachsige Variante. Der Außerhalbtest wird hier weggelassen, um evtl. ; erwünschte Randüberschreitungen nicht abzuschneiden. ; The Canters Parameters are: ; ; Canters (Tab. 5.21): Here implemented: ; PhiP 30.33 Phi0 30.33 ; LambdaP -8.76 Lambda0 180.00 + (-8.76) = 171.24 ; Phi1 15.96 Phi1 15.96 ; Phi2 31.35 Phi2 31.35 ; Meassured in Fig. 5.32 Lambda00 85.80 Empiric Value: Rotates Cape Dame Marie (The Haiti South West Cape) into the Map Centre ; ; 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. ; (C) Rolf Böhm Bad Schandau 2004, 2008 ; ; Benutzte Variablen ; ================== ; ; Die Variablennamen entsprechen weitgehend denen von Karlheinz Wagner, ; ; Laufende Koordinaten ; _name Canters~Optimierung~des~abstandstreuen~Kegelentwurfes~für~Amerika~(P05) _var phi ; Geographische Breite _var lambda ; Geographische Länge _var alpha ; Azimut ebene Polarkoord., auch Schiefazimut _var delta ; Poldistanz/geographisch, auch Schiefdistanz _var epsilon ; Delta0 minus Delta _var m ; Radius ebene Polarkoordinaten _var n ; Winkelreduktionsfaktor (Cos(Delta0)) ; ; Konstanten der Transformation ; _var phi1 ; Geogr. Breite des Schnittparallels 1 _var phi2 ; Geogr. Breite des Schnittparallels 2 _var delta0 ; Poldistanz des Mittelparallels zwischen den Berührungsparallelen _var delta1 ; Poldistanz des 1. Schnittparallels _var delta2 ; Poldistanz des 1. Schnittparallels _var delta0 ; Poldistanz des Mittelparallels zwischen den Berührungsparallelen _var epsilon0 ; delta0 mius delta1 oder delta2 _var m0 ; Halbmesser des delta0-Parallels _var lambda0 ; Geogr. Breite des Mittelmeridians _var lambda00 ; Verdrehung vor Transformation _var scale ; Kartenmaßstabszahl (also 1000000, nicht 1/1000000) _var Pol-y ; Polversatz nach Nord _var 2pi ; 360 Grad _var -pi _var sigma ; Hemisphärenvorzeichen _var .a ; Temporäre Variable _var .b ; Temporäre Variable ; ; Für Transformation in freie Lage ; _var phi0 _var sinphi0 _var cosphi0 _var phi' ; Kartographische Breite _var lambda' ; Kartographische Länge in 4 Varianten _var lambda" _var lambda- _var lambda= _var d11 ; Differenzen _var d12 _var d21 _var d22 _var dx ; Differenzen »gekreuzt« _var d= ; Differenzen »even« ; ; x, y, x', y', Cx', Cy', Rx', Ry', °(, (°, pi, pi/2 etc. sind vordefinierte globale Konstanten ; ; Initialisierung ; =============== ; tstne initial $077 ; Dialog input scale Maßstab mov phi1 15.96 ; Canters mov phi2 31.35 ; Canters mov phi0 30.33 ; Canters mov lambda0 180 sub lambda0 8.76 ; Canters Value. Rechenwert 180 + (-8.76) = 171.24 mov lambda00 85.80 ; Das dreht Amerika in auf die Kartenmittelachse. This rotates Cape Dame Marie into Map Centre ; Eingegebene Werte auf Min/Max bringen clip scale 1 1E12 clip phi1 -90 90 clip phi2 -90 90 clip phi0 -90 90 clip lambda0 -180 180 mul lambda00 °( ; die wird im Bogenmaß gerechnet ; SinCosPhi0 mul phi0 °( mov sinphi0 phi0 sin sinphi0 mov cosphi0 phi0 cos cosphi0 ; sigma berechnen und phi1/2 kontern mov sigma phi1 add sigma phi2 sgn sigma mul phi1 sigma ; Wenn S kontern mul phi2 sigma ; Wenn S kontern ; Konstanten berechnen mul phi1 °( mul phi2 °( mov delta1 pi/2 sub delta1 phi1 mov delta2 pi/2 sub delta2 phi2 clr delta0 add delta0 delta1 add delta0 delta2 div delta0 2 ; Delta0 fertig mov epsilon0 delta0 sub epsilon0 delta1 abs epsilon0 ; epsilon0 fertig mov .a delta0 tan .a mov m0 epsilon0 cot m0 mul m0 .a mul m0 epsilon0 ; m0 fertig mov .a epsilon0 sin .a mov n delta0 cos n mul n .a div n epsilon0 ; n fertig ; Pol-y berechnen mov r1 Cy ; "Phi" von Cy abholen. "Lambda" alias Cx sei immer 0 ... add r1 30.33 mul r1 sigma ; ;;;;; mul r1 °( ; "Phi" in Bogenmaß umrechnen ; mov r2 pi/2 ; Eigentlicher Entwurf: Phi (in r1) im m (alias Pol-y) umrechnen sub r2 r1 ; delta = pi/2 - phi mov epsilon delta0 sub epsilon r2 ; epsilon = delta0 - delta mov m epsilon0 mov r3 epsilon0 cot r3 mov r4 delta0 tan r4 mov m epsilon0 mul m r3 mul m r4 sub m epsilon ; m fertig mov Pol-y m ; ; m in y umrechnen. Aus x=0 folgt, da m=sqrt(x²+y²) m=y! div Pol-y scale ; Maßstab einrechnen mul Pol-y Ry' ; Erdradius einrechnen mul Pol-y sigma ; Wenn S kontern proof Pol-y ; mov -pi pi neg -pi ; Programm ist initialisiert mov initial 1 $077: ; ; SIMD-Laufbereich ; ================ ; ; Maßstab, Kartenmittelpunkt etc. einrechnen, Bild um 90° drehen ; -------------------------------------------------------------- ; mov r0 x ; 90 degree rotation mov x y mov y r0 sub x Cy' ; Bildmittelpunkt (90 degree rotated) neg x ; 90 degree rotation div x Rx' ; Erdradius mul x scale ; Kartenmaßstab sub y Cx' ; (90 degree rotated) sub y Pol-y div y Ry' mul y scale mul x sigma mul y sigma ; ; 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: neg alpha ; Jetzt ist alpha berechnet, liegt aber noch falsch add alpha pi cmplt alpha pi $153 sub alpha pi sub alpha pi $153: power x 2 power y 2 clr m add m x add m y root m 2 ; ; Eigentlicher abstandstreuer Entwurf, dieser invers ; -------------------------------------------------- ; mov lambda alpha ; Geographische Länge div lambda n mov epsilon m0 ; Geographische Breite sub epsilon m mov delta delta0 sub delta epsilon mov phi pi/2 sub phi delta ; ; Kontern, Rotation nach Transformation (Invers davor) ; ---------------------------------------------------- ; mul lambda sigma ; Südhemisphäre: mul phi sigma ; ggf. kontern add lambda lambda00 cmod lambda -180 180 ; ; Transformation in schiefe (freie) Lage: Umrechnung der polständigen phi/lambda in schiefe 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: sin/cos 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: ; ; Gradmaßumrechnung ; ----------------- ; mul lambda' (° mul phi' (° neg lambda' ; ** Empirisch festgestellt ; ; Schlussarbeiten ; --------------- ; mov x' lambda' mov y' phi' ; Lambda kreisen lassen add x' lambda0 cmod x' -180 180 exit out: mov x' -9999 mov y' -9999 exit _end