91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java如何調用Javascript、Python算法

發布時間:2020-09-29 16:21:59 來源:億速云 閱讀:274 作者:小新 欄目:編程語言

這篇文章主要介紹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如何調用Javascript、Python算法的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武功县| 山阳县| 翁源县| 台东县| 内丘县| 日土县| 永川市| 广饶县| 金塔县| 武城县| 贵定县| 武安市| 安远县| 呼和浩特市| 神木县| 布尔津县| 五河县| 柳州市| 梁河县| 杨浦区| 白朗县| 彝良县| 盐边县| 崇义县| 牡丹江市| 蛟河市| 马边| 措美县| 吉安市| 浮山县| 特克斯县| 邻水| 锦州市| 中江县| 阿鲁科尔沁旗| 葫芦岛市| 体育| 南漳县| 崇信县| 株洲县| 彰化市|