我正在开发GPS应用程序,我想根据WGS84数据将我的纬度和经度转换为x-y坐标。我发现这个js页面是这样做的:http://www.uwgb.edu/dutchs/usefuldata/ConvertUTMNoOZ.HTM。我也看过其他计算器,但这个更准确。现在,如果您看到源,则提供执行转换的功能。我用Google搜索了如何在Java中使用js代码,并发现可以使用此库来执行此操作:http://www.mozilla.org/rhino/。我在我的eclipse项目中添加了jar并从这里运行了示例(http://www.mozilla.org/rhino/examples.html)但是我无法弄清楚如何使用该页面源代码中的函数。 / p>
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上工作,所以如果我需要对代码进行最小的更改,对我来说会更容易。
答案 0 :(得分:1)
如果您只是想运行JavaScript而且您并不特别关心使用Rhino而不是更通用的Java Scripting API,请参阅我写的以下博文:
http://springinpractice.com/2012/05/13/how-to-run-javascript-from-java/
如果实际上你出于某种原因需要实际的Rhino代码,这里有一些使用Rhino的示例代码:
答案 1 :(得分:1)
你将不得不问你是否可以先使用它 - 但他说他很乐意让人们使用他的作品。
对document.getElementById的所有调用都引用了html页面上的输入。 您必须重写该函数,以便将这些变量传递给它 - 因为您在运行时无法访问javascript dom。
你必须弄清楚你想要它返回什么,看起来它显示几个字段的计算值,所以你可能不得不将字段名的地图返回到计算值 - 然后你将是在java程序中使用结果。
您发布的脚本也指缺少这些功能,因此您也必须找到它们,并将它们包含在您的脚本中:
MakeDigraph();
DDtoDMS();
声明();
我建议您使用警报删除代码的验证位,只需处理这是您的java代码
这不会很有效但是如果那不重要那么祝你好运!