GNavigia und sein Hin­ter­grund

COM-Ser­ver für Hin­ter­grund­bil­der be­reit­stel­len

Historisch, nur noch sinngemäß anwendbar!

GNavigia wird mit ei­nem Back­ground Pro­vi­der aus­ge­lie­fert, der in der La­ge ist, Bil­der mit ei­ner ex­trem ho­hen Auflösung be­reit­zu­stel­len. Wie das geht, be­schrei­ben wir auf ei­ner ei­ge­nen Sei­te, die sich ganz all­ge­mein mit der Nut­zung von WMS-Ser­vices be­fasst. Ins­be­son­de­re die Lan­des­ver­mes­sungsämter verfügen über Da­ten mit ei­nem 40 Zen­ti­me­ter Ras­ter in Far­be. Die­se Bil­der wur­den mit Steu­er­gel­dern er­mit­telt, sol­len aber den  Bürgern nicht (oder nur sehr ein­ge­schränkt) kos­ten­frei zur Verfügung ste­hen; ein Skan­dal, der be­reits von der EU-Kom­mis­si­on auf­ge­grif­fen wur­de und (hof­fent­lich bald) zu frei­en Geo­da­ten führen wird! Neu ist auch ei­ne An­bin­dung an das OSM-Pro­jekt (O­pen Street Map), ei­ne ers­te Be­schrei­bung ist er­stellt. Der Ge­dan­ke, den Geo­ser­ver ein­zu­set­zen, ist we­gen Lauf­zeit­pro­ble­men und auf­grund fast per­fek­ter Dar­stel­lung durch den Map­nik-Ren­de­rer auf­ge­ge­ben wor­den. Ein Bei­spiel aus der Re­gi­on Bonn ist als Er­geb­nis der Bemühun­gen übrig ge­blie­ben, ei­ne PNG-Datei (True-Color-GIF)..
*
Wer sich mit dem Com­po­nent Ob­ject Mo­del, kurz «COM», aus­kennt, kann ei­nen zur Lauf­zeit nach­lad­ba­ren Ser­ver zur Be­reit­stel­lung von Hin­ter­grund­bil­dern für GNavigia schrei­ben. (Ei­ne Bei­spie­lan­bin­dung, von der .NET-Pro­gram­me ab­lei­ten können, liegt GNavigia un­ter dem Na­men GpsBack­groun­dPro­vi­der bei. Al­ler­dings un­terstützt die­se zur­zeit nicht die asyn­chro­ne Schnitt­stel­le!)
Das Ob­jekt muss da­zu le­dig­lich ei­nen pa­ra­me­ter­lo­sen Kon­struk­tor so­wie die IGpsBack­groun­dPro­vi­derA­sync Schnitt­stel­le im­ple­men­tie­ren und die Re­gis­trie­rung als COM Ob­jekt um den Un­ter­schlüssel
  {353899B1-448D-4d3b-876D-5F6BBF59BBB6}
er­wei­tern. Wer von der o.a. Klas­se ab­lei­tet, erhält die Er­zeu­gung des Un­ter­schlüssels «frei Haus».
Die­ser Schlüssel, bei dem es sich um ei­ne GUID han­delt, wird aus­ge­wer­tet, wenn im Menü «An­sicht/Ser­ver der Hin­ter­grund­bil­der auswählen» gewählt wird. Es er­scheint dann ei­ne Lis­te al­ler Ob­jek­te zur Aus­wahl, die die­sen Un­ter­schlüssel an­ge­ben. Die Auf­lis­tung dau­ert ei­nen klei­nen Mo­ment. Der dar­ge­stell­te Na­me ist der des COM Ob­jekts, auch als «Prog-ID» be­zeich­net; in­tern wird die GUID ge­spei­chert.
Zur Re­gis­trie­rung des COM-Objekts muss der Ent­wick­ler über Ad­mi­nis­tra­tor­rech­te verfügen, da die Ein­träge un­ter HKEY_CLASSES_ROOT er­fol­gen. Wer nicht als Ad­mi­nis­tra­tor ent­wi­ckeln will, der kann, zu­min­dest un­ter .NET, zur ers­ten Re­gis­trie­rung die Ent­wick­lungs­um­ge­bung als Ad­min­stra­tor star­ten und da­nach die Op­ti­on «Für COM re­gis­trie­ren» aus­schal­ten. Die Re­gis­trie­rung ist nur ein­mal nötig, um das COM Ob­jekt und das In­ter­face be­kannt zu ma­chen, da­nach er­folgt die Ent­wick­lung als ganz nor­ma­le Klas­sen­bi­blio­thek.

