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要不穩定很多
