




已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
ArcGIS Server如何動(dòng)態(tài)添加圖層并進(jìn)行查詢作者:未知 文章來(lái)源:ESRI中國(guó)(北京)有限公司 點(diǎn)擊數(shù):6952 更新時(shí)間:2008-9-18軟件:ArcGIS Server for Java platform版本:9.2平臺(tái):Solaris 9.0, 10; Linux Red Hat AS/ES 3.0, AS/ES 4.0; Linux-SUSE Server 9在ArcGIS Server 9.2的應(yīng)用程序中,如果使用的資源類型是com.esri.adf.web.ags.data.AGSLocalMapResource,就可以在該資源上動(dòng)態(tài)添加新的圖層,圖層數(shù)據(jù)可以來(lái)自不同的地方,比如本地的shapefile、file geodatabase或者SDE,也可以來(lái)自WMS等web服務(wù)。本文以本地的file geodatabase為例,為AGSLocalMapResource動(dòng)態(tài)添加一個(gè)新的圖層。首先,要得到地圖的IMap接口才能對(duì)地圖的圖層進(jìn)行操作。清單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. 動(dòng)態(tài)添加圖層的核心代碼就是第5行,它接收的參數(shù)是實(shí)現(xiàn)了ILayer接口的對(duì)象。因此,接下來(lái)我們需要把file geodatabase里的feature class組裝成一個(gè)ILayer對(duì)象。清單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對(duì)象,必須在一個(gè)IServerContext上下文中使用,因此,AO對(duì)象的創(chuàng)建跟一般的Java類有所不同。因?yàn)閿?shù)據(jù)是保存在filegeodatabase,所以在第2行代碼中我們創(chuàng)建了一個(gè)FileGDBWorkspaceFactory,接下來(lái)的兩行利用這個(gè)工廠類打開了一個(gè)IFeatureWorkspace,然后讀取了其中的一個(gè)feature class。最后,用這個(gè)feature class設(shè)置了一個(gè)IFeatureLayer(ILayer的一個(gè)子類)。有了IMap和IFeatureLayer對(duì)象以后,其實(shí)就已經(jīng)能動(dòng)態(tài)添加圖層了。但是這樣添加的圖層有一點(diǎn)欠缺的地方它的渲染方式是隨機(jī)的。就像我們用ArcMap直接打開一個(gè)polygon feature class時(shí),ArcMap會(huì)隨機(jī)選擇一個(gè)填充色。為了保證每次用戶添加圖層以后能夠看到同樣的效果,我們需要為動(dòng)態(tài)圖層設(shè)置一個(gè)渲染方式。當(dāng)然,我們可以在程序中為不同類型的要素分別設(shè)置一個(gè)Renderer,但是本文將探討另一種方式。先用ArcMap設(shè)置好渲染方式,然后保存成一個(gè)*.lyr文件,動(dòng)態(tài)添加圖層的時(shí)候從lyr文件中讀取Renderer信息,然后添加到IFeatureLayer。畢竟,用ArcMap設(shè)置Renderer比寫代碼要簡(jiǎn)單多了!而且,也更易于分發(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)建了一個(gè)MapDocument對(duì)象來(lái)讀取lyr文件(API說(shuō)明:The MapDocument CoClass encapsulates map document files (*.mxd, *mxt, *.pmf) and layer files (*.lyr))。第2行代碼中的lyrFilePath就是lyr文件存放的路徑。由于打開的是lyr文件,只有一個(gè)圖層,所以第3行代碼的兩個(gè)參數(shù)都為零,表示打開的是第一個(gè)地圖的第一個(gè)圖層。接下來(lái)從圖層文件中讀取Renderer信息。接下來(lái),我們就可以把Renderer信息賦給圖層,然后將圖層添加到地圖上。清單4. 設(shè)置渲染方式,添加圖層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接口完成了動(dòng)態(tài)添加圖層的工作,但是如果這時(shí)候我們?nèi)ニ⑿聻g覽器,并不會(huì)看到新增加的圖層!這是由于Web ADF層還不知道圖層信息發(fā)生變化了。這與Web ADF的初始化有關(guān),當(dāng)一個(gè)session啟動(dòng)的時(shí)候,WebContext會(huì)根據(jù)map service的信息完成初始化,包括一些列的functionalities以及attributes,這些初始化信息中就包含圖層信息(保存在com.esri.arcgisws.MapDescription和com.esri.arcgisws.MapLayerInfo等類中)。在WebContext初始化完成以后,如果map service的信息發(fā)生改變,必須由程序員自己去刷新Web ADF中的相關(guān)對(duì)象,實(shí)現(xiàn)Web ADF對(duì)象與map service同步。有趣的是,并不是所有對(duì)map service的修改都要自己去通知Web ADF,比如修改圖層的Renderer信息就不需要。我覺得如果com.esri.arcgisws包中的與AO同名的對(duì)象,很可能就需要手工修改,因?yàn)檫@些對(duì)象都是初始化的時(shí)候創(chuàng)建的;如果沒有,說(shuō)明沒有必要為其單獨(dú)創(chuàng)建Web ADF對(duì)象,需要的時(shí)候就直接訪問AO接口了。清單5. 刷新ADF對(duì)象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對(duì)象。第3行代碼中我們完成了從AO對(duì)象到ADF對(duì)象的轉(zhuǎn)換,這樣,ADF就有了一個(gè)反映當(dāng)前map service狀態(tài)的com.esri.arcgisws.MapServerInfo。4到6行代碼用新的com.esri.arcgisws.MapServerInfo刷新了AGSMapFunctionality,從而完成了ADF與map service的同步。下面的截圖顯示了動(dòng)態(tài)添加圖層的效果。 由于WebContext以及它管理的一系列ADF資源只在session開始時(shí)進(jìn)行一次初始化,因此動(dòng)態(tài)添加的圖層就無(wú)法用WebQuery來(lái)進(jìn)行查詢和高亮顯示。在清單5中已經(jīng)介紹了如何刷新ADF端的對(duì)象,因此,我們可以用更新以后的com.esri.arcgisws.MapServerPort對(duì)動(dòng)態(tài)添加的圖層進(jìn)行查詢。接下來(lái)的例子中,讓用戶在地圖上拖一個(gè)矩形框,然后查詢所有圖層中與該矩形框相交的要素,并將它們高亮顯示。首先需要將用戶在地圖上繪制的矩形框傳遞到服務(wù)器端,并創(chuàng)建一個(gè)com.esri.arcgisws.PolygonN對(duì)象。清單6. 捕獲屏幕操作并構(gòu)造服務(wù)器端幾何要素 1. WebExtent ext = (WebExtent)event.getWebGeometry().toMapGeometry(webContext.getWebMap();2. EnvelopeN env = (EnvelopeN)AGSUtil.toAGSGeometry(ext); 接下來(lái)可以根據(jù)該P(yáng)olygonN新建一個(gè)com.esri.arcgisws.SpatialFilter對(duì)象。清單7. 創(chuàng)建SpatailFilter對(duì)象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()方法只能對(duì)某一個(gè)圖層進(jìn)行查詢,所以,如果要查詢所有的圖層,需要對(duì)所有圖層做一次循環(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行代碼對(duì)每一個(gè)圖層都做了一次空間查詢,將查詢結(jié)果保存在com.esri.arcgisws.RecordSet中。查詢結(jié)果中包含了圖層要素的所有信息,包括屬性信息和空間信息,可以根據(jù)需要進(jìn)行提取。這個(gè)例子中需要對(duì)查詢結(jié)果做高亮顯示,所以接下來(lái)我們關(guān)心的焦點(diǎn)就是獲取查詢結(jié)果的空間信息。清單9. 高亮顯示查詢結(jié)果1. Recor
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 水系鋅離子電池鋅負(fù)極的晶面調(diào)控及界面優(yōu)化研究
- 基于SWAT模型的白蓮河流域非點(diǎn)源污染模擬與最管理措施研究
- 基于自注意力的實(shí)時(shí)點(diǎn)云序列語(yǔ)義分割方法研究
- 鐵合金冶煉用高強(qiáng)度蘭炭制備基礎(chǔ)研究
- 基于多目標(biāo)優(yōu)化的結(jié)腸鏡息肉跟蹤研究
- 2025年雅思閱讀專項(xiàng)模擬試卷:全球氣候變化與氣候變化適應(yīng)與減緩措施研究
- 2025年心理咨詢師實(shí)操技能考核試卷(中級(jí))
- 2025年小學(xué)教師資格考試《綜合素質(zhì)》教育活動(dòng)設(shè)計(jì)題沖刺訓(xùn)練與答案詳解試卷
- 雙聚合物基低居里點(diǎn)導(dǎo)電復(fù)合材料及電熱膜應(yīng)用研究
- 2025年農(nóng)業(yè)生物技術(shù)在種業(yè)中的分子標(biāo)記輔助選擇技術(shù)深度解析報(bào)告
- 醫(yī)院結(jié)核感染培訓(xùn)
- 大學(xué)生應(yīng)急救護(hù)知到智慧樹章節(jié)測(cè)試課后答案2024年秋西安歐亞學(xué)院
- 臨床心內(nèi)科主任競(jìng)聘稿
- 電動(dòng)工器具安全使用培訓(xùn)
- 防水工程專項(xiàng)施工方案
- 日本建設(shè)項(xiàng)目可視化、安全文明、工藝管理總結(jié)
- 【MOOC】思想道德與法治-南開大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 網(wǎng)絡(luò)管理與維護(hù)綜合實(shí)訓(xùn)課程
- 遼寧大學(xué)《材料力學(xué)》2021-2022學(xué)年第一學(xué)期期末試卷
- 新安全生產(chǎn)法圖文培訓(xùn)
- 2年級(jí)關(guān)聯(lián)詞專項(xiàng)練習(xí)題含答案
評(píng)論
0/150
提交評(píng)論