Kartierung

JavaScript Funktionen zur Koordinatentransformation

Für die hier gezeigten 8 Funktionen zur Koordinatentransformation wird die Existenz der folgenden Variablen vorausgesetzt


var rw, hw, lp, bp, lw, bw, zone, ew, nw, raster, ew2, nw2;

Diese haben folgende Bedeutung

rw, hw Rechts-, Hochwert im deutschen Gauss-Krüger-System
lp, bp Geographische Länge und Breite auf dem Bessel-Ellipsoid (Potsdam Datum) in Grad mit Dezimalpunkt (nicht Komma)
lw, bw Geographische Länge und Breite im auf dem Internationalen Ellipsoid (WGS84 Datum), westliche Länge und südliche Breite negativ
zone, ew, nw UTM Gitterzone (2 Ziffern für die Längenzone und ein Buchstabe für das Breitenband, Beispiel: 32U), 7 stelliger Ost- und Nordwert im UTM System
raster, ew2, nw2 UTMREF Raster (UTM Gitterzone und Kennung aus 2 Buchstaben für das 100 km × 100 km Feld, Beispiel: 32UMT), 5 stelliger Ost- und Nordwert

Umrechnungen im WGS84 System

Die beiden folgenden Funktionen rechnen im WGS84 Kartenbezugssystem (world geodetic system 84) geographische Koordinaten in UTM Koordinaten um und umgekehrt.

Mit der Funktion geo2utm.js lassen sich geographische Längen und Breiten in UTM Zone, Ost- und Nordwert umrechnen:


function geo2utm(lw,bw)
{
/* Copyright (c) 2006, HELMUT H. HEIMEIER
   Permission is hereby granted, free of charge, to any person obtaining a
   copy of this software and associated documentation files (the "Software"),
   to deal in the Software without restriction, including without limitation
   the rights to use, copy, modify, merge, publish, distribute, sublicense,
   and/or sell copies of the Software, and to permit persons to whom the
   Software is furnished to do so, subject to the following conditions:
   The above copyright notice and this permission notice shall be included
   in all copies or substantial portions of the Software.*/

/* Die Funktion wandelt geographische Koordinaten in UTM Koordinaten
   um. Geographische Länge lw und Breite bw müssen im WGS84 Datum
   gegeben sein. Berechnet werden UTM Zone, Ostwert ew und Nordwert nw.*/

// Geographische Länge lw und Breite bw im WGS84 Datum
   if (lw =="" || bw == "")
   {
   zone = "";
   ew = "";
   nw = "";
   return;
   }
   if (lw <= -180 || lw > 180 || bw <= -80 || bw >= 84)
   {
   alert("Werte nicht im Bereich des UTM Systems\n"+
   "-180° <= LW < +180°, -80° < BW < 84° N");
   zone = "";
   ew = "";
   nw = "";
   return;
   }
   lw = parseFloat(lw);
   bw = parseFloat(bw);

// WGS84 Datum
// Große Halbachse a und Abplattung f
   a = 6378137.000;
   f = 3.35281068e-3;
   pi = Math.PI;
   b_sel = 'CDEFGHJKLMNPQRSTUVWXX'

// Polkrümmungshalbmesser c
   c = a/(1-f);

// Quadrat der zweiten numerischen Exzentrizität
   ex2 = (2*f-f*f)/((1-f)*(1-f));
   ex4 = ex2*ex2;
   ex6 = ex4*ex2;
   ex8 = ex4*ex4;

// Koeffizienten zur Berechnung der Meridianbogenlänge
   e0 = c*(pi/180)*(1 - 3*ex2/4 + 45*ex4/64 - 175*ex6/256 + 11025*ex8/16384);
   e2 = c*( - 3*ex2/8 + 15*ex4/32 - 525*ex6/1024 +  2205*ex8/4096);
   e4 = c*(15*ex4/256 - 105*ex6/1024 + 2205*ex8/16384);
   e6 = c*( - 35*ex6/3072 + 315*ex8/12288);

// Längenzone lz und Breitenzone (Band) bz
   lzn = parseInt((lw+180)/6) + 1;
   lz = lzn;
   if (lzn < 10) lz = "0" + lzn;
   bd = parseInt(1 + (bw + 80)/8);
   bz = b_sel.substr(bd-1,1);

// Geographische Breite in Radianten br
   br = bw * pi/180;

   tan1 = Math.tan(br);
   tan2 = tan1*tan1;
   tan4 = tan2*tan2;

   cos1 = Math.cos(br);
   cos2 = cos1*cos1;
   cos4 = cos2*cos2;
   cos3 = cos2*cos1;
   cos5 = cos4*cos1;

   etasq = ex2*cos2;

// Querkrümmungshalbmesser nd
   nd = c/Math.sqrt(1 + etasq);

// Meridianbogenlänge g aus gegebener geographischer Breite bw
   g = (e0*bw) + (e2*Math.sin(2*br)) + (e4*Math.sin(4*br)) + (e6*Math.sin(6*br));

// Längendifferenz dl zum Bezugsmeridian lh
   lh = (lzn - 30)*6 - 3;
   dl = (lw - lh)*pi/180;
   dl2 = dl*dl;
   dl4 = dl2*dl2;
   dl3 = dl2*dl;
   dl5 = dl4*dl;

// Maßstabsfaktor auf dem Bezugsmeridian bei UTM Koordinaten m = 0.9996
// Nordwert nw und Ostwert ew als Funktion von geographischer Breite und Länge

   if ( bw < 0 ) {
      nw = 10e6 + 0.9996*(g + nd*cos2*tan1*dl2/2 + nd*cos4*tan1*(5-tan2+9*etasq)
           *dl4/24);
   }
   else {
      nw = 0.9996*(g + nd*cos2*tan1*dl2/2 + nd*cos4*tan1*(5-tan2+9*etasq)
           *dl4/24);
   }
   ew = 0.9996*( nd*cos1*dl + nd*cos3*(1-tan2+etasq)*dl3/6 + nd*cos5
        *(5-18*tan2+tan4)*dl5/120) + 500000;

   zone = lz+bz;

   nk = nw - parseInt(nw);
   if (nk < 0.5) nw = "" + parseInt(nw)
   else nw = "" + (parseInt(nw) + 1);

   while (nw.length < 7)
   {
      nw = "0" + nw;
   }

   nk = ew - parseInt(ew);
   if (nk < 0.5) ew = "0" + parseInt(ew)
   else ew = "0" + parseInt(ew+1);
   return;
}

