如何使用Rhino库在Java中使用JavaScript代码?

3
我正在开发一个GPS应用程序,我想将我的经纬度根据WGS84基准转换为x-y坐标。 我找到了这个js页面来实现这个功能:http://www.uwgb.edu/dutchs/usefuldata/ConvertUTMNoOZ.HTM。 我也看过其他计算器,但是这个更加精确。 现在,如果您查看源代码,可以找到执行转换的函数。 我通过谷歌搜索了如何在Java中使用js代码,并发现可以使用此库:http://www.mozilla.org/rhino/。 我将jar文件添加到我的eclipse项目中,并从这里运行示例(http://www.mozilla.org/rhino/examples.html),但无法弄清楚如何使用该页面的源代码中的函数。
function GeogToUTM(){
    //Convert Latitude and Longitude to UTM
    Declarations();
    k0 = 0.9996;//scale on central meridian
    b = a*(1-f);//polar axis.
    //alert(a+"   "+b);
    //alert(1-(b/a)*(b/a));
    e = Math.sqrt(1 - (b/a)*(b/a));//eccentricity
    //alert(e);
    //Input Geographic Coordinates
    //Decimal Degree Option
    latd0 = parseFloat(document.getElementById("DDLatBox0").value);
    lngd0 = parseFloat(document.getElementById("DDLonBox0").value);
    latd1 = Math.abs(parseFloat(document.getElementById("DLatBox0").value));
    latd1 = latd1 + parseFloat(document.getElementById("MLatBox0").value)/60;
    latd1 = latd1 + parseFloat(document.getElementById("SLatBox0").value)/3600;
    if (parseFloat(document.getElementById("DLatBox0").value)<0){latd1=-latd1;}
    lngd1 = Math.abs(parseFloat(document.getElementById("DLonBox0").value));
    lngd1 = lngd1 + parseFloat(document.getElementById("MLonBox0").value)/60;
    lngd1 = lngd1 + parseFloat(document.getElementById("SLonBox0").value)/3600;
    if (parseFloat(document.getElementById("DLonBox0").value)<0){lngd1=-lngd1;}

    lngd=lngd0;
    latd=latd0;
    if(isNaN(latd)){
    latd = latd1;
    document.getElementById("DDLatBox0").value = Math.floor(1000000*latd)/1000000;
    lngd=lngd1;
    document.getElementById("DDLonBox0").value = Math.floor(1000000*lngd)/1000000;
    }

    if(isNaN(lngd)){lngd = latd1;}
        if(isNaN(latd)|| isNaN(lngd)){
        alert("Non-Numeric Input Value");
        }
    if(latd <-90 || latd> 90){
        alert("Latitude must be between -90 and 90");
        }
    if(lngd <-180 || lngd > 180){
        alert("Latitude must be between -180 and 180");
        }

    xd = lngd;
    yd = latd;
    DDtoDMS();
    //Read Input from DMS Boxes
    document.getElementById("DLatBox0").value = Math.floor(ydd);
    document.getElementById("MLatBox0").value = ym;
    document.getElementById("SLatBox0").value = Math.floor(1000*ys)/1000;
    document.getElementById("DLonBox0").value = Math.floor(xdd);
    document.getElementById("MLonBox0").value = xm;
    document.getElementById("SLonBox0").value = Math.floor(1000*xs)/1000;


    phi = latd*drad;//Convert latitude to radians
    lng = lngd*drad;//Convert longitude to radians
    utmz = 1 + Math.floor((lngd+180)/6);//calculate utm zone
    latz = 0;//Latitude zone: A-B S of -80, C-W -80 to +72, X 72-84, Y,Z N of 84
    if (latd > -80 && latd < 72){latz = Math.floor((latd + 80)/8)+2;}
    if (latd > 72 && latd < 84){latz = 21;}
    if (latd > 84){latz = 23;}

    zcm = 3 + 6*(utmz-1) - 180;//Central meridian of zone
    //alert(utmz + "   " + zcm);
    //Calculate Intermediate Terms
    e0 = e/Math.sqrt(1 - e*e);//Called e prime in reference
    esq = (1 - (b/a)*(b/a));//e squared for use in expansions
    e0sq = e*e/(1-e*e);// e0 squared - always even powers
    //alert(esq+"   "+e0sq)
    N = a/Math.sqrt(1-Math.pow(e*Math.sin(phi),2));
    //alert(1-Math.pow(e*Math.sin(phi),2));
    //alert("N=  "+N);
    T = Math.pow(Math.tan(phi),2);
    //alert("T=  "+T);
    C = e0sq*Math.pow(Math.cos(phi),2);
    //alert("C=  "+C);
    A = (lngd-zcm)*drad*Math.cos(phi);
    //alert("A=  "+A);
    //Calculate M
    M = phi*(1 - esq*(1/4 + esq*(3/64 + 5*esq/256)));
    M = M - Math.sin(2*phi)*(esq*(3/8 + esq*(3/32 + 45*esq/1024)));
    M = M + Math.sin(4*phi)*(esq*esq*(15/256 + esq*45/1024));
    M = M - Math.sin(6*phi)*(esq*esq*esq*(35/3072));
    M = M*a;//Arc length along standard meridian
    //alert(a*(1 - esq*(1/4 + esq*(3/64 + 5*esq/256))));
    //alert(a*(esq*(3/8 + esq*(3/32 + 45*esq/1024))));
    //alert(a*(esq*esq*(15/256 + esq*45/1024)));
    //alert(a*esq*esq*esq*(35/3072));
    //alert(M);
    M0 = 0;//M0 is M for some origin latitude other than zero. Not needed for standard UTM
    //alert("M    ="+M);
    //Calculate UTM Values
    x = k0*N*A*(1 + A*A*((1-T+C)/6 + A*A*(5 - 18*T + T*T + 72*C -58*e0sq)/120));//Easting relative to CM
    x=x+500000;//Easting standard 
    y = k0*(M - M0 + N*Math.tan(phi)*(A*A*(1/2 + A*A*((5 - T + 9*C + 4*C*C)/24 + A*A*(61 - 58*T + T*T + 600*C - 330*e0sq)/720))));//Northing from equator
    yg = y + 10000000;//yg = y global, from S. Pole
    if (y < 0){y = 10000000+y;}
    //Output into UTM Boxes
    document.getElementById("UTMzBox1").value = utmz;
    document.getElementById("UTMeBox1").value = Math.round(10*(x))/10;
    document.getElementById("UTMnBox1").value = Math.round(10*y)/10;
    if (phi<0){document.getElementById("SHemBox").checked=true;}
    //document.getElementById("UTMzBox1").value = utmz;
    //document.getElementById("UTMeBox1").value = Math.round(10*(500000+x))/10;
    document.getElementById("UTMLonZoneBox2").value = utmz;
    document.getElementById("UTMLatZoneBox2").value = DigraphLetrsE[latz];
    document.getElementById("UTMeBox2").value = Math.round(10*(x-100000*Math.floor(x/100000)))/10;
    document.getElementById("UTMnBox2").value = Math.round(10*(y-100000*Math.floor(y/100000)))/10;
//Generate Digraph
    MakeDigraph();
    document.getElementById("UTMDgBox2").value = Digraph;

}//close Geog to UTM
///////////////////////////////////////////////////////////////////////

我知道我不能直接使用这个函数,因为它嵌入在HTML中。但是我从未接触过JavaScript,所以如果需要对代码进行最小更改,那么对我来说会更容易。

2个回答

1

第二个链接已经离线。 - Davide Pastore

1

你需要先询问是否可以使用他的作品,但他通常很乐意给予使用许可。

所有对document.getElementById的调用都是针对html页面上的输入。因此,您将不得不重写函数,以便将这些变量传递给它 - 因为在运行时您将无法访问javascript dom。

您还需要确定您想要返回什么,看起来它显示了几个字段的计算值,因此您可能需要返回一个字段名称到计算值的映射 - 然后您就可以在java程序中使用结果。

您发布的脚本还涉及到缺失的这些函数,因此您还需要找到它们并将它们包含在您的脚本中:
MakeDigraph(); DDtoDMS(); Declarations();

我建议您删除代码验证部分的警报,并在您的java代码中处理它。

这不会非常高效,但如果这不重要,那么祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接