一、整體流程。
1. Web界面
|
//
2. Extjs
|
//
3. Java method call (with parameter object)
|
//
4. JNI call 自己寫的map2dll.dll,這個dll調用TopMap的控件並傳入數據,生成一個等值線圖的文件。
|
//
5. 使用ArcGIS 按照一個新圖層的方式,導入這個等值線圖。等值線圖和其他的圖層疊加在一起就生成了一個新的web界面
從1到2,使用了Extjs技術,它可以把界面提交的數據用javascript和Ajax技術封裝成類的形式發給服務器端。
從2到3,到我這裏就是一個抽象的Java函數調用
從3到4,使用JNI技術實現Java調用TopMap的控件,生成等值線,等值面的圖形。
從4到5,如何生成一個新的圖層,圖層有很多種:
我抽象了一個基本圖層:BaseLayer.java和四個子圖層:
DuplicateLayer.java 完全複製一個圖層,包括上面的點,線,面。
MemoryLayer.java 生成一個內存圖層,對內存圖層的操作很快。
ProxyLayer.java 生成一個代理圖層,對這個圖層的操作等價於對他所代理的圖層。
ShapeFileLayer.java 根據圖層文件生成一個圖層
UtilityLayer.java 工具類
DemoGeoProcessor.java是使用ArcGIS的功能進行數據分析,生成等值線。
編輯圖層,可以對圖層上面的線寬度,面的顏色進行修改。
二、ArcGIS的配置,ArcGIS可以配置成Pool 和非Pool模式。
-
如果是Pool模式,所有Web的用戶共享同一個圖層生成器。相互干擾(一個用戶添加的圖層,會反映到別的用戶上面)是無狀態的過程。 - 如果是Non-Pool模式,每個Web界面使用不同的圖層,相互不干擾。但是如果用戶太多,就會等待很長時間。
我們使用的是Pool模式,在用戶疊加圖層的時候,先清除別的用戶的圖層。只要別的用戶不刷新就不會有問題,縮放沒有關係。
try {
int count=targetMap.getLayerCount();
for (int i = 0; i < count; i++) {
ILayer layer=targetMap.getLayer(i);
if (layer.getName().equals(myFeatureLayer.getName()))
{
targetMap.deleteLayer(layer);
break;
}
}
targetMap.addLayer(myFeatureLayer);
targetMap.moveLayer(myFeatureLayer, 1);
//------------------------------------------
MapServer mapserver = localMapResource.getLocalMapServer();
mapserver.refreshServerObjects();
serverInfo = mapServerPort.getServerInfo(mapServer.getDefaultMapName());
mapFunct.getMapServerInfo().setDefaultMapDescription(serverInfo.getDefaultMapDescription());
mapFunct.setMapDescription(serverInfo.getDefaultMapDescription());
context.refresh();
} catch (AutomationException e) {
log.error("",e);
} catch (IOException e) {
log.error("",e);
}
對於後臺自動生成圖片的功能,可以在ArcGIS中生成另外一個地圖服務,使用該服務來生成圖片。不影響前天用戶的查詢。
三、ArcGIS的配置文件。
ArcGIS的配置嚮導,生成的配置文件在: WEB-INF 下的faces-config.xml,其中包括了地圖服務的IP地址和地圖服務的名稱。(也可以通過自己創建的Bean來控制)
WEB-INF 下的fc-hyperlink.xml,配置瞭如何在圖層上添加一個超級鏈接,把什麼樣的數據傳輸過去。
四、關於ArcGIS的標註
使用Web前臺可以製作標註,這樣不用刷新這個圖層。用戶點擊相應的地方,可以用Ajax技術把座標傳到服務器端,服務器端再通過Ajax把結果作爲DIV 或者iframe的方式展現在WEB頁面上。
五、因爲要在同一時間調用相同的TOPMap控件,所以寫了兩個DLL來做。其實不必這麼麻煩。
具體怎麼弄,我也給忘了。
六、生成圖片,使用ArcGIS功能。
圖片導出不復雜,ArcGIS支持的不錯。生成的圖像是在Web Server上。
export.setExportFileName(outPath);
IEnvelope pEnvelope = pView.getExtent();
//導出參數
export.setResolution(100);
tagRECT exportRect = new tagRECT();
exportRect.left = exportRect.top = 0;
exportRect.right = 594;
exportRect.bottom = 503;
IExport export = null;
七,ArcGIS 地圖服務器和Web Server的位置。
ArcGIS生成圖層的代碼都是Web服務器的,Web服務器向ArcGIS server發送soap調用,然後ArcGIS返回圖層Picture到web服務器。
如果是前臺標註,Web服務器來完成圖形繪製,標註也是由Web服務器自己畫的。