Mit der Funktion utm2geo.js lassen sich UTM Zone, Ost- und Nordwert in geographische Längen und Breiten umrechnen:


function utm2geo(zone,ew,nw)
{
/* Copyright (c) 2006, HELMUT H. HEIMEIER
   Permission is hereby granted, free of charge, to any person obtaining a
   copy of this software and associated documentation files (the "Software"),
   to deal in the Software without restriction, including without limitation
   the rights to use, copy, modify, merge, publish, distribute, sublicense,
   and/or sell copies of the Software, and to permit persons to whom the
   Software is furnished to do so, subject to the following conditions:
   The above copyright notice and this permission notice shall be included
   in all copies or substantial portions of the Software.*/

/* Die Funktion wandelt UTM Koordinaten in geographische Koordinaten
   um. UTM Zone, Ostwert ew und Nordwert nw müssen gegeben sein.
   Berechnet werden geographische Länge lw und Breite bw im WGS84 Datum.*/

// Längenzone zone, Ostwert ew und Nordwert nw im WGS84 Datum
   if (zone == "" || ew == "" || nw == "")
   {
   zone = "";
   ew = "";
   nw = "";
   return;
   }
   band = zone.substr(2,1);
   zone = parseFloat(zone);
   ew = parseFloat(ew);
   nw = parseFloat(nw);

// WGS84 Datum
// Große Halbachse a und Abplattung f
   a = 6378137.000;
   f = 3.35281068e-3;
   pi = Math.PI;

// Polkrümmungshalbmesser c
   c = a/(1-f);

// Quadrat der zweiten numerischen Exzentrizität
   ex2 = (2*f-f*f)/((1-f)*(1-f));
   ex4 = ex2*ex2;
   ex6 = ex4*ex2;
   ex8 = ex4*ex4;

// Koeffizienten zur Berechnung der geographischen Breite aus gegebener
// Meridianbogenlänge
   e0 = c*(pi/180)*(1 - 3*ex2/4 + 45*ex4/64 - 175*ex6/256 + 11025*ex8/16384);
   f2 =   (180/pi)*(    3*ex2/8 - 3*ex4/16  + 213*ex6/2048 -  255*ex8/4096);
   f4 =              (180/pi)*(  21*ex4/256 -  21*ex6/256  +  533*ex8/8192);
   f6 =                           (180/pi)*(  151*ex6/6144 -  453*ex8/12288);

// Entscheidung Nord-/Süd Halbkugel
   if (band >= "N"|| band == "")
      m_nw = nw
   else
      m_nw = nw - 10e6;

// Geographische Breite bf zur Meridianbogenlänge gf = m_nw
   sigma = (m_nw/0.9996)/e0;
   sigmr = sigma*pi/180;
   bf = sigma + f2*Math.sin(2*sigmr) + f4*Math.sin(4*sigmr)
      + f6*Math.sin(6*sigmr);

// Breite bf in Radianten
   br = bf * pi/180;
   tan1 = Math.tan(br);
   tan2 = tan1*tan1;
   tan4 = tan2*tan2;

   cos1 = Math.cos(br);
   cos2 = cos1*cos1;

   etasq = ex2*cos2;

// Querkrümmungshalbmesser nd
   nd = c/Math.sqrt(1 + etasq);
   nd2 = nd*nd;
   nd4 = nd2*nd2;
   nd6 = nd4*nd2;
   nd3 = nd2*nd;
   nd5 = nd4*nd;

// Längendifferenz dl zum Bezugsmeridian lh
   lh = (zone - 30)*6 - 3;
   dy = (ew-500000)/0.9996;
   dy2 = dy*dy;
   dy4 = dy2*dy2;
   dy3 = dy2*dy;
   dy5 = dy3*dy2;
   dy6 = dy3*dy3;

   b2 = - tan1*(1+etasq)/(2*nd2);
   b4 =   tan1*(5+3*tan2+6*etasq*(1-tan2))/(24*nd4);
   b6 = - tan1*(61+90*tan2+45*tan4)/(720*nd6);

   l1 =   1/(nd*cos1);
   l3 = - (1+2*tan2+etasq)/(6*nd3*cos1);
   l5 =   (5+28*tan2+24*tan4)/(120*nd5*cos1);

// Geographische Breite bw und Länge lw als Funktion von Ostwert ew
// und Nordwert nw
   bw = bf + (180/pi) * (b2*dy2 + b4*dy4 + b6*dy6);
   lw = lh + (180/pi) * (l1*dy  + l3*dy3 + l5*dy5);
   return;
}

