
// transforma XYZ a Lat., Long. y H sobre elipsoide WGS84 u otro
// Lee de archivo encolumnado o del teclado
// Produce archivo encolumnado Lat. Long. H  en sexa o en decimales
//
// ultima correcion 8 de set 1993
// 3 de febrero de 1996: agrego decimales a los segundos
// mayo 2007 corregido para firefox
// versión JavaScript: agosto de 2002 J.L.H.



function infoe(){

nro1.salida.value+="\n\n";
nro1.salida.value+="WGS84          Internat.1924   Clarke 1866     WGS72         GRS80\n";
nro1.salida.value+="6378137        6378388         6378206.4       6378135       6378137\n";
nro1.salida.value+="0.003352811    0.003367003     0.003390075     0.003352779   0.003352811\n";
nro1.salida.value+="298.2572236    297             294.9786982     298.26        298.2572221\n";
nro1.salida.value+="\n\n";
nro1.salida.value+="ANS            Airy            Clarke 1858     '165'         Clarke 1880\n";
nro1.salida.value+="6378160.000    6377563.396     6378293.645     6378165.000   6378249.145\n";
nro1.salida.value+="0.003352892    0.003340851     0.003352811     0.003352330   0.003407561\n";
nro1.salida.value+="298.25         299.3249646     294.26          298.3         293.465\n";
nro1.salida.value+="\n\n";
nro1.salida.value+="Bessel 1841    Everest         Fischer 1968    SA 1969       Helmert 1906\n";
nro1.salida.value+="6377397.155    6377276.345     6378150.0       6378160.0     6378200.0\n";
nro1.salida.value+="0.003342773    0.0033244493    0.0033523299    0.003352892   0.0033523299\n";
nro1.salida.value+="299.1528128    300.8017        298.3           298.25        298.3\n";
nro1.salida.value+="\n\n";
nro1.salida.value+="WGS 60         WGS 66          GRS 67          Fischer 1960  Hough\n";
nro1.salida.value+="6378165.0      6378145.0       6378160.0       6378166.0     6378270.0\n";
nro1.salida.value+="0.003352330    0.003352892     0.0033529237    0.0033523299  0.003367003\n";
nro1.salida.value+="298.3          298.25          298.247167427   298.3         297.0\n";
nro1.salida.value+="\n\n";
nro1.salida.value+="Hayford 1909   Krassovsky      Struve 1860     S.G.S. 1985   S.G.S. 1990\n";
nro1.salida.value+="6378388.0      6378245.0       6378298.3       6378136.0     6378136.0\n";
nro1.salida.value+="0.003367465    0.003352330     0.003392936     0.003349298   0.003352804\n";
nro1.salida.value+="296.9592630    298.3           294.73          298.257       298.2578393\n";


}




function borrar() {

nro1.salida.value="";

}

function info() {
nro1.salida.value+="\n\n";
nro1.salida.value+="XYZ2FILA.htm\n\n";
nro1.salida.value+="Transformación de cartesianas geocéntricas\n";
nro1.salida.value+="a geográficas geodésicas\n";
nro1.salida.value+="para distintos elipsoides.\n";
nro1.salida.value+="Autor: J.L.Hormaechea\n";
nro1.salida.value+="Versión HTML - JavaScript - agosto 2002\n";
nro1.salida.value+="Corregido para Firefox    -   mayo 2007\n";
nro1.salida.value+="E-mail: jlhor@earg.gov.ar\n\n";


}

function formatnumber(aaaa, np){

var pot=Math.pow(10,np);
var ss=signo(aaaa);
aaaa=Math.floor(Math.abs(aaaa*pot)+0.5);
aaaa=aaaa/pot*ss;
return aaaa;
}

function signo(aaaa){
if (aaaa < 0) return -1;
if (aaaa == 0) return 0;
if (aaaa > 0) return 1;
}



function xyz2geo() {

b=" ";


semieje = new Array(6378137,6378137,6378388,6378206.4,6378135,6378245.0, 6378388);
aplanai = new Array(298.2572236, 298.257222101, 297, 294.9786982, 298.26, 298.3, 296.959263);

indice=nro1.elipsoide.value;
if (indice < 7) {
nro1.aaa.value=semieje[indice];
nro1.fff.value=aplanai[indice];
}


a = nro1.aaa.value;
f = 1 / nro1.fff.value;

//  GRS80
// f = 1 / 298.257222101;


e2 = 2 * f - f * f;
xk = 180 / 3.141592653589793;

xd6 = 60;
xd36 = 3600;



//     PASAJE DE RECTANGULARES A GEOGRAFICAS

fin = 0; 
reg = 0;


x = nro1.xx1.value;
y = nro1.xx2.value;
z = nro1.xx3.value;


if (x != 0) {

 ydx = y / x;
// xlat ==> Longitud
 xlat = Math.atan(ydx) * xk;
 xs = x * x + y * y;
 xs = Math.sqrt(xs);
 zdxs = 1 / (1 - e2) * z / xs;
 zd0 = zdxs;
 do {
  zlat = Math.atan(zdxs);
  n = a / Math.sqrt((1 - e2 * Math.sin(zlat) * Math.sin(zlat)));
  zdxs = (1 + e2 * n * Math.sin(zlat) / z) * z / xs;
  dif = Math.abs(zd0 - zdxs);
  zd0 = zdxs;
 } while (dif > .0000000001);

// zlat ==> Latitud
 zlat = Math.atan(zdxs) * xk;

      nro1.xlatg.value = Math.floor(Math.abs(xlat))*signo(xlat);
      nro1.xlatm.value = Math.floor((Math.abs(xlat) - Math.abs(nro1.xlatg.value)) * xd6);
      nro1.xlats.value = (Math.abs(xlat) - Math.abs(nro1.xlatg.value) - nro1.xlatm.value / xd6) * xd36;
      nro1.zlatg.value = Math.floor(Math.abs(zlat))*signo(zlat);
      nro1.zlatm.value = Math.floor((Math.abs(zlat) - Math.abs(nro1.zlatg.value)) * xd6);
      nro1.zlats.value = (Math.abs(zlat) - Math.abs(nro1.zlatg.value) - nro1.zlatm.value / xd6) * xd36;

      nro1.h.value = x / (Math.cos(zlat / xk) * Math.cos(xlat / xk)) - n;

nro1.contador.value=eval(nro1.contador.value)+1;

if (nro1.contador.value==1)  
nro1.salida.value="         x            y            z           long.        lat.       G  M   S       G  M  S       h \n"; 

nro1.salida.value+=nro1.nombre.value+b;
nro1.salida.value+=formatnumber(x,3)+b;
nro1.salida.value+=formatnumber(y,3)+b;
nro1.salida.value+=formatnumber(z,3)+b;
nro1.salida.value+=formatnumber(xlat,8)+b;
nro1.salida.value+=formatnumber(zlat,8)+b;
nro1.salida.value+=nro1.xlatg.value+b;
nro1.salida.value+=nro1.xlatm.value+b;
nro1.salida.value+=formatnumber(nro1.xlats.value,5)+b;
nro1.salida.value+=nro1.zlatg.value+b;
nro1.salida.value+=nro1.zlatm.value+b;
nro1.salida.value+=formatnumber(nro1.zlats.value,5)+b;
nro1.salida.value+=formatnumber(nro1.h.value,3)+"\n";


}


} 

