ArcObject SDK for Java調用自定義toolbox工具(包含出現錯誤可能的緣由)

DATE:2018-4-17java

開發環境:json

MyEclipse 2014, JDK 1.8 32位(64位環境沒法運行arcobject程序,只限工程引用的jdk)、ArcGIS 10.5app

ArcGIS 軟件安裝完成後,還要安裝 ArcObject SDK for Java,安裝以後,才能進行 AO 的二次開發編輯器

 

開發步驟:函數

一、新建 esri templates 示例工程工具

新建esri templates工程目的是爲了省去對 arcgis 許可初始化和加載 arcobjects.jar 的步驟,見下圖:spa

選擇上圖中的ArcObject Samples,在彈出的對話框中選擇geoprocessing示例,隨便新建一個工程便可;調試

二、修改生成代碼中 initializeArcGISLicenses 初始化許可函數體(此步驟要注意code

因爲每一個人機器上的安裝的ArcGIS 版本不一樣,獲取的許可也不相同,因此要初始化正確的許可orm

三、上代碼

public void produceFormattedJSONFileFromTiff() {
        LocalDateTime start = LocalDateTime.now();
        
        String projectRoot = new File("").getAbsolutePath();
        
        try {
            // Add the BestPath toolbox.
            gp.addToolbox(projectRoot + "/resource/customertoolbox/ZCustomer.tbx");
            // Generate the array of parameters.
            VarArray parameters = new VarArray();
            //輸入tif路徑
            parameters.add(projectRoot + "/resource/data/rain_2016.flt");
            //重採樣分類列表
            parameters.add("0 0.013435 1;"
                    + "0.013435 0.037422 2;0.037422 0.080247 3;"
                    + "0.080247 0.156709 4;0.156709 0.293223 5;"
                    + "0.293223 0.536956 6;0.536956 0.972118 7;"
                    + "0.972118 1.749056 8;1.749056 3.136204 9;"
                    + "3.136204 5.612822 10");
            //輸出json路徑
            parameters.add(projectRoot + "/resource/result/rain_2016.json");
            // Execute the model tool by name.
            IGeoProcessorResult result = gp.execute("ProduceJsonFromFltWithNoProject", parameters, null);
            while (result.getStatus() == esriJobStatus.esriJobSucceeded){
                
                System.out.println(result.getOutputCount());
                
                String resultJsonPath = (String) result.getReturnValue();
                System.out.println(resultJsonPath);
                
                //讀取json文件
                BufferedReader reader = new BufferedReader(new FileReader(new File(resultJsonPath)));
                StringBuffer sb = new StringBuffer();
                String line = reader.readLine();
                while(line != null) {
                    sb.append(line);
                    line = reader.readLine();
                }
                
                JSONObject jsonObject = JSONObject.parseObject(sb.toString());
                
                System.out.println(result.getMessageCount());
                break;
            }
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        LocalDateTime end = LocalDateTime.now();
        Duration duration = Duration.between(start, end);
        
        System.out.println("自定義gp運行耗時:" + duration.toMillis() + "毫秒");
        
    }

 

 尾註

 上文截取的代碼片斷中的 ZCustomer.tbx 是我在 ArcMap 的模型編輯器中生成的,各位親在引用上文代碼時,必定要注意改爲本身的toolbox,併爲本身的toolbox輸入正確的參數。

 

注意

在調用自定義 toolbox 時,必定注意 2 點: 一是toolbox 工具的名稱;二是 toolbox 工具的參數順序

 

2018-10-29更新:

近幾日又有了使用該方式完成相關功能的需求,故爾從新對該內容進行的梳理,在使用該方法調用 arcgis 自建模型時,出現了異常,現將可能產生異常的緣由記錄下,便於之後查閱。

異常截圖:

 

產生上圖異常的緣由可能有多種:

一、程序調用傳參不正確,包括參數個數或類型;

二、模型自己有問題

這個緣由須要建模型時,格外當心,有時候雖然模型能夠在arcgis 軟件運行,但 java 代碼調用卻不成功,很讓人費解

三、建模型的 arcgis 版本不一樣

意思是,建 arcgis toolbox的模型是在arcgis 10.2版本上整的,拿到了裝有 arcgis 10.1或 10.3版本的機器上運行,可能會出現上圖所示結果;

也有可能在不一樣機器上相同版本的arcgis建的模型,不在同一臺機器上運行,也可能出現問題,因此在程序調試期間,最好在同一臺機器上建模型和代碼調用,若是能調用成功,再考慮,將建的模型,在其餘機器上運行

四、傳入模型的參數問題

若是模型須要輸入文件,該文件必定不能被其餘程序所佔用,如 java 讀寫,不然也會現上圖所示錯誤

 

再次祝各們親玩的愉快

相關文章
相關標籤/搜索