Die beiden folgenden Funktionen rechnen im WGS84 Kartenbezugssystem (world geodetic system 84) zivile UTM Koordinaten in MGRS (military grid reference system), auch UTMREF Koordinaten genannt, um und umgekehrt.

Die Funktion utm2mgr.js ermittelt aus UTM Gitterzone und 7-stelligem Ost- und Nordwert das UTMREF Raster mit 5-stelligem Ost- und Nordwert:


function utm2mgr(zone,ew,nw)
{
/* Copyright (c) 2006, HELMUT H. HEIMEIER
   Permission is hereby granted, free of charge, to any person obtaining a
   copy of this software and associated documentation files (the "Software"),
   to deal in the Software without restriction, including without limitation
   the rights to use, copy, modify, merge, publish, distribute, sublicense,
   and/or sell copies of the Software, and to permit persons to whom the
   Software is furnished to do so, subject to the following conditions:
   The above copyright notice and this permission notice shall be included
   in all copies or substantial portions of the Software.*/

/* Die Funktion wandelt zivile UTM Koordinaten in militärische Koordinaten
   um. UTM Zone zone, Ostwert ew und Nordwert nw müssen gegeben sein.
   Zurückgegeben wird das Rasterfeld raster sowie die aus den
   letzten 5 Stellen von Ost- und Nordwert gebildete Koordinatenangabe
   UTMREF.*/

// Längenzone zone, Ostwert ew und Nordwert nw im WGS84 Datum
   if (zone == "" || ew == "" || nw == "")
   {
   zone = "";
   ew = "";
   nw = "";
   return;
   }

   z1 = zone.substr(0,2);
   z2 = zone.substr(2,1);
   ew1 = parseInt(ew.substr(0,2));
   nw1 = parseInt(nw.substr(0,2));
   ew2 = ew.substr(2,5);
   nw2 = nw.substr(2,5);

   m_east = 'ABCDEFGHJKLMNPQRSTUVWXYZ'
   m_north = 'ABCDEFGHJKLMNPQRSTUV'

   if (z1 < "01" || z1 > "60" || z2 < "C" ||z2 > "X")
   alert(z1 + z2 + " ist keine gültige UTM Zonenangabe");

   i = z1 % 3;
   if (i == 1) m_ce = ew1 - 1;
   if (i == 2) m_ce = ew1 + 7;
   if (i == 0) m_ce = ew1 + 15;

   i = z1 % 2;
   if (i == 1) m_cn = 0
   else m_cn = 5;

   i = nw1;
   while (i-20 >= 0) i = i-20;
   m_cn = m_cn + i;
   if (m_cn > 19) m_cn = m_cn - 20;

   raster = zone + m_east.charAt(m_ce) + m_north.charAt(m_cn);
   return;
}

Die Funktion mgr2utm.js ermittelt aus UTMREF Raster und 5-stelligem Ost- und Nordwert die UTM Gitterzone und 7-stelligen Ost- und Nordwert:

function mgr2utm(raster,ew2,nw2)
{
/* Copyright (c) 2006, HELMUT H. HEIMEIER
   Permission is hereby granted, free of charge, to any person obtaining a
   copy of this software and associated documentation files (the "Software"),
   to deal in the Software without restriction, including without limitation
   the rights to use, copy, modify, merge, publish, distribute, sublicense,
   and/or sell copies of the Software, and to permit persons to whom the
   Software is furnished to do so, subject to the following conditions:
   The above copyright notice and this permission notice shall be included
   in all copies or substantial portions of the Software.*/

/* Die Funktion wandelt militärische UTM Koordinaten (MGR oder
   UTMREF) in zivile UTM Koordinaten um.
   UTM Zone zone, raster und utmref müssen gegeben sein.
   In zone muss die aus 2 Ziffern bestehende Längenzone enthaltens ein
   gefolgt von der aus einem Buchstaben bestehenden Bandangabe.
   In raster muss die aus 2 Buchstaben bestehende Kennung für das
   100 km x 100 km Rasterfeld enthalten sein.
   In UTMREF muss der 5 stellige Ostwert stehen gefolgt von einem blank
   und dem 5 stelligen Nordwert.
   Berechnet wird daraus der 7 stellige Ost- und Nordwert im zivilen
   UTM System.*/

// Längenzone zone, Ostwert ew und Nordwert nw im WGS84 Datum
   if (raster == "" || ew2 == "" || nw2 == "")
   {
   raster = "";
   ew2 = "";
   nw2 = "";
   return;
   }

   m_east_0 = "STUVWXYZ";
   m_east_1 = "ABCDEFGH";
   m_east_2 = "JKLMNPQR";
   m_north_0 = "FGHJKLMNPQRSTUVABCDE";
   m_north_1 = "ABCDEFGHJKLMNPQRSTUV";

   zone = raster.substr(0,3);
   r_east = raster.substr(3,1);
   r_north = raster.substr(4,1);

   i = parseInt(raster.substr(0,2)) % 3;
   if (i == 0) m_ce = m_east_0.indexOf(r_east) + 1;
   if (i == 1) m_ce = m_east_1.indexOf(r_east) + 1;
   if (i == 2) m_ce = m_east_2.indexOf(r_east) + 1;
   ew = "0" + m_ce + ew2;

   i = parseInt(raster.substr(0,2)) % 2;
   if (i == 0)
      m_cn = m_north_0.indexOf(r_north)
   else
      m_cn = m_north_1.indexOf(r_north);

   band = raster.substr(2,1);
   if (band >= "N"){
      if (band == "Q" && m_cn < 10)
         m_cn = m_cn + 20;
      if (band >= "R")
         m_cn = m_cn + 20;
      if (band == "S" && m_cn < 30)
         m_cn = m_cn + 20;
      if (band >= "T")
         m_cn = m_cn + 20;
      if (band == "U" && m_cn < 50)
         m_cn = m_cn + 20;
      }
   else {
      if (band == "C" && m_cn < 10)
         m_cn = m_cn + 20;
      if (band >= "D")
         m_cn = m_cn + 20;
      if (band == "F" && m_cn < 30)
         m_cn = m_cn + 20;
      if (band >= "G")
         m_cn = m_cn + 20;
      if (band == "H" && m_cn < 50)
         m_cn = m_cn + 20;
      if (band >= "J")
         m_cn = m_cn + 20;
      if (band == "K" && m_cn < 70)
         m_cn = m_cn + 20;
      if (band >= "L")
         m_cn = m_cn + 20;
   }

   if (m_cn.length == 1)
      nw = "0" + m_cn + nw2
   else
      nw = "" + m_cn + nw2;
return;
}