An­for­de­rung der Hin­ter­grund­bil­der

Die Funk­tio­na­lität, die die Schnitt­stel­le IGpsBack­groun­dPro­vi­derA­sync sicht­bar zur Verfügung stellt, be­steht aus ei­ner ein­zi­gen Metho­de, die stets ein ge­nau pas­sen­des Bild zur Verfügung stellt. Da­zu wer­den die Aus­maße der Dar­stel­lungs­fläche und des Ge­biets in UTM Koor­di­na­ten an den Ser­ver über­ge­ben, so­wie Da­ten, die der Ser­ver zu­sam­men mit dem Bild an GNavigia zurück­sen­den muss. Op­ti­mie­run­gen, wie das an­spruchs­vol­le Ca­ching von Bil­dern oder das Aus­schnei­den von Ge­bie­ten aus über­großen Bild­da­ten muss der Ser­ver be­han­deln. Nur beim Ver­schie­ben des Mit­tel­punkts so­wie  beim Ver­größern und Ver­klei­nern von Bil­dern be­rech­net GNavigia vorüber­ge­hend ein Teil­bild.

Ini­tia­li­sie­rung des Menüs

Das Menü wird ei­ner­seits aus der An­fra­ge an die Schnitt­stel­len­me­tho­den in­itia­li­siert, an­de­rer­seits aber auch aus In­for­ma­tio­nen aus der Re­gis­trie­rungs­da­ten­bank. Wenn ei­ne gülti­ge Hin­ter­grund­ver­bin­dung aus­gewählt wird, er­scheint sie beim Wie­der­auf­star­ten der Appli­ka­ti­on, in­itia­li­siert aus der Re­gis­trie­rung.


Ei­gen­schaf­ten der Hin­ter­grund­bil­der

Hin­ter­grund­bil­der ha­ben die Ei­gen­schaft, dass sie für das ebe­ne Koor­di­na­ten­sys­tem, hier im­mer ein UTM Koor­di­na­ten­sys­tem, an­ge­for­dert wer­den. Er­for­dert der Dienst, der letzt­lich die Bil­der zur Verfügung stellt, die An­ga­ben der Eck­punk­te im Welt­ko­or­di­na­ten­sys­tem in geo­gra­fi­schen Koor­di­na­ten, so muss der Back­ground­pro­vi­der die­se be­rech­nen. Die­sem und dem The­ma der trans­pa­ren­ten Dar­stel­lung der Bil­der ist ei­ne Fol­ge­sei­te ge­wid­met.

Die IGpsBack­groun­dPro­vi­derA­sync Schnitt­stel­le

Die früher ein­mal do­ku­men­tier­te IGpsBack­groun­dPro­vi­der Schnitt­stel­le ist auf­ge­ge­ben wor­den. Statt des­sen wur­de ein asyn­chro­nes Ver­fah­ren im­ple­men­tiert, das es er­laubt, das Hin­ter­grund­bild zu emp­fan­gen statt ab­zu­ho­len. Dafür muss der zurück­ru­fen­de COM-Ser­ver ei­nen dy­na­mi­schen Auf­ruf an GNavigia im­ple­men­tie­ren. Der Na­me der Metho­de, die auf­zu­ru­fen ist, wird von GNavigia an den Ser­ver über­ge­ben. Der Ser­ver hat fol­gen­de Schnitt­stel­le zu im­ple­men­tie­ren:
[In­ter­fa­ceTy­pe(ComIn­ter­fa­ceTy­pe.In­ter­fa­ceIsIDispatch)]
[Guid("4435F26B-7F4D-4732-AB01-0D2F98B24CE5")]
in­ter­face IGpsBack­groun­dPro­vi­derA­sync
{
// <sum­ma­ry>
//
// </sum­ma­ry>
// <pa­ram na­me="xm­lDo­cu­ment"></pa­ram>
// <pa­ram na­me="user­da­ta"></pa­ram>
// <pa­ram na­me="hwnd"></pa­ram>
// <pa­ram na­me="can­vasWidth"></pa­ram>
// <pa­ram na­me="can­vasHeight"></pa­ram>
// <pa­ram na­me="ut­mNorth"></pa­ram>
// <pa­ram na­me="ut­mWest"></pa­ram>
// <pa­ram na­me="ut­mSouth"></pa­ram>
// <pa­ram na­me="ut­mEast"></pa­ram>
vo­id GpsGetBit­mapExac­tA­sync(string xm­lDo­cu­ment, ob­ject user­da­ta, int hwnd,
 int can­vasWidth, int can­vasHeight,
 dou­ble ut­mNorth, dou­ble ut­mWest,
 dou­ble ut­mSouth, dou­ble ut­mEast);
// <sum­ma­ry>
// If GNavigia uses a call­back na­med TheI­ma­geCall­back, than the ser­ver has to
// in­vo­ke a call to "TheI­ma­geCall­back" with the pa­ra­me­ters user­da­ta from the
// GpsGetBit­mapExac­tA­sync call, the .NET Bit­map Ima­ge and a string that of­fers
// an XML do­cu­ment. This string may be NULL if no da­ta is to be trans­fe­red. If
// the user spe­ci­fies a co­py­right string, it is trans­fe­red in this string.
// The call­back:
// vo­id TheI­ma­geCall­back(ob­ject user­da­ta, Ima­ge image, string xm­lDo­cu­ment)
// </sum­ma­ry>
// <pa­ram na­me="theCal­ler"></pa­ram>
// <pa­ram na­me="GpsI­ma­geCall­backNa­me"></pa­ram>
vo­id GpsSetI­ma­geCall­back(ob­ject theCal­ler, string GpsI­ma­geCall­backNa­me);
}

Der for­ma­le Pa­ra­me­ter «hwnd» ist vom Typ int (Int32) und re­präsen­tiert je­nes Win­dowhand­le, das die Ur­ge­stei­ne der Fens­ter­pro­gram­mie­rung seit den aus­ge­hen­den 80er Jah­ren des vo­ri­gen Jahr­hun­derts ken­nen soll­ten. Es hat nur ei­nen ein­zi­gen Wert, nämlich ei­nen even­tu­ell not­wen­di­gen Dia­log an ei­nem Fens­ter fest­ma­chen zu können und so die Ket­te der durch mo­da­le Dia­lo­ge ab­ge­schal­te­ten Fens­ter nicht zu un­ter­bre­chen. Der .NET-Pro­gram­mie­rer kann das Hand­le di­rekt nut­zen, in­dem er ein Ob­jekt der  fens­ter­na­hen Klas­se «Tem­po­ra­ryOw­ner» an­legt, die selbst wie­der­um kei­ne an­de­re Auf­ga­be hat, als die Schnitt­stel­le «IWin32Win­dow» be­reit­zu­stel­len, die ih­rer­seits kei­ne an­de­re Auf­ga­be hat, als das Win­dowhand­le verfügbar zu ma­chen. COM Pro­gram­mie­rer ha­ben es an die­ser (und nur an die­ser) Stel­le ein­fa­cher: Sie cas­ten den Wert auf HWND und können ihn als pa­rent win­dow hand­le be­nut­zen.

Bil­der­mitt­lung star­ten

