2012-07-14 82 views
2

我正在開發GPS應用程序,我想根據WGS84基準將我的緯度和經度轉換爲x-y座標。我發現這個js頁面執行此操作:http://www.uwgb.edu/dutchs/usefuldata/ConvertUTMNoOZ.HTM。我也看了一下其他計算器,但這個更準確。現在,如果您看到源代碼,則正在提供執行轉換的功能。我googled我怎麼能在Java中使用js代碼,並發現這個庫可以用來做到這一點:http://www.mozilla.org/rhino/。我將jar添加到了我的eclipse項目中,並從此處運行示例(http://www.mozilla.org/rhino/examples.html),但無法弄清楚如何使用該頁面源代碼中的函數。如何使用Rhino庫在Java中使用JavaScript代碼?

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中。但是我從來沒有在js上工作過,所以如果我需要對代碼進行最小限度的更改,這對我來說會更容易。

回答

1

如果你只是想運行JavaScript和你不特別在意使用犀牛與更通用的Java腳本API,請參閱下面的博客文章我寫:

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

事實上,如果你想不管是什麼原因實際犀牛代碼,這是一個使用Rhino的一些示例代碼:

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

+0

第二個鏈接處於脫機狀態。 – 2013-08-17 12:01:09

+0

固定,謝謝Davide。 – 2013-08-17 23:24:40

1

你要問,如果你可以先使用它 - 但他說他是GE很樂意讓人們有權使用他的作品。

所有對document.getElementById的調用都是指html頁面上的輸入。 您必須重寫該函數,以便將這些變量傳遞給它 - 因爲在運行它時無法訪問javascript dom。

你必須找出你想要它返回的東西,它看起來像在幾個字段中顯示計算值,所以你可能必須返回一個字段名稱的映射到計算的值 - 然後你將在你的java程序中使用結果。

您發佈的腳本也引用了這些缺少的功能,因此您也必須找到它們,並將它們包含在您的腳本中:
MakeDigraph(); DDtoDMS(); 聲明();

我建議你刪除代碼的確認位與警報和公正處理,這是你的Java代碼

這不會是非常有效的,但如果不要緊那麼好運氣!

相關問題