Umrechnungen für das Bessel-Ellipsoid

Die beiden folgenden Funktionen rechnen für das Potsdam Kartendatum (Bessel Ellipsoid) geographische Koordinaten in Gauss-Krüger Koordinaten um und umgekehrt.

Mit der Funktion geo2gk.js lassen sich geographische Längen und Breiten für das Potsdam Kartendatum (Bessel-Ellipsoid) in deutsche Gauss-Krüger Koordinaten umrechnen:


function geo2gk(lp, bp)
{
/* Copyright (c) 2006, HELMUT H. HEIMEIER
   Permission is hereby granted, free of charge, to any person obtaining a
   copy of this software and associated documentation files (the "Software"),
   to deal in the Software without restriction, including without limitation
   the rights to use, copy, modify, merge, publish, distribute, sublicense,
   and/or sell copies of the Software, and to permit persons to whom the
   Software is furnished to do so, subject to the following conditions:
   The above copyright notice and this permission notice shall be included
   in all copies or substantial portions of the Software.*/

/* Die Funktion wandelt geographische Koordinaten in GK Koordinaten
   um. Geographische Länge lp und Breite bp müssen im Potsdam Datum
   gegeben sein. Berechnet werden Rechtswert rw und Hochwert hw.*/

// Geographische Länge lp und Breite bp im Potsdam Datum
   if (lp == "" || bp == "")
   {
   rw = "";
   hw = "";
   return;
   }
   lp = parseFloat(lp);
   bp = parseFloat(bp);

// Grenzen des Gauss-Krüger-Systems für Deutschland 46° N < bp < 55° N,
//                                                   5° E < lp < 16° E
   if (bp < 46 || bp > 56 || lp < 5 || lp > 16)
   {
   alert("Werte außerhalb des für Deutschland definierten\n"+
   " Gauss-Krüger-Systems 5° E < LP < 16° E, 46° N < BP < 55° N");
   rw = "";
   hw = "";
   return;
   }

// Potsdam Datum
// Große Halbachse a und Abplattung f
   a = 6377397.155;
   f = 3.34277321e-3;
   pi = Math.PI;

// Polkrümmungshalbmesser c
   c = a/(1-f);

// Quadrat der zweiten numerischen Exzentrizität
   ex2 = (2*f-f*f)/((1-f)*(1-f));
   ex4 = ex2*ex2;
   ex6 = ex4*ex2;
   ex8 = ex4*ex4;

// Koeffizienten zur Berechnung der Meridianbogenlänge
   e0 = c*(pi/180)*(1 - 3*ex2/4 + 45*ex4/64 - 175*ex6/256 + 11025*ex8/16384);
   e2 = c*(  - 3*ex2/8 + 15*ex4/32  - 525*ex6/1024 +  2205*ex8/4096);
   e4 = c*(15*ex4/256 - 105*ex6/1024 +  2205*ex8/16384);
   e6 = c*( -  35*ex6/3072 +   315*ex8/12288);

// Breite in Radianten
   br = bp * pi/180;

   tan1 = Math.tan(br);
   tan2 = tan1*tan1;
   tan4 = tan2*tan2;

   cos1 = Math.cos(br);
   cos2 = cos1*cos1;
   cos4 = cos2*cos2;
   cos3 = cos2*cos1;
   cos5 = cos4*cos1;

   etasq = ex2*cos2;

// Querkrümmungshalbmesser nd
   nd = c/Math.sqrt(1 + etasq);

// Meridianbogenlänge g aus gegebener geographischer Breite bp
   g = e0*bp + e2*Math.sin(2*br) + e4*Math.sin(4*br) + e6*Math.sin(6*br);

// Längendifferenz dl zum Bezugsmeridian lh
   kz = parseInt((lp+1.5)/3);
   lh = kz*3;
   dl = (lp - lh)*pi/180;
   dl2 = dl*dl;
   dl4 = dl2*dl2;
   dl3 = dl2*dl;
   dl5 = dl4*dl;

// Hochwert hw und Rechtswert rw als Funktion von geographischer Breite und Länge
   hw = (g + nd*cos2*tan1*dl2/2 + nd*cos4*tan1*(5-tan2+9*etasq)*dl4/24);
   rw =      (nd*cos1*dl         + nd*cos3*(1-tan2+etasq)*dl3/6 +
              nd*cos5*(5-18*tan2+tan4)*dl5/120 + kz*1e6 + 500000);

   nk = hw - parseInt(hw);
   if (nk < 0.5) hw = parseInt(hw)
   else hw = parseInt(hw) + 1;

   nk = rw - parseInt(rw);
   if (nk < 0.5) rw = parseInt(rw)
   else rw = parseInt(rw+1);
   return;
}

