; ; ROBINSONPROJEKTION (TABELLIERT) ; =============================== ; ; Name: Robinsonprojektion ; Quelle: Delmelle: S. 63 ; Evenden (2005) 5.2.31 (S. 66) ; Richtung: Direkt-Transformation ; ; Von der Robinson-Projektion gibt es zwei bekannte Ansätze, einmal tabellierte ; Koeffizienten, einmal Polynome. Beide Varianten sind sehr ähnlich, weichen aber ; in höhener Breiten etwas (grob ca. 1 Grad) voneinander ab. ; ; Dies ist Version mit tabellierten Werten. ; ; 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. ; ; Die Robinson-Koeffizienten sind alle 5 Grad bekannt. Es muss also interpoliert werden. ; Dieses Programm interpoliert aus einer mit kubischen Splines auf 1 Grad verdichteten Tabelle. ; Der Rest wird nach dem Newton-Verfahren mit aufsteigenden Differenzen 1. und 2. Ordnung interpoliert. ; (C) Dr.-Ing. Rolf Böhm 2005 ; Benutzte Variablen ; ================== ; ; Variablen Hauptprogramm ; _name Robinsonprojektion~(tabelliert) _var phi ; Geographische Breite _var lambda ; Geographische Länge _var lambda0 ; Geogr. Länge des Bildmittelpunktes _var scale ; Kartenmaßstabszahl (also 1000000, nicht 1/1000000) _var sign ; Vorzeichen _var oldphi ; Alte geographische Breite _var rx ; Robinson-X-Koeffizient _var ry ; Robinson-Y-Koeffizient ; ; Die Tabellen ; _dim RX 95 _dim RY 95 ; ; Variablen der Unterprogramme ; _var .fix ; 1. Tafelwert _var .fix' ; 2. Tafelwert _var .fix'' ; 3. Tafelwert _var .frac ; Gebrochener Teil _var .frac- ; Gebrochener Teil - 1 _var .v11 ; Untere Tafeldifferenz 1. Ordnung _var .v12 ; Obere Tafeldifferenz 1. Ordnung _var .v21 ; Tafeldifferenz 2. Ordnung ; ; x, y, x', y', Cx', Cy', °(, (°, pi, pi/2 etc. sind vordefinierte globale Konstanten ; ; Initialisierung ; =============== ; mode 1 tstne initial 077$ pause Hinweis:~Dieses~Programm~rechnet~eine~Vorwärtstransformation.\\Es~muss~mit~einer~direkt~arbeitenden~Projection~engine~abgearbeitet~werden. ; Tabellen initialisieren mov return 051$ jump $$tab_init 051$: ; Dialog input scale Maßstabszahl input lambda0 Mittelpunktslänge~in~Grad ; Eingegebene Werte auf Min/Max bringen clip scale 1 1E12 clip lambda0 -180 180 ; Programm ist initialisiert mov initial 1 077$: ; ; SIMD-Laufbereich ; ================ ; ; Eigentlicher Entwurf, dieser direkt! ; ------------------------------------ ; mov lambda x ; Geographische Länge mov phi y ; Geographische Breite sub lambda lambda0 cmpgt lambda -180 10$ add lambda 360 10$: cmpgt lambda -180 30$ add lambda 360 30$: cmplt lambda 180 40$ sub lambda 360 40$: cmplt lambda 180 50$ sub lambda 360 50$: ; x, y haben eine Zreifachbedeutung: ; - einmal die verdefinierten RTA-Input-Koordinaten, also eigentlich Phi und Lambda, ; - dann aber auch die ebenen Kartenkoordinaten, die errechnet werden, ; ; Umrechnung in Bogenmaß ; ---------------------- ; mul phi °( mul lambda °( mov sign phi sgn sign tstlt sign 89$ mov sign 1 ; Am Äquator muss sign 1 sein statt 0 89$: abs phi ; ; Robinson-Koeffizienten holen (In der Tabelle interpolieren) ; ----------------------------------------------------------- ; cmpeq phi oldphi 91$ ; aber nur wenn sich phi geändert hat mov return 91$ jump $$tab_interpol ; Liefert X-Wert (Y-Wert) an der Stelle phi nach x (y) 91$: mov oldphi phi ; ; Netzentwurf rechnen ; ------------------- ; mov x rx mov y ry mul x lambda mul x 0.8487 mul y 1.3523 ; Das wars eigentlich schon mul y sign ; Nur y braucht noch das Vorzeichen von phi ; ; Maßstab, Kartenmittelpunkt etc. einrechnen ; ------------------------------------------ ; mul x Rx' ; Erdradius div x scale ; Kartenmaßstab add x Cx' mul y Ry' div y scale add y Cy' ; ; Schlussarbeiten ; --------------- ; 111$: mov x' x mov y' y exit ; ; Unterprogramm $$tab_interpol: Koeffizient aus Tabelle linear interpolieren ; ========================================================================== ; ; Die zu einer geographischen Breite phi zugehörigen Robinson-Koeffizienten ; rx und ry werden ermittelt. ; ; Robinson-Koeffizienten sind alle 5 Grad mit 4 Dezimalstellen in der Literatur bekannt. ; Diese wurden mit kubischen Splines auf 1 Grad und 6 Stellen verdichtet und tabelliert vorbereitet. ; Das Unterprogramm interpoliert nun in dieser Tabelle mit Newtonschem Interpolationsverfahren ; mit aufsteigenden Differenzen erster und zweiter Ordnung. ; ; Definitionsbereich 0 ... 90 und noch etwas weiter. ; ; Die Parameter werden global übergeben. Das Unterprogramm erwartet: ; ; phi geographische Breite im Bogenmaß ; RX X-Tabelle als Feld mit den Elementen RX(0) ... RX(95) ; RY Y-Tabelle als Feld mit den Elementen RY(0) ... RY(95) ; return Rücksprungadresse ; ; Das Unterprogramm liefert: ; ; rx Robinson-Koeffizient x ; ry Robinson-Koeffizient Y ; $$tab_interpol: ; ; phi in Vorkomma- und Nachkommateil zerlegen ; mov r1 phi mul r1 (° ; in Gradmaß clip r1 0 91 mov .fix r1 mov .frac r1 fix .fix ; erste Stützstelle mov .fix' .fix inc .fix' ; zweite Stützstelle mov .fix'' .fix' inc .fix'' ; dritte Stützstelle frac .frac ; Nachkommastellen mov .frac- .frac dec .frac- ; Um 1 verminderte Nachkommastellen ; ; X-Wert holen ; get r2 RX .fix ; Unterer Tafelwert get r3 RX .fix' ; Mittlerer Tafelwert get r4 RX .fix'' ; Oberer Tafelwert mov .v11 r3 ; 1. Tafeldifferenz 1. Ordnung berechnen sub .v11 r2 ; mov .v12 r4 ; 2. Tafeldifferenz 1. Ordnung berechnen sub .v12 r3 ; mov .v21 .v12 ; Tafeldifferenz 2. Ordnung berechnen sub .v21 .v11 ; mov rx r2 ; Tafelwert mul .v11 .frac ; 1. Tafeldifferenz * (.frac) add rx .v11 ; Verbesserung 1. Ordnung mul .v21 .frac ; 2. Tafeldifferenz * ((.frac)*(.frac-1)) / 2 mul .v21 .frac- div .v21 2 add rx .v21 ; Verbesserung 2. Ordnung ; ; Y-Wert holen: ; get r2 RY .fix ; Unterer Tafelwert get r3 RY .fix' ; Mittlerer Tafelwert get r4 RY .fix'' ; Oberer Tafelwert mov .v11 r3 ; 1. Tafeldifferenz 1. Ordnung berechnen sub .v11 r2 ; mov .v12 r4 ; 2. Tafeldifferenz 1. Ordnung berechnen sub .v12 r3 ; mov .v21 .v12 ; Tafeldifferenz 2. Ordnung berechnen sub .v21 .v11 ; mov ry r2 ; Tafelwert mul .v11 .frac ; 1. Tafeldifferenz * (.frac) add ry .v11 ; Verbesserung 1. Ordnung mul .v21 .frac ; 2. Tafeldifferenz * ((.frac)*(.frac-1)) / 2 mul .v21 .frac- div .v21 2 add ry .v21 ; Verbesserung 2. Ordnung ; ; Ende Unterprogramm tab_interpol ; jump return ; ; Unterprogramm $$tab_init: Tabelle mit Robinson-Koeffizienten füllen ; =================================================================== ; ; Es werden zwei Tabellen mit Robinson-Koeffizienten x bzw. y gefüllt. ; ; Robinson-Koeffizienten sind alle 5 Grad mit 4 Dezimalstellen in der Literatur bekannt. ; Diese wurden mit kubischen Splines auf 1 Grad und 6 Stellen verdichtet und tabelliert vorbereitet. ; ; Damit er für eine Interpolation mit aufsteigenden Differenzen auch für höhere Ordnungen ; noch "etwas zu Futtern" hat, ist die Tabelle 95 Grad verlängert worden. ; Die Parameter werden global übergeben. Das Unterprogramm erwartet: ; ; RX eine leere Tabelle mit den Elementen RX(0) ... RX(95) ; RY eine leere Tabelle mit den Elementen RY(0) ... RY(95) ; return Rücksprungadresse ; ; Das Unterprogramm füllt die Tabellen RX und RY. ; $$tab_init: ; ; X-Koeffizienten für jedes volle Grad. Quelle: Delmelle (alle 5 Grad) ; mov RX(95) 0.501282 ; Diesen Wert zu Fuß quadratisch extrapoliert, mov RX(94) 0.507317 ; mit kubischen Splienes interpoliert ... mov RX(93) 0.513206 mov RX(92) 0.519168 mov RX(91) 0.525422 mov RX(90) 0.532185 ; eigentlich 0.5322 - die letzten beiden Stellen sind bei der Spline-Interpolation entstanden ... mov RX(89) 0.539458 mov RX(88) 0.547095 mov RX(87) 0.555096 mov RX(86) 0.563461 mov RX(85) 0.572191 ; eigentlich 0.5722 ... mov RX(84) 0.581385 mov RX(83) 0.591044 mov RX(82) 0.601016 mov RX(81) 0.611151 mov RX(80) 0.621296 ; eigentlich 0.6213 ... mov RX(79) 0.631602 mov RX(78) 0.642169 mov RX(77) 0.652773 mov RX(76) 0.663191 mov RX(75) 0.673201 mov RX(74) 0.682766 mov RX(73) 0.692036 mov RX(72) 0.701064 mov RX(71) 0.709903 mov RX(70) 0.718604 mov RX(69) 0.727135 mov RX(68) 0.735461 mov RX(67) 0.743631 mov RX(66) 0.751697 mov RX(65) 0.759708 mov RX(64) 0.767670 mov RX(63) 0.775548 mov RX(62) 0.783336 mov RX(61) 0.791027 mov RX(60) 0.798612 mov RX(59) 0.806080 mov RX(58) 0.813435 mov RX(57) 0.820697 mov RX(56) 0.827884 mov RX(55) 0.835016 mov RX(54) 0.842197 mov RX(53) 0.849414 mov RX(52) 0.856511 mov RX(51) 0.863332 mov RX(50) 0.869720 mov RX(49) 0.875563 mov RX(48) 0.880964 mov RX(47) 0.886094 mov RX(46) 0.891124 mov RX(45) 0.896223 mov RX(44) 0.901443 mov RX(43) 0.906670 mov RX(42) 0.911828 mov RX(41) 0.916839 mov RX(40) 0.921627 mov RX(39) 0.926183 mov RX(38) 0.930560 mov RX(37) 0.934769 mov RX(36) 0.938821 mov RX(35) 0.942730 mov RX(34) 0.946503 mov RX(33) 0.950131 mov RX(32) 0.953604 mov RX(31) 0.956908 mov RX(30) 0.960033 mov RX(29) 0.962970 mov RX(28) 0.965726 mov RX(27) 0.968315 mov RX(26) 0.970747 mov RX(25) 0.973036 mov RX(24) 0.975142 mov RX(23) 0.977058 mov RX(22) 0.978841 mov RX(21) 0.980548 mov RX(20) 0.982239 mov RX(19) 0.983927 mov RX(18) 0.985576 mov RX(17) 0.987161 mov RX(16) 0.988657 mov RX(15) 0.990042 mov RX(14) 0.991311 mov RX(13) 0.992481 mov RX(12) 0.993557 mov RX(11) 0.994543 mov RX(10) 0.995445 mov RX(9) 0.996256 mov RX(8) 0.996973 mov RX(7) 0.997605 mov RX(6) 0.998160 mov RX(5) 0.998647 mov RX(4) 0.999058 mov RX(3) 0.999387 mov RX(2) 0.999645 mov RX(1) 0.999846 mov RX(0) 1.000000 ; ; Y-Koeffizienten für jedes volle Grad. Quelle: Delmelle (alle 5 Grad) ; mov RY(95) 1.000000 ; Diesen Wert zu Fuß ergänzt mov RY(94) 1.000000 ; Splines liefern: 1.000393 mov RY(93) 1.000000 ; Splines liefern: 1.001169 mov RY(92) 1.000000 ; Splines liefern: 1.001752 mov RY(91) 1.000000 ; Splines liefern: 1.001569 mov RY(90) 1.000000 mov RY(89) 0.996998 ; Die 1-Grad Werte mit kubischen Splines interpoliert mov RY(88) 0.992817 mov RY(87) 0.987767 mov RY(86) 0.982116 mov RY(85) 0.976132 ; eigentlich 0.9761 - die letzten beiden Stellen sind bei der Splineinterpolation entstanden mov RY(84) 0.969755 mov RY(83) 0.962806 mov RY(82) 0.955375 mov RY(81) 0.947550 mov RY(80) 0.939421 ; eigentlich 0.9394 ... mov RY(79) 0.930910 mov RY(78) 0.921958 mov RY(77) 0.912680 mov RY(76) 0.903193 mov RY(75) 0.893610 ; eigentlich 0.8936 ... mov RY(74) 0.883912 mov RY(73) 0.874024 mov RY(72) 0.863973 mov RY(71) 0.853789 mov RY(70) 0.843499 mov RY(69) 0.833096 mov RY(68) 0.822559 mov RY(67) 0.811902 mov RY(66) 0.801141 mov RY(65) 0.790289 mov RY(64) 0.779339 mov RY(63) 0.768281 mov RY(62) 0.757127 mov RY(61) 0.745889 mov RY(60) 0.734579 mov RY(59) 0.723191 mov RY(58) 0.711716 mov RY(57) 0.700165 mov RY(56) 0.688546 mov RY(55) 0.676870 mov RY(54) 0.665129 mov RY(53) 0.653318 mov RY(52) 0.641447 mov RY(51) 0.629524 mov RY(50) 0.617560 mov RY(49) 0.605547 mov RY(48) 0.593479 mov RY(47) 0.581366 mov RY(46) 0.569220 mov RY(45) 0.557051 mov RY(44) 0.544855 mov RY(43) 0.532626 mov RY(42) 0.520368 mov RY(41) 0.508087 mov RY(40) 0.495788 mov RY(39) 0.483465 mov RY(38) 0.471116 mov RY(37) 0.458748 mov RY(36) 0.446369 mov RY(35) 0.433988 mov RY(34) 0.421600 mov RY(33) 0.409202 mov RY(32) 0.396797 mov RY(31) 0.384391 mov RY(30) 0.371988 mov RY(29) 0.359588 mov RY(28) 0.347188 mov RY(27) 0.334788 mov RY(26) 0.322388 mov RY(25) 0.309988 mov RY(24) 0.297588 mov RY(23) 0.285188 mov RY(22) 0.272788 mov RY(21) 0.260388 mov RY(20) 0.247988 mov RY(19) 0.235588 mov RY(18) 0.223188 mov RY(17) 0.210788 mov RY(16) 0.198388 mov RY(15) 0.185988 mov RY(14) 0.173588 mov RY(13) 0.161188 mov RY(12) 0.148788 mov RY(11) 0.136388 mov RY(10) 0.123988 mov RY(9) 0.111588 mov RY(8) 0.099188 mov RY(7) 0.086788 mov RY(6) 0.074388 mov RY(5) 0.061988 mov RY(4) 0.048594 mov RY(3) 0.034210 mov RY(2) 0.020323 mov RY(1) 0.008422 mov RY(0) 0.000000 ; ; Ende Unterprogramm $$tab_init ; jump return