Hallo zusammen,
hat sich schonmal jemand an einen Umrechnen-Utility versucht?
Hallo zusammen,
hat sich schonmal jemand an einen Umrechnen-Utility versucht?
Hui - Ziemliche Aufgabe! Bisher nur Online-Umrechner gefunden, z.B.: LINK
Ist auch eine Präzisionsfrage, hier: 1 m Toleranz! Das erschwetr es, eine in (x,y) gültige Polynomformel durch zweidimensionale Regression (Curve fitting)) zu finden... Bei definierten Grenzen mag das möglich sein, aber "ganz allgemein" vermutlich nicht ...
Vage Idee: Nachdem es um Ellipsoid zu Kugel geht, ist die x-Achse linear, die y-Achse quadratisch anzunähern.
Die Stützdaten (ein Gitter) hole man sich aus dem obigen Online-Converter (der angeblich auf 1 m genau ist).
Dann könnte man das Programm "Nichtlineare mehrdimensionale Regeression" HIER (Achtung, nicht ausführlich getestet) ansetzen, um auf eine "halbwegs elegante" Polynomformel in x,y zu kommen. Das ergäbe dann zumindest eine in Grenzen gültige Lösung.
Grausame Alternative: In die wissenschaftlichen Modelle einlesen, Conversionsformel an Hand von verschiedenen Onlne-Implementationen testen.
Gruss
Vielen Dank, Peter!
Ich hatte gestern folgenden Online-Converter gefunden:
https://www.engineeringtoolbox.com/utm-latitude-longitude-d_1370.html
Der erfüllt seine Arbeit sehr anstandslos, unten funktioniert auch eine Batch-Umwandlung und er startet gleich Google/Maps an der passenden Position.
Für unterwegs erfüllt die App Coordinates Converter den gleichen Zweck, ohne Batchkonvertierung allerdings.
Damit komme ich schonmal sehr gut weiter. Wenn du noch einer einer Formel suchst - bei der Genauigkeit reichen mir auch 10 m.
Ich habe die Lösung bei AutoLisp gefunden, vielen Dank!
https://forums.autodesk.com/t5/visual-lisp…ht/true#M414437
Das ist die zuständige Routine:
(defun pp_utm_watermocasin(utmX utmY utmZone / rr latitude longitude len isnorthhemisphere diflat diflon c_sa c_sb e2 e2cuadrada c x y s v a1 a2 j2 j4 j6 alfa beta gama bm epsi eps nab senoheps delt tao zone $db $ol jcxz)
(setq;|a20456|;
$db "\nError"
latitude 0
longitude 0
len (php_strlen utmZone)) (if (> len 1) (progn (setq;|a20632|;
isNorthHemisphere (substr utmZone len 1)
diflat (- 0.00066286966871111111111111111111111111)
diflon (- 0.0003868060578)
utmZone (substr utmZone 1 (- len 1))) (setq;|a20754|;
c_sa 6378137.000000) (setq;|a20770|;
c_sb 6356752.314245) (setq;|a20786|;
e2 (/ (math_pow (- (math_pow c_sa 2) (math_pow c_sb 2)) 0.5) c_sb)) (setq;|a20862|;
e2cuadrada (math_pow e2 2)) (setq;|a20894|;
c (/ (math_pow c_sa 2) c_sb)) (setq;|a20932|;
x (- utmX 500000)) (setq;|a20954|;
isNorthHemisphere (if (> isNorthHemisphere "N") T nil)) (setq;|a20990|;
y (if isNorthHemisphere utmY (- utmY 10000000))) (setq;|a21024|;
zone (atoi utmZone)) (setq;|a21048|;
s (- (* zone 6.0) 183.0)) (setq;|a21076|;
lat (/ y (* 6366197.724 0.9996))) (setq;|a21104|;
v (* (/ c (math_pow (+ 1 (* e2cuadrada (math_pow (cos lat) 2))) 0.5)) 0.9996)) (setq;|a21178|;
a (/ x v)) (setq;|a21200|;
a1 (sin (* 2 lat))) (setq;|a21224|;
a2 (* a1 (math_pow (cos lat) 2))) (setq;|a21264|;
j2 (+ lat (/ a1 2.0))) (setq;|a21292|;
j4 (/ (+ (* 3 j2) a2) 4.0)) (setq;|a21326|;
j6 (/ (+ (* 5 j4) (* a2 (math_pow (cos lat) 2))) 3.0)) (setq;|a21384|;
alfa (* (/ 3.0 4.0) e2cuadrada)) (setq;|a21412|;
beta (* (/ 5.0 3.0) (math_pow alfa 2))) (setq;|a21456|;
gama (* (/ 35.0 27.0) (math_pow alfa 3))) (setq;|a21500|;
bm (* 0.9996 c (- (+ (- lat (* alfa j2)) (* beta j4)) (* gama j6)))) (setq;|a21564|;
b (/ (- y bm) v)) (setq;|a21592|;
epsi (* (/ (* e2cuadrada (math_pow a 2)) 2.0) (math_pow (cos lat) 2))) (setq;|a21660|;
eps (* a (- 1 (/ epsi 3.0)))) (setq;|a21694|;
nab (+ (* b (- 1 epsi)) lat)) (setq;|a21728|;
senoheps (/ (- (math_exp eps) (math_exp (- eps))) 2.0)) (setq;|a21774|;
delt (atan (/ senoheps (cos nab)))) (setq;|a21800|;
tao (atan (/ (* (cos delt) (sin nab)) (cos nab)))) (setq;|a21836|;
longitude (+ (* (/ delt Math_PI) 180) s)) (setq;|a21870|;
latitude (* (/ (+ lat (* (- (+ 1 (* e2cuadrada (math_pow (cos lat) 2))) (* (/ 3.0 2.0) e2cuadrada (sin lat) (cos lat) (- tao lat))) (- tao lat))) Math_PI) 180.0)) (setq;|a21992|;
rr (strcat "\nLatitud: " (rtos latitude 2 12) "\tLongitud: " (rtos longitude 2 12))) (setq;|a22088|;
$db rr) (str_princ $db))) (princ "\nAll done okai")
$db)
Alles anzeigen
Eigenlich klar, was der Spanier Watermocasin (siehe "e2cuadrada") da programmiert hat: Da stehen Def-Befehle und Procs in "Polnischer Notation":
Etwas strukturierter:
(defun
pp_utm_watermocasin(
utmX utmY utmZone /
rr latitude longitude len isnorthhemisphere
diflat diflon
c_sa c_sb
e2
e2cuadrada
c x y s v a1 a2 j2 j4 j6
alfa beta gama
bm epsi eps nab
senoheps delt tao zone
$db
$ol jcxz
)
(setq;|a20456|;
$db "\nError"
latitude 0
longitude 0
len (php_strlen utmZone)
)(if (len>1)
(progn
(setq;|a20632|; isNorthHemisphere (substr utmZone len 1)
diflat -0.00066286966871111111111111111111111111
diflon -0.0003868060578
utmZone (substr utmZone 1 (- len 1))
)
(setq;|a20754|; c_sa 6378137.000000)
(setq;|a20770|; c_sb 6356752.314245)
(setq;|a20786|; e2 (/ (math_pow (- (math_pow c_sa 2) (math_pow c_sb 2)) 0.5) c_sb))
(setq;|a20862|; e2cuadrada (math_pow e2 2))
(setq;|a20894|; c (/ (math_pow c_sa 2) c_sb))
(setq;|a20932|; x (- utmX 500000))
(setq;|a20954|; isNorthHemisphere (if (> isNorthHemisphere "N") T nil))
(setq;|a20990|; y (if isNorthHemisphere utmY (- utmY 10000000)))
(setq;|a21024|; zone (atoi utmZone))
(setq;|a21048|; s (- (* zone 6.0) 183.0))
(setq;|a21076|; lat (/ y (* 6366197.724 0.9996)))
(setq;|a21104|; v (* (/ c (math_pow (+ 1 (* e2cuadrada (math_pow (cos lat) 2))) 0.5)) 0.9996))
(setq;|a21178|; a (/ x v))
(setq;|a21200|; a1 (sin (* 2 lat)))
(setq;|a21224|; a2 (* a1 (math_pow (cos lat) 2)))
(setq;|a21264|; j2 (+ lat (/ a1 2.0)))
(setq;|a21292|; j4 (/ (+ (* 3 j2) a2) 4.0))
(setq;|a21326|; j6 (/ (+ (* 5 j4) (* a2 (math_pow (cos lat) 2))) 3.0))
(setq;|a21384|; alfa (* (/ 3.0 4.0) e2cuadrada))
(setq;|a21412|; beta (* (/ 5.0 3.0) (math_pow alfa 2)))
(setq;|a21456|; gama (* (/ 35.0 27.0) (math_pow alfa 3)))
(setq;|a21500|; bm (* 0.9996 c (- (+ (- lat (* alfa j2)) (* beta j4)) (* gama j6))))
(setq;|a21564|; b (/ (- y bm) v))
(setq;|a21592|; epsi (* (/ (* e2cuadrada (math_pow a 2)) 2.0) (math_pow (cos lat) 2)))
(setq;|a21660|; eps (* a (- 1 (/ epsi 3.0))))
(setq;|a21694|; nab (+ (* b (- 1 epsi)) lat))
(setq;|a21728|; senoheps (/ (- (math_exp eps) (math_exp (- eps))) 2.0))
(setq;|a21774|; delt (atan (/ senoheps (cos nab)))) (setq;|a21800|;
tao (atan (/ (* (cos delt) (sin nab)) (cos nab))))
(setq;|a21836|; longitude (+ (* (/ delt Math_PI) 180) s))
(setq;|a21870|; latitude (* (/ (+ lat (* (- (+ 1 (* e2cuadrada (math_pow (cos lat) 2))) (* (/ 3.0 2.0) e2cuadrada (sin lat) (cos lat) (- tao lat))) (- tao lat))) Math_PI) 180.0))
(setq;|a21992|; rr (strcat "\nLatitud: " (rtos latitude 2 12) "\tLongitud: " (rtos longitude 2 12)))
(setq;|a22088|; $db rr) (str_princ $db))) (princ "\nAll done okay")
$db)
Alles anzeigen
P.S.: was $ol jczx da verloren hat, ein einsamer Conditional Jump on Zero ?
Da bin ich überfragt. Ich kann Montag mal testen, ob es ohne noch funktioniert. ?♂️
Würde mich schon interessieren. $ol könnte der Aufruf eines Inline-Assemblers sein, vermutet ein totaler Laie.
Anbei eine auf reinen Vermutungen basierende rudimentäre Umsetzung des Programms nach XProfan-11.2a free.
'More: https://de.wikipedia.org/wiki/UTM-Koordinatensystem
WindowTitle "UTM2WGS84"
CLS:Font 2
proc rtos$ : parameters pa!
return format$("%g",pa!)
endproc
' Main
utmX$="" 'Hier den UTm-x-Wert einsetzen
utmY$="" 'Hier Utm-y-Koordinate einsetzen
utmZone$="N" ' Wohl immmer Nordhalbkugel
pp_utm_waterboat:
'uses utmX$,utmY$,utmZone$
Declare rr!, latitude!, longitude!, leng&, isnorthhemisphere&
Declare diflat!, diflon!, c_sa!, c_sb!, e2!, e2cuadrada!
Declare c!,x!,y!,s!,v!,a1!,a2!,j2!,j4!,j6!
Declare alfa!,beta!,gama!,bm!
Declare epsi!,eps!,nab!,senoheps!,delt!,tao!,zone!
declare db$,dboljcxz$
leng&=len(utmZone$)
if leng&<2
print "\nError"
latitude!=0
longitude!=0
Goto "TheEnd"
endif
isNorthHemisphere$= Right$(utmZone$,1)
diflat!= -0.00066286966871111111111111111111111111)
diflon!= -0.0003868060578
utmZone$=left$(utmZone$,leng&-1)
c_sa!=6378137.000000
c_sb!=6356752.314245
e2!=Sqrt( sqr(c_sa!)-sqr(c_sb!) )/c_sb!
e2cuadrada!=sqr(e2!)
c!= sqr(c_sa!)/c_sb!
x!= val(utmX$)-500000)
isNorthHemisphere%= if(isNorthHemisphere$>"N", 1,0)
y!=if(isNorthHemisphere,utmY!,10000000-utmY!)
zone!=ord(utmZone$)
s! = 183.0 - zone!*6.0
lat!= y!/(6366197.724*0.9996)
v! = c!/(Sqrt(1+(e2cuadrada!*sqr(cos(lat))))))*0.9996
a! = x!/v!
a1!=sin(2*lat!)
a2!= a1!*sqr(cos(lat!))
j2!= lat!+ a1!/2.0
j4!= ((3*j2!)+a2!)/4.0
j6!= ((5*j4!)+(a2!*sqr(cos(lat!)))/3.0
alfa!= 3.0/4.0 * e2cuadrada!
beta!= 5.0/3.0 *sqr(alfa!)
gama!= 35.0/27.0 * sqr(alfa!)*alfa!
bm!= 0.9996 * c! *( ( lat! - alfa!*j2! + beta!*j4!) - gama!*j6!))
b!= (y!-bm!)/v!
epsi!= e2cuadrada! * sqr(a!)/2.0 * sqr(cos(lat!))
eps!= a!*(1-epsi!/3.0)
nab!= b!*(1-epsi))+lat!
senoheps!= (exp(eps!)-exp(-eps!))/2.0
delt!=arctan(senoheps!/cos(nab!))
tao!= arctan (cos(delt!)*sin(nab!)/cos(nab!))
longitude!= delt!/PI()*180 + s!
'(setq;|a21870|; latitude (* (/ (+ lat (* (- (+ 1 (* e2cuadrada (math_pow (cos lat) 2)) ) (* (/ 3.0 2.0) e2cuadrada (sin lat) (cos lat) (- tao lat))) (- tao lat))) Math_PI) 180.0))
var sla!=sin(lat!)
var cla!=cos(lat!)
var tml!=tao!-lat!
var cla2!=sqr(cla!)
latitude! = lat!+(1+e2cuadrada!*cla2! - 1.5*e2cuadrada!*sla!*cla!*tml!)*tml!
latitude!=latitude!*180.0/Pi()
'uff, das war vielleicht ein Klammerbaum da oben!!!
print "\nLatitude: "+rtos$(latitude!)+"\tLongitude: "+rtos$(longitude!)
TheEnd:
print "\n Ente gut, alles gut!"
waitinput
Alles anzeigen
P.S.: Für Fehlersuche bräuchte ich gültige Beispiel-Werte, falls möglich von allen Variablen. Hat Autolisp einen Debugger?
Du fragst Sachen. ?
Ich programmiere nicht wirklich in AutoLisp, sondern starte nur ab und an Scripts in AutoCAD, um an Infos zu kommen.
Wenn ich wieder fit bin, teste ich das aus. Habe am Sonntag die Impfung nicht gut vertragen. ?♂️
Hauptsache geimpft - vermutlich die zweite - angeblich immer etwas ärger als die erste ...
Gute Besserung!
Danke! Bei der ersten hatte ich keine Synthome. ?♂️
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!