Mit der Funktion gk2geo.js lassen sich Gauss-Krüger Koordinaten in geographische Längen und Breiten des Potsdam Datums umrechnen:


function gk2geo(rw, hw)
{
/* Copyright (c) 2006, HELMUT H. HEIMEIER
   Permission is hereby granted, free of charge, to any person obtaining a
   copy of this software and associated documentation files (the "Software"),
   to deal in the Software without restriction, including without limitation
   the rights to use, copy, modify, merge, publish, distribute, sublicense,
   and/or sell copies of the Software, and to permit persons to whom the
   Software is furnished to do so, subject to the following conditions:
   The above copyright notice and this permission notice shall be included
   in all copies or substantial portions of the Software.*/

/* Die Funktion wandelt GK Koordinaten in geographische Koordinaten
   um. Rechtswert rw und Hochwert hw müssen gegeben sein.
   Berechnet werden geographische Länge lp und Breite bp
   im Potsdam Datum.*/

// Rechtswert rw und Hochwert hw im Potsdam Datum
   if (rw == "" || hw == "")
   {
   lp = "";
   bp = "";
   return;
   }
   rw = parseFloat(rw);
   hw = parseFloat(hw);

//  Potsdam Datum
// Große Halbachse a und Abplattung f
   a = 6377397.155;
   f = 3.34277321e-3;
   pi = Math.PI;

// Polkrümmungshalbmesser c
   c = a/(1-f);

// Quadrat der zweiten numerischen Exzentrizität
   ex2 = (2*f-f*f)/((1-f)*(1-f));
   ex4 = ex2*ex2;
   ex6 = ex4*ex2;
   ex8 = ex4*ex4;

// Koeffizienten zur Berechnung der geographischen Breite aus gegebener
// Meridianbogenlänge
   e0 = c*(pi/180)*(1 - 3*ex2/4 + 45*ex4/64 - 175*ex6/256 + 11025*ex8/16384);
   f2 =   (180/pi)*(    3*ex2/8 - 3*ex4/16  + 213*ex6/2048 -  255*ex8/4096);
   f4 =              (180/pi)*(  21*ex4/256 -  21*ex6/256  +  533*ex8/8192);
   f6 =                           (180/pi)*(  151*ex6/6144 -  453*ex8/12288);

// Geographische Breite bf zur Meridianbogenlänge gf = hw
   sigma = hw/e0;
   sigmr = sigma*pi/180;
   bf = sigma + f2*Math.sin(2*sigmr) + f4*Math.sin(4*sigmr)
      + f6*Math.sin(6*sigmr);

// Breite bf in Radianten
   br = bf * pi/180;
   tan1 = Math.tan(br);
   tan2 = tan1*tan1;
   tan4 = tan2*tan2;

   cos1 = Math.cos(br);
   cos2 = cos1*cos1;

   etasq = ex2*cos2;

// Querkrümmungshalbmesser nd
   nd = c/Math.sqrt(1 + etasq);
   nd2 = nd*nd;
   nd4 = nd2*nd2;
   nd6 = nd4*nd2;
   nd3 = nd2*nd;
   nd5 = nd4*nd;

//  Längendifferenz dl zum Bezugsmeridian lh
   kz = parseInt(rw/1e6);
   lh = kz*3;
   dy = rw-(kz*1e6+500000);
   dy2 = dy*dy;
   dy4 = dy2*dy2;
   dy3 = dy2*dy;
   dy5 = dy4*dy;
   dy6 = dy3*dy3;

   b2 = - tan1*(1+etasq)/(2*nd2);
   b4 =   tan1*(5+3*tan2+6*etasq*(1-tan2))/(24*nd4);
   b6 = - tan1*(61+90*tan2+45*tan4)/(720*nd6);

   l1 =   1/(nd*cos1);
   l3 = - (1+2*tan2+etasq)/(6*nd3*cos1);
   l5 =   (5+28*tan2+24*tan4)/(120*nd5*cos1);

// Geographischer Breite bp und Länge lp als Funktion von Rechts- und Hochwert
   bp = bf + (180/pi) * (b2*dy2 + b4*dy4 + b6*dy6);
   lp = lh + (180/pi) * (l1*dy  + l3*dy3 + l5*dy5);

   if (lp < 5 || lp > 16 || bp < 46 || bp > 56)
   {
   alert("RW und/oder HW ungültig für das deutsche Gauss-Krüger-System");
   lp = "";
   bp = "";
   }
   return;
}

