




已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
ArcGIS Server如何動態(tài)添加圖層并進行查詢作者:未知 文章來源:ESRI中國(北京)有限公司 點擊數:6952 更新時間:2008-9-18軟件:ArcGIS Server for Java platform版本:9.2平臺:Solaris 9.0, 10; Linux Red Hat AS/ES 3.0, AS/ES 4.0; Linux-SUSE Server 9在ArcGIS Server 9.2的應用程序中,如果使用的資源類型是com.esri.adf.web.ags.data.AGSLocalMapResource,就可以在該資源上動態(tài)添加新的圖層,圖層數據可以來自不同的地方,比如本地的shapefile、file geodatabase或者SDE,也可以來自WMS等web服務。本文以本地的file geodatabase為例,為AGSLocalMapResource動態(tài)添加一個新的圖層。首先,要得到地圖的IMap接口才能對地圖的圖層進行操作。清單1. 獲取IMap接口1. AGSLocalMapResource res = (AGSLocalMapResource)webContext .getResources().get(ags0);2. com.esri.arcgis.carto.MapServer mapServer = res.getLocalMapServer();3. try 4. IMap map = mapServer.getMap(mapServer.getDefaultMapName();5. map.addLayer(ILayer layer); 6. catch(Exception e)7. 動態(tài)添加圖層的核心代碼就是第5行,它接收的參數是實現了ILayer接口的對象。因此,接下來我們需要把file geodatabase里的feature class組裝成一個ILayer對象。清單2. 從Feature Class到ILayer1. IServerContext sctx = res.getServerContext();2. IWorkspaceFactory pWorkspaceFactory = (IWorkspaceFactory) sctx .createObject(FileGDBWorkspaceFactory.getClsid();3. IFeatureWorkspace pFWS = (IFeatureWorkspace) pWorkspaceFactory .openFromFile(E:dataqixiangqixiang.gdb, 0);4. IFeatureClass fc = pFWS.openFeatureClass(Road);5. IFeatureLayer fLayer = (IFeatureLayer) sctx .createObject(FeatureLayer.getClsid(); 6. fLayer.setFeatureClassByRef(fc);7. fLayer.setName(Road); Server中的AO對象,必須在一個IServerContext上下文中使用,因此,AO對象的創(chuàng)建跟一般的Java類有所不同。因為數據是保存在filegeodatabase,所以在第2行代碼中我們創(chuàng)建了一個FileGDBWorkspaceFactory,接下來的兩行利用這個工廠類打開了一個IFeatureWorkspace,然后讀取了其中的一個feature class。最后,用這個feature class設置了一個IFeatureLayer(ILayer的一個子類)。有了IMap和IFeatureLayer對象以后,其實就已經能動態(tài)添加圖層了。但是這樣添加的圖層有一點欠缺的地方它的渲染方式是隨機的。就像我們用ArcMap直接打開一個polygon feature class時,ArcMap會隨機選擇一個填充色。為了保證每次用戶添加圖層以后能夠看到同樣的效果,我們需要為動態(tài)圖層設置一個渲染方式。當然,我們可以在程序中為不同類型的要素分別設置一個Renderer,但是本文將探討另一種方式。先用ArcMap設置好渲染方式,然后保存成一個*.lyr文件,動態(tài)添加圖層的時候從lyr文件中讀取Renderer信息,然后添加到IFeatureLayer。畢竟,用ArcMap設置Renderer比寫代碼要簡單多了!而且,也更易于分發(fā)。清單3. 從*.lyr文件中讀取Renderer信息1. IMapDocument doc = (IMapDocument)sctx.createObject(MapDocument.getClsid();2. doc.open(lyrFilePath, null);3. ILayer lyr = doc.getLayer(0, 0);/get the first maps first layer4. IFeatureRenderer renderer = null;5. if(lyr instanceof IGeoFeatureLayer)6. IGeoFeatureLayer geoLyr = (IGeoFeatureLayer)lyr;7. renderer = geoLyr.getRenderer();8. 在清單3中我們創(chuàng)建了一個MapDocument對象來讀取lyr文件(API說明:The MapDocument CoClass encapsulates map document files (*.mxd, *mxt, *.pmf) and layer files (*.lyr))。第2行代碼中的lyrFilePath就是lyr文件存放的路徑。由于打開的是lyr文件,只有一個圖層,所以第3行代碼的兩個參數都為零,表示打開的是第一個地圖的第一個圖層。接下來從圖層文件中讀取Renderer信息。接下來,我們就可以把Renderer信息賦給圖層,然后將圖層添加到地圖上。清單4. 設置渲染方式,添加圖層1. if(renderer != null)2. IGeoFeatureLayer geoFeatureLyr = (IGeoFeatureLayer)fLayer;3. geoFeatureLyr.setRendererByRef(renderer);4. 5. fLayer.setVisible(true);6. map.addLayer(fLayer);7. map.moveLayer(fLayer, 1); 至此,我們通過map service提供的AO接口完成了動態(tài)添加圖層的工作,但是如果這時候我們去刷新瀏覽器,并不會看到新增加的圖層!這是由于Web ADF層還不知道圖層信息發(fā)生變化了。這與Web ADF的初始化有關,當一個session啟動的時候,WebContext會根據map service的信息完成初始化,包括一些列的functionalities以及attributes,這些初始化信息中就包含圖層信息(保存在com.esri.arcgisws.MapDescription和com.esri.arcgisws.MapLayerInfo等類中)。在WebContext初始化完成以后,如果map service的信息發(fā)生改變,必須由程序員自己去刷新Web ADF中的相關對象,實現Web ADF對象與map service同步。有趣的是,并不是所有對map service的修改都要自己去通知Web ADF,比如修改圖層的Renderer信息就不需要。我覺得如果com.esri.arcgisws包中的與AO同名的對象,很可能就需要手工修改,因為這些對象都是初始化的時候創(chuàng)建的;如果沒有,說明沒有必要為其單獨創(chuàng)建Web ADF對象,需要的時候就直接訪問AO接口了。清單5. 刷新ADF對象1. mapServer.refreshServerObjects(); 2. IMapServerInfo serverInfo = mapServer.getServerInfo(mapServer.getDefaultMapName(); 3. agsServerInfo = (com.esri.arcgisws.MapServerInfo)AGSUtil.createStubFromArcObject(serverInfo,com.esri.arcgisws.MapServerInfo.class,sctx); 4. com.esri.arcgisws.MapServerInfo si = mapFun.getMapServerInfo();5. si.setMapLayerInfos(agsServerInfo.getMapLayerInfos();6. mapFun.setMapDescription(agsServerInfo.getDefaultMapDescription(); 在清單5中,我們先刷新了map server object,然后獲取了新的IMapServerInfo對象。第3行代碼中我們完成了從AO對象到ADF對象的轉換,這樣,ADF就有了一個反映當前map service狀態(tài)的com.esri.arcgisws.MapServerInfo。4到6行代碼用新的com.esri.arcgisws.MapServerInfo刷新了AGSMapFunctionality,從而完成了ADF與map service的同步。下面的截圖顯示了動態(tài)添加圖層的效果。 由于WebContext以及它管理的一系列ADF資源只在session開始時進行一次初始化,因此動態(tài)添加的圖層就無法用WebQuery來進行查詢和高亮顯示。在清單5中已經介紹了如何刷新ADF端的對象,因此,我們可以用更新以后的com.esri.arcgisws.MapServerPort對動態(tài)添加的圖層進行查詢。接下來的例子中,讓用戶在地圖上拖一個矩形框,然后查詢所有圖層中與該矩形框相交的要素,并將它們高亮顯示。首先需要將用戶在地圖上繪制的矩形框傳遞到服務器端,并創(chuàng)建一個com.esri.arcgisws.PolygonN對象。清單6. 捕獲屏幕操作并構造服務器端幾何要素 1. WebExtent ext = (WebExtent)event.getWebGeometry().toMapGeometry(webContext.getWebMap();2. EnvelopeN env = (EnvelopeN)AGSUtil.toAGSGeometry(ext); 接下來可以根據該PolygonN新建一個com.esri.arcgisws.SpatialFilter對象。清單7. 創(chuàng)建SpatailFilter對象1. SpatialFilter spatialFilter = new SpatialFilter();2. spatialFilter.setSpatialRel(EsriSpatialRelEnum.esriSpatialRelIntersects);3. spatialFilter.setWhereClause();4. spatialFilter.setSearchOrder(EsriSearchOrder.esriSearchOrderSpatial);5. spatialFilter.setSpatialRelDescription();6. spatialFilter.setGeometryFieldName();7. spatialFilter.setFilterGeometry(env); com.esri.arcgisws.MapServerPort的queryFeatureData()方法只能對某一個圖層進行查詢,所以,如果要查詢所有的圖層,需要對所有圖層做一次循環(huán)。清單8. 空間查詢1. AGSMapFunctionality mapFunc = (AGSMapFunctionality)res.getFunctionality(map);2. int layerCount = mapFunc.getLayerDescriptions().length;3. MapServerPort svrPort = res.getMapServer();4. try5. for(int i=0;ilayerCount;i+)6. RecordSet rs = svrPort.queryFeatureData(“”,i, spatialFilter);7. 8. catch(Exception e)9. 第8行代碼對每一個圖層都做了一次空間查詢,將查詢結果保存在com.esri.arcgisws.RecordSet中。查詢結果中包含了圖層要素的所有信息,包括屬性信息和空間信息,可以根據需要進行提取。這個例子中需要對查詢結果做高亮顯示,所以接下來我們關心的焦點就是獲取查詢結果的空間信息。清單9. 高亮顯示查詢結果1. Recor
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 蒼梧縣中等專業(yè)學校招聘真題
- 中醫(yī)治療異位性皮炎的研究進展及發(fā)展趨勢
- 2024年北京市密云區(qū)教育委員會事業(yè)單位選調筆試真題
- 眼病與甲狀腺功能關聯-洞察及研究
- 多源互補優(yōu)化策略-洞察及研究
- 氫能數字化應用-洞察及研究
- 2025年河南省南陽市臥龍區(qū)七下英語期中學業(yè)質量監(jiān)測模擬試題含答案
- 15.1.2 二次根式 導學案
- 江蘇省海門市東洲國際2025屆八下英語期末達標檢測試題含答案
- 醫(yī)院投訴登記1
- 環(huán)境友好型飛機內飾-深度研究
- 《crrt低血壓的處理》課件
- GB/T 23694-2024風險管理術語
- 2025年中國郵政集團山西省分公司招聘筆試參考題庫含答案解析
- 馬詩聽評課記錄范文
- 遼寧省撫順市撫順縣2024-2025學年七年級上學期期末地理試卷(含答案)
- 國家開放大學法律事務??啤睹穹▽W(2)》期末紙質考試總題庫2025春期考試版
- 大學生應急救護知到智慧樹章節(jié)測試課后答案2024年秋西安歐亞學院
- 2024年瑜伽館瑜伽課程收費標準及退費規(guī)則合同3篇
- 互聯網營銷師技能競賽理論考試題庫及答案(濃縮300題)
- 土木工程力學(本)-001-國開機考復習資料
評論
0/150
提交評論