Die Bil­der­mitt­lung wird asyn­chron ge­st­ar­tet. Da­durch kann man im bes­ten Fall mit GNavigia wei­ter­ar­bei­ten, als sei kei­ne An­for­de­rung er­folgt. Nur ein kur­zes Zu­cken des Maus­zei­gers deu­tet an, dass ein Bild an­ge­for­dert wur­de.
Htt­pWe­bRe­quest htt­pWe­bRe­quest = (Htt­pWe­bRe­quest)We­bRe­quest.Crea­te(mapUrl);
if (htt­pWe­bRe­quest == null)
...; // hand­le er­ror.
htt­pWe­bRe­quest.Be­ginGetRe­spon­se(new MyA­syn­cCall­back(Asyn­cRe­sult), htt­pWe­bRe­quest);
Die in­ter­ne Call­back­me­tho­de des Hin­ter­grund­bild­be­reit­stel­lers, die das En­de der Bil­derübert­ra­gung er­lebt, führt den Rück­ruf durch. Sie ist zur­zeit wie folgt im­ple­men­tiert:
pri­va­te vo­id MyA­syn­cRe­sult(IA­syn­cRe­sult asyn­cRe­sul­tI)
{
if (asyn­cRe­sul­tI.IsCom­ple­ted)
{
Htt­pWe­bRe­quest re­quest = (Htt­pWe­bRe­quest)asyn­cRe­sul­tI.Asyn­cSta­te;
We­bRe­spon­se we­bRe­spon­se = re­quest.En­dGetRe­spon­se(asyn­cRe­sul­tI);
if (we­bRe­spon­se != null)
try
{
Stream stream = we­bRe­spon­se.GetRe­spon­seStream();
if (stream != null)
{ // ACHTUNG: Nicht auf den Stream zu­grei­fen!
// Die­se Zei­le cras­hed mit der Mel­dung:
// "Die­ser Stream un­terstützt kei­ne Such­vorgänge."
// long stre­amLength = stream.Length;
Ima­ge image = new Bit­map(stream);
if (image != null)
m_theCal­ler.GetTy­pe().In­vo­keMem­ber(m_­cal­ler­sCall­backNa­me,
 Bin­dingFlags.In­vo­keMethod, null, m_theCal­ler,
 new ob­jec­t[] { image, m_theCal­ler­sDa­ta, m_xm­lDo­cu­ment });
stream.Clo­se(); // Re­sour­cen­scho­nend, un­ser Bei­trag zum Kyoto-Pro­to­koll!
}
} catch (Ex­cep­ti­on ex) { ...; }
}
}

Das XML-Doku­ment

Das XML-Doku­ment in der Schnitt­stel­len­be­schrei­bung enthält zur­zeit fol­gen­de Kno­ten:
  • Re­sult, 0: Er­folg, an­de­re Wer­te si­gna­li­sie­ren ei­nen Feh­ler. Die­se Feh­ler­num­mer wird in an­ge­zeigt.
  • Co­py­right (mehr­zei­lig, ge­trennt im Bei­spiel­pro­gramm durch senk­rech­ten Strich), hier er­folgt ei­ne au­to­ma­ti­sche Er­set­zung von (C), (R) und (at) durch die ent­spre­chen­den Son­der­zei­chen.
<?xml ver­si­on=\"1.0\" en­co­ding=\"ISO-8859-1\"?>
<GNavigiaBack­groun­dPro­vi­der>
<Re­sult>0</Re­sult>
<Er­ror>
<li­ne>Al­les Bes­tens!</li­ne>
<li­ne>Re­sult ist 0, das er­freut das Herz!</li­ne>
<Er­ror>
<Co­py­right>
<li­ne>Bild­da­ten: (C) LVer­mGeo Rhein­land-Pfalz</li­ne>
<li­ne>Freie to­po­gra­phi­sche Ras­ter­da­ten­diens­te</li­ne>
 <li­ne>post­stel­le(at)lverm­geo.rlp.de</li­ne>
  </Co­py­right>
</GNavigiaBack­groun­dPro­vi­der>

Ex­cep­ti­ons

Wer­fen Sie nie­mals ei­ne Aus­nah­me (Ex­cep­ti­on), die die Schnitt­stel­le verlässt. Sor­gen Sie dafür, dass die Aus­nah­men in­ner­halb der Schnitt­stel­le blei­ben und be­nut­zen Sie das vor­ge­se­he­ne XML-Doku­ment als In­di­ka­tor für Feh­ler beim Auf­ruf der Call­back­me­tho­de. Set­zen Sie im Feh­ler­fall den Pa­ra­me­ter Ima­ge auf null. Wer .NET be­nutzt kann das Feh­ler­do­ku­ment als Se­ria­li­sie­rung er­stel­len oder Schnitt­stel­len aus der Um­ge­bung der
 Uti­li­ties.dll 
auf­ru­fen. Da­mit ist das Ver­pa­cken der In­for­ma­ti­on be­son­ders ein­fach.


Trans­pa­renz

Ich ha­be mich da­zu ent­schie­den, die Trans­pa­renz der Hin­ter­grund­bil­der im Pro­gramm GNavigia selbst zu ver­wal­ten. Das ent­schei­den­de Ar­gu­ment ist wohl, dass der ak­tu­ell zu­sam­men­ge­stell­te In­halt und die Lay­out­wahl den Grad der er­for­der­li­chen Trans­pa­renz be­stimmt. Die Trans­pa­renz wird zu­sam­men mit den An­ga­ben zum Back­ground­pro­vi­der in der GTD-Datei ge­spei­chert. Die Trans­pa­renz kann Wer­te zwi­schen 0 und 90% an­neh­men. Bei 100% würde es zu der Si­tua­ti­on kom­men, dass der Hin­ter­grund Ausführungs­zeit er­for­dert, oh­ne dass dem ei­ne er­kenn­ba­re Ge­gen­leis­tung ent­spräche. Wer 100% Trans­pa­renz benötigt, kann die An­zei­ge des Hin­ter­grund­bil­des aus­schal­ten. Ab­wei­chend vom Stan­dard kann im Dia­log durch Ankli­cken der je­wei­li­gen Zahl ein (mehr oder min­der) runder Trans­pa­renz­wert ein­ge­stellt wer­den.

Koor­di­na­ten und Trans­for­ma­tio­nen

Koor­di­na­ten im Sin­ne von GNavigia sind ebe­ne UTM Koor­di­na­ten und el­lip­soi­di­sche Länge und Brei­te. Da ein El­lip­so­id kei­ne Tor­se ist, kann auch kei­ne ver­zer­rungs­freie Ab­bil­dung in die Ebe­ne er­fol­gen. Da­mit hat der Kar­to­graf die Wahl zwi­schen ei­ner «längen­treu­en» und ei­ner «win­kel­treu­en» Ab­bil­dung. Während die längen­treue Ab­bil­dung die Ver­gleich­bar­keit der Flächen erhält, bie­tet die win­kel­treue dem Geodäten und dem Na­vi­ga­tor ge­rin­ge­re Kor­rek­tu­ren bei Win­kel­mes­sun­gen. Da sich Win­kel früher bei glei­chem Auf­wand we­sent­lich ge­nau­er mes­sen ließen als Stre­cken, ha­ben sich die «im Dif­fe­ren­ti­el­len win­kel­treu­en» Gaußschen Koor­di­na­ten durch­ge­setzt, und zwar in Deutsch­land auf dem von Bes­sel be­rech­ne­ten El­lip­so­id un­ter dem Na­men «Gauß-Krüger», im Os­ten auf dem El­lip­so­id von Kras­sow­ski  und im Wes­ten auf dem von Hay­ford. Die be­reits in ers­ter Nähe­rung von Mer­ca­tor ge­fun­de­nen und zur Kar­tie­rung be­nutz­ten For­meln wer­den da­her auch als Mer­ca­tor-Koor­di­na­ten be­zeich­net, in der um ei­nen Maßstabs­fak­tor von 0,9996 verkürz­ten Form schließlich als trans­ver­sa­le Mer­ka­tor Pro­jek­ti­on. In der Fas­sung mit welt­weit gülti­gen Ken­nun­gen wer­den dar­aus «uni­ver­sa­le, trans­ver­sa­le Mer­ka­tor­ko­or­di­an­ten» (UTM). Der Maßstabs­fak­tor ist not­wen­dig, um die Ver­zer­run­gen am Rand der 6° brei­ten Strei­fen in er­trägli­chem Rah­men zu hal­ten. Der dar­aus re­sul­tie­ren­de Feh­ler von 4cm/100m am Mit­tel­me­ri­di­an ist aber so groß, dass er für geodäti­sche Zwe­cke kor­ri­giert wer­den muss. Da UTM Koor­di­na­ten so­wohl im Nord- als auch im Ost­wert von Länge und Brei­te zu­gleich abhängen, muss ein Koor­di­na­ten­paar stets ge­mein­sam um­ge­rech­net wer­den.
*
Pro­gram­mie­rer, die .NET ein­set­zen, können die Biblio­the­ken
 Ma­the­ma­tics.dll 