Funktionen zur Änderung des Kartenbezugssystems WGS84 - Potsdam

Mit den beiden folgenden Funktionen lässt sich das Kartenbezugsdatum vom WGS84 System auf das Potsdam Datum (Zentralpunkt Rauenberg) und umgekehrt verschieben. Bei der Transformation werden die Ellipsoidachsen parallel verschoben um dx = 587 m, dy = 16 m und dz = 393 m. Hierbei liegt der Koordinatenursprung im Erdmittelpunkt, die positive x-Achse schneidet Äquator und Nullmeridian, die positive y-Achse schneidet Äquator und 90 grad E Meridian und die positive z-Achse schneidet den Nordpol. Die shift-Parameter dx, dy und dz sind so gewählt, dass sich bei der Umformung übereinstimmung mit den von Garmin GPS-Geräten ermittelten Werten ergibt.

Man beachte, dass in der deutschen Landesvermessung im allgemeinen mit anderen Parametern gerechnet wird, nämlich mit dx = 631 m, dy = 23 m und dz = 451 m.

Die Funktion wgs2pot.js formt geographischen Längen und Breiten des WGS84 Datums in solche des Potsdam Datums um:


function wgs2pot(lw, bw)
{
/* Copyright (c) 2006, HELMUT H. HEIMEIER
   Permission is hereby granted, free of charge, to any person obtaining a
   copy of this software and associated documentation files (the "Software"),
   to deal in the Software without restriction, including without limitation
   the rights to use, copy, modify, merge, publish, distribute, sublicense,
   and/or sell copies of the Software, and to permit persons to whom the
   Software is furnished to do so, subject to the following conditions:
   The above copyright notice and this permission notice shall be included
   in all copies or substantial portions of the Software.*/

/* Die Funktion verschiebt das Kartenbezugssystem (map datum) vom
   WGS84 Datum (World Geodetic System 84) zum in Deutschland
   gebräuchlichen Potsdam-Datum. Geographische Länge lw und Breite
   bw gemessen in grad auf dem WGS84 Ellipsoid müssen
   gegeben sein. Ausgegeben werden geographische Länge lp
   und Breite bp (in grad) auf dem Bessel-Ellipsoid.
   Bei der Transformation werden die Ellipsoidachsen parallel
   verschoben um dx = -587 m, dy = -16 m und dz = -393 m.*/

// Geographische Länge lw und Breite bw im WGS84 Datum
   if (lw == "" || bw == "")
   {
   lp = "";
   bp = "";
   return;
   }
   lw = parseFloat(lw);
   bw = parseFloat(bw);

// Quellsystem WGS84 Datum
// Große Halbachse a und Abplattung fq
   a = 6378137.000;
   fq = 3.35281066e-3;

// Zielsystem Potsdam Datum
// Abplattung f
   f = fq - 1.003748e-5

// Parameter für datum shift
   dx = -587;
   dy = -16;
   dz = -393;

// Quadrat der ersten numerischen Exzentrizität in Quell- und Zielsystem
   e2q = (2*fq-fq*fq);
   e2 = (2*f-f*f);

// Breite und Länge in Radianten
   pi = Math.PI;
   b1 = bw * (pi/180);
   l1 = lw * (pi/180);

// Querkrümmungshalbmesser nd
   nd = a/Math.sqrt(1 - e2q*Math.sin(b1)*Math.sin(b1));

// Kartesische Koordinaten des Quellsystems WGS84
   xw = nd*Math.cos(b1)*Math.cos(l1);
   yw = nd*Math.cos(b1)*Math.sin(l1);
   zw = (1 - e2q)*nd*Math.sin(b1);

//  Kartesische Koordinaten des Zielsystems (datum shift) Potsdam
   x = xw + dx;
   y = yw + dy;
   z = zw + dz;

// Berechnung von Breite und Länge im Zielsystem
   rb = Math.sqrt(x*x + y*y);
   b2 = (180/pi) * Math.atan((z/rb)/(1-e2));

   if (x > 0)
     l2 = (180/pi) * Math.atan(y/x);
   if (x < 0 && y > 0)
     l2 = (180/pi) * Math.atan(y/x) + 180;
   if (x < 0 && y < 0)
     l2 = (180/pi) * Math.atan(y/x) - 180;

   lp = l2;
   bp = b2;

   if (lp < 5 || lp > 16 || bp < 46 || bp > 56)
   {
   lp = "";
   bp = "";
   }
   return;
}

