ホームページ  >  記事  >  Java  >  Java はどのようにして Javascript および Python アルゴリズムを呼び出しますか?

Java はどのようにして Javascript および Python アルゴリズムを呼び出しますか?

little bottle
little bottle転載
2019-04-28 14:15:103090ブラウズ

この記事では主に Java を使用して Javascript および Python アルゴリズムを呼び出す方法について説明します。これには一定の参考価値があります。興味のある友人はそれについて学ぶことができます。

最近のプロジェクトでは、JavaScript または Python でアルゴリズムをサービスとして公開する必要があることが多く、Tomcat サービスを公開するには、これらのアルゴリズムを Java で呼び出す必要があるため、言語をまたいでアルゴリズムを呼び出すことが避けられません。 Javascript ファイルを呼び出す場合でも、Python スクリプトを呼び出す場合でも、Java でパラメータを渡してアルゴリズムの演算結果を取得できるように、元のアルゴリズム ファイルに適切な変更を加える必要があります。

1. Java は Javascript を呼び出します

JavaScript は型指定が弱い言語であることに注意してください。変数を定義するには var が 1 つだけ必要です。ただし、Java では、次の点に注意する必要があります。変数タイプと異なる入力パラメータは異なるタイプになります。

js ファイルを呼び出すときは、それを調整し、呼び出す必要がある関数と関連パラメーターを設定する必要があります。使用される 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;
}

In 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 関数内にある必要があります。このクラスの main メソッドを呼び出し、実行パラメータを渡して結果を取得します。

2. Java が Python を呼び出す

Java が Python スクリプトを呼び出す方法はいくつかあります。最も簡単なのは、Jython を通じて Python コードを直接実行することですが、この方法は参照される 3 番目のコードをサポートしません。 Python ではサードパーティのライブラリなので、ランタイムを使用してメソッドを呼び出しましたが、これはコンソールでスクリプトを実行するのと同じです。

Java が Python を呼び出す場合、return ステートメントを通じて戻り値を取得することはできませんが、結果は print を通じて標準出力ストリームに書き込まれ、その後標準入力ストリームを通じて読み取られるだけであることに注意してください。 Java では、戻り結果を取得します。

特定の環境で参照する必要があるサードパーティのライブラリをインストールするなど、Python 環境に要件がある場合は、Java プロジェクトに実行環境を追加し、[実行] > [実行] をクリックする必要もあります。 Eclipse > 環境で構成を実行し、パスを追加して、値を 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 での各出力結果1 つの in.readLine() に対応するため、必要に応じて必要な結果を取得できます。

Tomcat を使用して Python をサービスとして呼び出すプログラムを公開する必要がある場合は、Tomcat の動作環境を構成する必要があり、パスを追加して Python のインストール パスに割り当てる必要もあります。

関連チュートリアル: Java ビデオ チュートリアル

以上がJava はどのようにして Javascript および Python アルゴリズムを呼び出しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。