J2EE(java)后台調用ArcGIS Engine(AE)的部署和代碼


arcgis的BS開發解決方案一直是個坑,主推的地圖服務查詢速度慢,需要異步,功能少。相對來說主要用於CS的AE功能更強大全面,只是部署有點復雜

 

本文軟件環境:

win7 sp1 64位

MyEclipse 10,jdk 1.6.45 32位,tomcat 6.0.41 32位,ArcGIS Desktop 10.0(或ArcGIS Engine)

 


 

1.1.1.   安裝軟件

ArcGIS Desktop或ArcGIS Engine Runtime

建議裝desktop,因為AE Runtime安裝文件不容易找,另外desktop功能也強大些,本文也以Desktop為例

1.1.2.   arcobjects.jar

arcobjects.jar是ao的jar包,要把此文件放在我們代碼的lib文件夾里

1.1.2.1.      arcobjects.jar的提取說明:

arcobjects.jar是ao的jar包,這個jar包在desktop和engine runtime都有提供(可是ao sdk沒有)

在我們的系統中,用desktop提供的,這個jar包在desktop安裝目錄的java\lib下,例如我的是D:\Program Files (x86)\ArcGIS\Desktop10.0\java\lib

 

 


 

1.1.3.   VM Arguments配置

1.1.3.1.      開發環境Eclipse配置

此配置在開發調試時有效

 

打開window>preferences

 

在輸入arcgis desktop的bin路徑:

-Djava.library.path="D:\Program Files (x86)\ArcGIS\Desktop10.0\Bin"

此路徑每台機可能不同


 

1.1.3.2.      運行環境Tomcat配置

此配置在雙擊運行startup.bat啟動tomcat時有效

 

打開tomcat\bin的catalina.bat,在

set "CURRENT_DIR=%cd%"

的下方插入一行

 

arcgis desktop的bin路徑:

-Djava.library.path="D:\Program Files (x86)\ArcGIS\Desktop10.0\Bin"

此路徑每台機可能不同


 

hello world

以下是一段簡單的代碼,連接SDE並對圖層查詢,跟C#調AE沒太大區別,這里關鍵的是類AoInitUtil

以下是類AoInitUtil的initializeEngine函數

其中第11行的函數的兩個參數是配置當前程序的環境,也就是說在團隊里可以裝不同的arcgis版本(但相信僅限於10.x)

 1     public AoInitialize initializeEngine(AoInitialize aoInit) {        
 2         try {
 3             EngineInitializer.initializeEngine();
 4 
 5             // 設置使用的arcgis產品和版本,使ao能運行在不同的arcgis環境下
 6             // 下面這行代碼會報錯,可是VersionManager又要在AoInitialize實例化前運行,而且這個錯不影響代碼運行,所以暫時不管
 7             VersionManager versionManager = new VersionManager();
 8             // 第一個參數是arcgis產品編號:1=desktop,2=engine,5=server
 9             // 此參數可以通過枚舉查看esriProductCode
10             // versionManager.loadVersion(1, "10.0");
11             versionManager.loadVersion(Integer.parseInt(ConfigProperties
12                     .getByKey("aoRuntimeProduct")), ConfigProperties
13                     .getByKey("aoRuntimeVersion"));
14 
15             aoInit = new AoInitialize();
16             // 下面雖然有Engine和ArcInfo兩種產品,但在本系統只有Engine才能用,ArcInfo會出錯
17             if (aoInit
18                     .isProductCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeEngine) == esriLicenseStatus.esriLicenseAvailable)
19                 aoInit.initialize(esriLicenseProductCode.esriLicenseProductCodeEngine);
20             else if (aoInit
21                     .isProductCodeAvailable(com.esri.arcgis.system.esriLicenseProductCode.esriLicenseProductCodeArcInfo) == com.esri.arcgis.system.esriLicenseStatus.esriLicenseAvailable)
22                 aoInit.initialize(com.esri.arcgis.system.esriLicenseProductCode.esriLicenseProductCodeArcInfo);
23 
24             return aoInit;
25         } catch (Exception e) {
26             e.printStackTrace();
27             return aoInit;
28         }
29     }

 

后話:

PS:無論是java還是.net版本AE,其jar或dll只是個中介,AE的核心AO是COM,出了問題可以往COM方面去想

PS2:不知道是java還是BS的原因,比我們C#+winform上用AE要不穩定很多


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM