本篇文章主要講述的是用Java呼叫Javascript、Python演算法,具有一定的參考價值,有興趣的朋友可以了解一下。
最近專案中常需要將Javascript或Python中的演算法發佈為服務,而發佈Tomcat服務則需要在Java中呼叫這些演算法,因此就不免要進行跨語言呼叫演算法。不管是呼叫Javascript檔還是python腳本,都需要將原先的演算法檔進行適當的更改,以便可以在Java中傳入參數,並且得到演算法運算結果。
一、Java呼叫Javascript
要注意的是Javascript是弱型別語言,定義變數只需要一個var就可以搞定,但是在Java中卻要注意變數類型,不同的輸入參數會有不同的型別。
呼叫js檔案時,需要調整,設定好需要呼叫的function和相關參數,使用的js檔案程式碼如下(其中有些核心演算法不能展示):
function get3DCode(Latitude,Longitude,Height,level){ var latcode=[];var lngcode=[]; latcode=GeoSOTCode1D(Latitude,level); lngcode=GeoSOTCode1D(Longitude,level); var heicode=[];var geosot3Dcode=[]; heicode=Altcode(Height,level); geosot3Dcode=GeoSOT3D(latcode,lngcode, heicode,level);//三维网格编码 var d3code=[]; d3code=getQuantcodeString(geosot3Dcode); return d3code; }
在Java中使用對應的介面就可以調用,需要設定js檔案路徑和輸入參數,調用的程式碼如下;
package whu.get.three.beidou; import java.io.FileReader; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; /** * Java调用并执行js文件,传递参数,并获得返回值 */ public class ThreeD_GetBeidouCode { //获取经纬度及高度,返回三维码 public static String main(String Latitude,String Longitude,String Height,int CodeSize) throws Exception { //获取经纬度及高度,保存为double类型 Double latitude = Double.parseDouble(Latitude); Double longitude = Double.parseDouble(Longitude); Double height = Double.parseDouble(Height); int level = CodeSize; //调用js文件 ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("javascript"); String jsFileName = System.getProperty("catalina.home") + "/webapps/3DBeiDouCode/WEB-INF/classes/3Dcode.js"; // 读取js文件 FileReader reader = new FileReader(jsFileName); // 执行指定脚本 engine.eval(reader); String c = ""; if(engine instanceof Invocable) { Invocable invoke = (Invocable)engine; // 调用merge方法,并传入两个参数 c = String.valueOf(invoke.invokeFunction("get3DCode", latitude, longitude, height, level)); } reader.close(); return c; //返回三维码 } }
這裡的ThreeD_GetBeidouCode類別只是一個普通的類,需要在其他可運行的主函數中呼叫這個類別的main方法,傳入運行參數就可以得到結果。
二、Java呼叫Python
Java呼叫python腳本有好幾種方法,最簡單的是透過Jython來直接執行python程式碼,但是這種方法不支援python中引用的第三方庫,因此我使用了Runtime來呼叫的方法,這也相當於在控制台執行腳本。
要注意的是,Java呼叫python時,不能透過return語句來取得回傳值,而只能透過print將結果寫入標準輸出流中,然後在Java中透過標準輸入流來讀取到回傳結果。
如果對python環境有要求,例如在特定的環境中安裝了需要引用的第三方庫,則還要在Java工程中添加運行環境,在eclipse中點擊Run->Run Configurations- >environment,新增Path,值設定為python安裝的路徑。
在python程式中做適當修改:新增引用import sys,將呼叫的函式參數設定為sys.argv[1],sys.argv[2]...注意必須是從1開始計數,將需要傳回的結果以print函數列印。
本例中python程式碼如下:
# -*- coding:utf-8 -*- import BaseFunction import numpy as np import itertools import math import sys #计算中心要素 def cal_central_feature(path,x,y): sf = BaseFunction.open_shpfile(path) x_records = BaseFunction.get_attr_records(sf,x) y_records = BaseFunction.get_attr_records(sf,y) dis = [] for x0,y0 in zip(x_records,y_records): distance = 0 for x1,y1 in zip(x_records,y_records): distance = distance + get_distance(x0,y0,x1,y1) dis.append(distance) i = dis.index(np.min(dis)) result = [x_records[i],y_records[i]] return result #计算两点之间的距离 def get_distance(x0,y0,x1,y1): xd = x1 - x0 yd = y1 - y0 distance = math.sqrt(xd**2+yd**2) return distance if __name__ == '__main__': result = cal_central_feature(sys.argv[1],sys.argv[2],sys.argv[3]) print(result[0]) print(result[1])
Java中呼叫的程式碼如下:
package whu.get.three.beidou; import java.io.BufferedReader; import java.io.InputStreamReader; /** * Java调用并执行js文件,传递参数,并活动返回值 */ public class CalCentralFeatureClass { //输入shp路径,获取坐标 public static String main(String filepath) { String pyPath = System.getProperty("catalina.home") + "/webapps/CalCentralFeature/WEB-INF/classes/CalCentralFeature.py"; //python文件路径 String[] args = new String[] { "python", pyPath, filepath, "x","y"}; String c = ""; //记录返回值 try { Process proc = Runtime.getRuntime().exec(args); //执行py文件 BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream())); String line = null; while ((line = in.readLine()) != null) { c = c+line+' '; } in.close(); proc.waitFor(); } catch (Exception e) { e.printStackTrace(); } return c; //返回结果 } }
得到的運算結果中,每一個python中print的結果,對應一個in.readLine(),可以按照需要取得自己想要的結果。
如果需要將呼叫python的程式用tomcat發佈為服務,也需要配置tomcat的運作環境,同樣是新增一個Path,賦值為python安裝路徑。
相關教學:Java影片教學
以上是Java怎麼呼叫Javascript、Python演算法的詳細內容。更多資訊請關注PHP中文網其他相關文章!