简体   繁体   中英

How to use Rhino library to use javascript code in Java?

I am working on a GPS app and I want to convert my latitudes and longitudes into xy coordinates based on WGS84 datum. I found this js page to do this: http://www.uwgb.edu/dutchs/usefuldata/ConvertUTMNoOZ.HTM . I also had a look at other calculators but this one is more accurate. Now if you see the source, functions to perform conversion is being provided. I googled how can I use js code in Java and found out that this library can be used to do this: http://www.mozilla.org/rhino/ . I added jar to my eclipse project and ran examples from here (http://www.mozilla.org/rhino/examples.html) but an not able to figure out how can I use functions from the source code of that page.

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
///////////////////////////////////////////////////////////////////////

I know I can't use this function as is as it is embedded within HTML. But I have never worked on js so it would be easier for me if I am needed to do minimum changes to the code.

If you just want to run JavaScript and you don't particularly care about using Rhino versus the more generic Java Scripting API, please see the following blog post I wrote:

http://springinpractice.com/2012/05/13/how-to-run-javascript-from-java/

If in fact you want actual Rhino code for whatever reason, here's some sample code that uses Rhino:

https://github.com/springinpractice/sip09/blob/03/src/main/java/com/springinpractice/ch09/comment/service/impl/RichTextFilter.java

You will have to ask if you can use it first - but he says he's generally happy to give people permission to use his work.

All the calls to document.getElementById refer to inputs on the html page. You'll have to rewrite the function so that you pass these variables to it - as you won't have access to the javascript dom when you run it.

You'll have to work out what you want it to return too, it looks like it displays calculated values across a few fields so you'll probably have to return a map of the fieldname to the calculated value - then you will be to use the results in your java program.

The script you posted also refers to these functions that are missing, so you'll have to find them too, and include them in your script:
MakeDigraph(); DDtoDMS(); Declarations();

I'd recommend that you remove the validation bit of the code with the alerts and just handle this is your java code

It's not going to be very efficient but if that doesn't matter then good luck!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM