ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:187.25KB ,
资源ID:9614106      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9614106.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(ArcGIS Server Java ADF 案例教程.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

ArcGIS Server Java ADF 案例教程.docx

1、ArcGIS Server Java ADF 案例教程第一章 有关Web Service在 IDE的菜单中,你会看到有个很长的【ArcGIS Web Services Project】,别高兴,这不是给你自定义Web Service的,运行完向导你会发现生成的是一个Java桌面程序有着一如既往丑陋的界面和很不友好的GIS功能。原来我一直当它是废物,不过前段 时间它还真的帮了我大忙。我们有个测试需要测ArcGIS Server对Web Service的支持,要求必须抓取到浏览器与服务器交互的可读的SOAP消息;但是你要知道,考虑到效率ArcGIS Server内部都是用二进制的SOAP进行交互;

2、要抓到可读的SOAP消息,ArcGIS的Web Service包必须被部署到浏览器端最后,就是靠这个丑陋的“ArcGIS Web Services Project”,做了很多修改封装成了Applet才达到了这个要求。扯远了,说了这么多其实只为了说明这样一点:“ArcGIS Web Services Project”是一个使用ArcGIS的Web Service类库实现一些GIS功能的Java桌面程序,演示意义大于应用意义。下面我们首先来讨论一下如何使用SOAP SDK来访问ArcGIS Server原生的Web Service;然后再谈谈怎么自定义Web Service,以便其它业务系统调用或

3、出于其它目的的SOAP访问。一 通过SOAP SDK访问ArcGIS Web Service这 里我们通过一个简单的功能来演示如何使用SOAP SDK来访问ArcGIS Server,调用一个Map Service的功能。不管你是在Java桌面、Applet、ADF还是自定义的servlet中,如果你需要直接使用SOAP和ArcGIS交互,那 么下面的这段内容对你可能会有帮助。这个简单的功能是“计算当前范围内的要素个数“,这个功能是如此的简单以至于我觉得看一下代码就可以明白了:MapServerBindingStub mapserver = new MapServerBindingStub(u

4、rl);SpatialFilter filter =newSpatialFilter();filter.setFilterGeometry(mapDescription.getMapArea().getExtent();filter.setSpatialRel(EsriSpatialRelEnum.esriSpatialRelIntersects);filter.setGeometryFieldName(SHAPE);filter.setSubFields(*);filter.setSearchOrder(EsriSearchOrder.esriSearchOrderSpatial);filt

5、er.setWhereClause();filter.setSpatialReferenceFieldName();filter.setSpatialRelDescription();intcount = mapserver.queryFeatureCount(“Layers”, 0, (QueryFilter) filter);JOptionPane.showMessageDialog(this, Feature count = + count);上 面涉及到的各个ArcGIS的功能类都在com.esri.arcgisws包下,从命名上就可以看出这是专门为Web Service准备的。代码里

6、用到的url是地图服务的地址,比如“http:/host:8399/arcgis/services/name /MapServer“。在整个环节中你可能会对MapServerBindingStub的queryFeatureCount方法有一点兴趣,其实你 打开ArcGIS帮助里的SOAP SDK,找到Map Services下面的QueryFeatureCount方法就可以看到,QueryFeatureCount需要3个参数,分别对应 DataFrame名称、图层序号和QueryFilter,正与上面的代码相符。换句话说,com.esri.arcgisws包里的功能类就是 SOAP SDK的J

7、ava实现。可是,不管是ADF还是REST SDK都提供了比SOAP SDK好用多的调用ArcGIS Server功能的方法,所以想来你会和我一样,对上面的这些内容兴趣寥寥我觉得ESRI对SOAP SDK也是兴趣寥寥,以至于在SOAP SDK的文档里几乎都没有Java的示例代码。好了,让我们抛开ArcGIS提供的Web Service,来看看怎么自定义Web Service吧。我个人觉得自定义的Web Service是更加有用的,而且,功能也可以做得更强大。二两种方式自定义Web Service在IDE里创建一个Web Service工程是很容易的,只要找到【File】-【New】-【Web

8、Service】菜单就可以了,点击这个菜单将会弹出下面的对话框:这 里的Web service type有两种选择:一种是Bottom up、另外一种是Top down。这两种方式分别对应了自下而上和自上而下两种新建Web Service的模式。如果你已经有了实现的功能类,现在想要把它封装成Web Service,那么你应当选择Bottom up模式;如果你首先定义了Web Service的描述文件(wsdl),现在想要实现这个wsdl的功能,那么你应当选择Top down模式。三实现Web Service的功能不 管通过Bottom up还是Top down方式,当你把Web Service

9、的框架搭起来以后,剩下的工作就是如何去实现Web Service的功能了。下面让我们通过讲解一个网络分析Web Service的实现,来了解自定义Web Service的运作。这个网络分析的Web Service需要的功能是预先定义好的,其中有比如上下游追溯、连通性分析等等,这里只挑连通性分析这个小功能进行说明。首先,我们通过给定的wsdl新建了一个Web Service工程,然后找到实现类,在这个类中已经根据wsdl自动生成了对应各个功能的方法,这里就连通性分析功能进行讲解,对应的方法是connectivity,下面是这个方法的实现:publicclassTestGISAnalysisSoa

10、pBindingImplimplementsTestGISAnalysisPortTypeprivateGeoNetworkAnalysis geoNetAnalysis;publicTestGISAnalysisSoapBindingImpl()geoNetAnalysis =newGeoNetworkAnalysis();publicjava.lang.String connectivity(String sourceDeviceType, String sourceDeviceID, String targetDeviceType, String targetDeviceID,Strin

11、g type)throwsjava.rmi.RemoteExceptionString result = ;tryresult = geoNetAnalysis.findPath(Integer.parseInt(sourceDeviceType), Integer.parseInt(sourceDeviceID), Integer.parseInt(targetDeviceType), Integer.parseInt(targetDeviceID), type);catch(Exception ex)ex.printStackTrace();returnresult;怎么这么简单?当然,因

12、为这里对功能做了封装,真正的分析功能在geoNetAnalysis这个对象中,在这个对象中进行的都是直接对AO的操作,我们通过一些代码片段来看一下这个功能的实现:publicclassGeoNetworkAnalysispublicGeoNetworkAnalysis()tryEngineInitializer.initializeEngine();newAoInitialize().initialize(esriLicenseProductCode.esriLicenseProductCodeArcInfo);ResourceBundle bundle = ResourceBundle.ge

13、tBundle(geometrynetwork);traceFlowSolver =newTraceFlowSolver();INetSolver netSolver = (INetSolver) traceFlowSolver;geometricNetwork = openNetwork(bundle.getString(workspacePath),bundle.getString(datasetName),bundle.getString(networkName);pNetElements =newINetElementsProxy(geometricNetwork.getNetwork

14、();netSolver.setSourceNetworkByRef(geometricNetwork.getNetwork();.catch(Exception e)e.printStackTrace();/* 连通性分析*paramsourceLyrID* 起点的图层ID*paramsourceFeatID* 起点的要素ID*paramtargetLyrID* 终点的图层ID*paramtargetFeatID* 终点的要素ID*paramtype*return*/publicString findPath(intsourceLyrID,intsourceFeatID,inttargetL

15、yrID,inttargetFeatID, String type)throwsExceptionthis.putTraceOrigins(getOriginPoints(sourceLyrID,sourceFeatID,targetLyrID,targetFeatID);IEnumNetEID junctionEIDS =newIEnumNetEID1;IEnumNetEID edgeEIDs =newIEnumNetEID1;Object costArray =newObject11;traceFlowSolver.findPath(esriFlowMethod.esriFMConnect

16、ed,esriShortestPathObjFn.esriSPObjFnMinSum, junctionEIDS, edgeEIDs, 1, costArray);.Set junctions =this.getSolverResultFeature(junctionEIDS0);Set edges =this.getSolverResultFeature(edgeEIDs0);returnFeatureUworkResultToJSON(junctions, edges);注意,上面只是代码片段,整个功能的实现代码太长了,和我们要了解的Web Service其实又没有什么关系,所以,就看个大

17、概吧。做完这些,在很多场合都可以调用这个自定义的Web Service了,比如上面这个功能我们是在Flex中调用的:试想一下,是不是不同的业务系统之间交互也可以做了呢?第一章 扩展ArcGIS Server这 一章其实和ADF已经没有太大关系了,在ArcGIS的帮助里也是在ArcGIS Server开发章节里。考虑到使用ADF开发的一般对功能要求比较多一点,所以对于怎么扩展ArcGIS Server可能比较关心,反正ADF差不多也讲完了,这一章就算是一个结束吧。从9.3.1开始,ArcGIS Server提供了Java开发者更多的可扩展性。通过扩展ArcGIS Server可以使某些自定义的功

18、能更加完善和强大、使你的某些工作可以更加模块化并和ArcGIS Server很好地结合在一起。下面让我们来看看ArcGIS Server可以通过什么样的途径进行扩展。一 Utility ObjectsUtility Objects主要是为了提升ArcGIS Server在Local方式连接下某些操作的性能而准备的。在此之前,让我们首先去了解一些ADF调用服务器端AO对象的过程和特点。图29 ADF调用服务器端对象的过程如 图 29所示,当用户发生请求的时候,ADF首先会和SOM交互(图中1);SOM将根据服务器情况分配一个SO用以处理这个用户的请求,同时返回这个SO的 代理(proxy)给AD

19、F(图中2);然后,ADF就会通过这个代理和服务器的SO进行交互(图中3,注意,这是ADF应用和GIS服务器之间的交互, 是跨进程的);当请求完成后,ADF释放相应的资源供其它用户使用(图中4)。跨进程的调用会消耗比较多的系统资源,响应速度较慢;当 ADF应用和GIS服务器分开部署的时候,还有相应的网络开销。因此,当你的ADF应用中有大量细粒度操作,频繁地对服务器端AO对象进行调用的时候,性 能会非常低下。Utility Objects就是为了解决这个问题而诞生的。Utility Objects的原理就是把上述分别属于ADF和GIS服务器两个进程中的操作合并到一起,都放到ArcGIS Serv

20、er中执行,这样可以极大地减小进程间通讯的开销。在实现上Utility Objects也并不复杂,你只需要把原来直接在ADF中实现的功能,封装到一个实现了自定义接口的类中,然后在ADF中调用这个自定义的功能类就可以 了。下面让我们看一下这个大体的流程,在ArcGIS Server帮助中有这样一个例子:把计算一个FeatureLayer中所有多边形面积总和的功能封装成一个Utility Object。首先,我们需要定义一个接口ICalculateArea,并使用CalcAreaUtil类来实现这个接口,注意,Utility Object的接口和类都需要使用“ArcGISExtension”注记来

21、声明:ArcGISExtensionpublicinterfaceICalculateAreapublicdoublecalculateArea(IFeatureLayer featureLayer)throwsIOException, AutomationException;ArcGISExtensionpublicclassCalcAreaUtilimplementsICalculateAreapublicdoublecalculateArea(IFeatureLayer featureLayer)doubletotalArea = 0;IFeatureClass featureClass

22、 = featureLayer.getFeatureClass();intnumFeatures = featureClass.featureCount(null);IFeatureCursor featureCursor = featureLayer.search(null,true);IFeature feature =null;Polygon polygon =null;for(inti = 0; i = first + pageSize)break;if(featureCount = first)result.add(ServiceUtil.feature2Einfo(feature)

23、;featureCount+;feature = featureCursor.nextFeature();经过这样的处理,性能有了极大的提升,一个简单的测试可以说明情况:这里做了一个半径1000公里的空间查询,返回结果总数为30437条。分页起始记录分页记录数优化前(s)优化后(s)0500179.4065.203如果你有细粒度的操作,又遇到了性能问题,现在是不是很心动?一 Server Object ExtensionsServer Object Extensions(以下简称SOE)是Server Object的扩展,比如MapServer、GPServer等等。和Utility Obje

24、cts不同,SOE只在Server Object被创建的时候被初始化,它的生命周期和Server Object是相同的。相比Utility Objects,SOE有以下的一些特点: 开发人员不需要手动实例化SOE,SOE是在Server Object被创建的同时被实例化的 ArcGIS Server的管理程序可以显示SOE的参数配置 SOE的运行信息将被记录到ArcGIS Server的日志中去 SOE的功能可以通过SOAP访问更直观一点,让我们看一下下面这张截图,这是一个添加了一个自定义SOE的Map Service管理界面:图 30 添加了SOE的Map Service是不是可以把SOE理

25、解成一个服务的自定义Capability?似乎ESRI就是这样理解的。那下面我们就通过自定义一个新的Capability来看看SOE的用法。二 创建一个自定义的Server Object Extension【案例】首先,我们使用IDE插件来帮助我们新建这个SOE,打开菜单的【File】-【New】-【Server Object Extension】打开新建窗口,如图 31;然后在如图 32的属性页中做些自定义的编辑,ArcGIS插件会自动新建一些类和配置文件。图31 新建SOE窗口图32 编辑一些SOE的属性好,现在虽然我们没有添加什么实质的功能代码,但是SOE的框架已经起来了,让我们尝试部署这个SOE到ArcGIS Ser

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1