Die Funktion pot2wgs.js formt geographische Längen und Breiten des Potsdam Datums in solche des WGS84 Datums um:


function pot2wgs(lp, bp)
{
/* Copyright (c) 2006, HELMUT H. HEIMEIER
   Permission is hereby granted, free of charge, to any person obtaining a
   copy of this software and associated documentation files (the "Software"),
   to deal in the Software without restriction, including without limitation
   the rights to use, copy, modify, merge, publish, distribute, sublicense,
   and/or sell copies of the Software, and to permit persons to whom the
   Software is furnished to do so, subject to the following conditions:
   The above copyright notice and this permission notice shall be included
   in all copies or substantial portions of the Software.*/

/* Die Funktion verschiebt das Kartenbezugssystem (map datum) vom in
   Deutschland gebräuchlichen Potsdam-Datum zum WGS84 (World Geodetic
   System 84) Datum. Geographische Länge lp und Breite bp gemessen in
   grad auf dem Bessel-Ellipsoid müssen gegeben sein.
   Ausgegeben werden geographische Länge lw und
   Breite bw (in grad) auf dem WGS84-Ellipsoid.
   Bei der Transformation werden die Ellipsoidachsen parallel
   verschoben um dx = 587 m, dy = 16 m und dz = 393 m.*/

// Geographische Länge lp und Breite bp im Potsdam Datum
   if (lp == "" || bp == "")
   {
   lw = "";
   bw = "";
   return;
   }

   lp = parseFloat(lp);
   bp = parseFloat(bp);

// Quellsystem Potsdam Datum
//  Große Halbachse a und Abplattung fq
   a = 6378137.000 - 739.845;
   fq = 3.35281066e-3 - 1.003748e-05;

// Zielsystem WGS84 Datum
//  Abplattung f
   f = 3.35281066e-3;

// Parameter für datum shift
   dx = 587;
   dy = 16;
   dz = 393;

// Quadrat der ersten numerischen Exzentrizität in Quell- und Zielsystem
   e2q = (2*fq-fq*fq);
   e2 = (2*f-f*f);

// Breite und Länge in Radianten
   pi = Math.PI;
   b1 = bp * (pi/180);
   l1 = lp * (pi/180);

// Querkrümmungshalbmesser nd
   nd = a/Math.sqrt(1 - e2q*Math.sin(b1)*Math.sin(b1));

// Kartesische Koordinaten des Quellsystems Potsdam
   xp = nd*Math.cos(b1)*Math.cos(l1);
   yp = nd*Math.cos(b1)*Math.sin(l1);
   zp = (1 - e2q)*nd*Math.sin(b1);

// Kartesische Koordinaten des Zielsystems (datum shift) WGS84
   x = xp + dx;
   y = yp + dy;
   z = zp + dz;

// Berechnung von Breite und Länge im Zielsystem
   rb = Math.sqrt(x*x + y*y);
   b2 = (180/pi) * Math.atan((z/rb)/(1-e2));

   if (x > 0)
     l2 = (180/pi) * Math.atan(y/x);
   if (x < 0 && y > 0)
     l2 = (180/pi) * Math.atan(y/x) + 180;
   if (x < 0 && y < 0)
     l2 = (180/pi) * Math.atan(y/x) - 180;

   lw = l2;
   bw = b2;
   return;
}