Uti­li­ties.dll
be­nut­zen, um Koor­di­na­ten zwi­schen den Sys­te­men um­zu­rech­nen. Für al­le an­de­ren ist ei­ne Schnitt­stel­le in Pla­nung, die die Trans­for­ma­tio­nen rea­li­siert. Als Bei­spiel die­ne hier der auf die Be­rech­nun­gen be­schränk­te Teil des Kon­struk­tors der Dia­log­klas­se GpsDl­gTrans­for­ma­tio­nen. Der Dia­log ist aus dem Menü her­aus zu er­rei­chen un­ter Ex­tras/Trans­for­ma­ti­ons­ge­nau­ig­keit, x und y sind geodätisch ver­tauscht. Die Ge­nau­ig­keit der Trans­for­ma­ti­on liegt bei et­wa 2 Zen­ti­mer am Rand des Koor­di­na­ten­sys­tems, al­so 3° vom Mit­tel- oder Be­zugs­me­ri­di­an ent­fernt:
pu­blic GpsDl­gTrans­for­ma­tio­nen()
{
string l = "6.144386528";
string b = "50.799758619";
UTM utm = new UTM("WGS 84");
utm.SetNo­tifyCal­ler = new UTM.No­tifyCal­ler(No­ti­fi­ca­ti­on);
// Rech­ne Länge/Brei­te in UTM um. Ein­ga­be in De­zi­ma­lalt­grad.
listBox.Items.Add("== UTM Trans­for­ma­ti­on ==");
listBox.Items.Add("l = " + l + " b = " + b);
utm.Trans­form(l, b);
string fmt = "{0} - Y: {1,10} X: {2,10}";
dou­ble y = 298778.194; // Soll­wert Hoch/Nord
dou­ble x = 5631445.022; // Soll­wert Rechts/Ost
listBox.Items.Add(String.For­mat(fmt, "Soll",
Str.ToString(y, 3), Str.ToString(x, 3)));
listBox.Items.Add(String.For­mat(fmt, " Ist",
Str.ToString(utm.Y, 3), Str.ToString(utm.X, 3)));
listBox.Items.Add("");
// Rech­ne UTM in Länge/Brei­te um.
listBox.Items.Add("== UTM Um­kehrtrans­for­ma­ti­on ==");
listBox.Items.Add("Y = " + Str.ToString(y, 3) + " X = " + Str.ToString(x, 3));
dou­ble l1, b1;
utm.Trans­form(32, y, x, out l1, out b1);
listBox.Items.Add(String.For­mat("L = {0,11} B = {1,11}",
Str.ToString(l1, 9), Str.ToString(b1, 9)));
// Me­ri­dan­bo­genlänge aus­ge­ben. Mit­tel­me­ri­dia­ne lie­gen bei 3°, 9°, 15° etc.
listBox.Items.Add("");
listBox.Items.Add("== Ne­ben­rech­nung: Me­ri­dian­bo­genlänge ==");
l = "9.0";
listBox.Items.Add("l = " + l + " b = " + b);
utm.Trans­form(l, b);
listBox.Items.Add("Bo­genlänge: " + Str.ToString(utm.X, 3));
}

Welt­weit ein­deu­ti­ge Po­si­ti­ons­an­ga­ben

Ei­ne Po­si­ti­ons­an­ga­be im UTM For­mat hat die Form «32 P 666666 UTM 1234567». Da­rin be­deu­ten:
  • 32: UTM-Zone 32 mit dem Be­zugs­me­ri­di­an 9 Grad Ost. Die Zo­nen zählen von 1 (180°-174° West) in östli­cher Rich­tung bis 60 (174°-180° Grad E).
  • P: Teil­be­reich zwi­schen 8° Nord und 16° Nord. Den Teil­be­rei­chen von je 8° Grad sind Buch­sta­ben zu­ge­ord­net, be­gin­nend mit C (80° bis 72° Süd) bis X (72°-80° Nord) un­ter Aus­las­sung der Buch­sta­ben I und O. C bis M lie­gen auf der Südhalb­ku­gel, N bis X nörd­lich des Äqua­tors.
  • 666666: Ost- oder Rechts-Wert des Or­tes. Er liegt in die­sem Bei­spiel rund 166666 Me­ter östlich des Be­zugs­me­ri­dians, der den Ost-Wert 500000 Me­ter auf­weist, um ne­ga­ti­ve Koor­di­na­ten zu ver­mei­den. Für Or­te östlich oder west­lich da­von wird der Ab­stand zum Off­set (mul­ti­pli­ziert mit dem Ska­len­fak­tor 0,9996) hin­zu ad­diert oder ab­ge­zo­gen (West: mi­nus, Ost: plus).
  • 1234567: Nord- oder Hoch­wert des Or­tes in Me­ter. Für ei­nen Ort auf dem Be­zugs­me­ri­di­an (und nörd­lich des Äqua­tors) ist das die Länge des Me­ri­dian­bo­gens ge­mes­sen vom Äqua­tor, mul­ti­pli­ziert mit dem Ska­len­fak­tor von 0,9996.