您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > ArcGISServerJavaADF案例教程
第一章有关WebService在IDE的菜单中,你会看到有个很长的【ArcGISWebServicesProject】,别高兴,这不是给你自定义WebService的,运行完向导你会发现生成的是一个Java桌面程序——有着一如既往丑陋的界面和很不友好的GIS功能。原来我一直当它是废物,不过前段时间它还真的帮了我大忙。我们有个测试需要测ArcGISServer对WebService的支持,要求必须抓取到浏览器与服务器交互的可读的SOAP消息;但是你要知道,考虑到效率ArcGISServer内部都是用二进制的SOAP进行交互;要抓到可读的SOAP消息,ArcGIS的WebService包必须被部署到浏览器端——最后,就是靠这个丑陋的“ArcGISWebServicesProject”,做了很多修改封装成了Applet才达到了这个要求。扯远了,说了这么多其实只为了说明这样一点:“ArcGISWebServicesProject”是一个使用ArcGIS的WebService类库实现一些GIS功能的Java桌面程序,演示意义大于应用意义。下面我们首先来讨论一下如何使用SOAPSDK来访问ArcGISServer原生的WebService;然后再谈谈怎么自定义WebService,以便其它业务系统调用或出于其它目的的SOAP访问。一通过SOAPSDK访问ArcGISWebService这里我们通过一个简单的功能来演示如何使用SOAPSDK来访问ArcGISServer,调用一个MapService的功能。不管你是在Java桌面、Applet、ADF还是自定义的servlet中,如果你需要直接使用SOAP和ArcGIS交互,那么下面的这段内容对你可能会有帮助。这个简单的功能是“计算当前范围内的要素个数“,这个功能是如此的简单以至于我觉得看一下代码就可以明白了:MapServerBindingStubmapserver=newMapServerBindingStub(url);SpatialFilterfilter=newSpatialFilter();filter.setFilterGeometry(mapDescription.getMapArea().getExtent());filter.setSpatialRel(EsriSpatialRelEnum.esriSpatialRelIntersects);filter.setGeometryFieldName(SHAPE);filter.setSubFields(*);filter.setSearchOrder(EsriSearchOrder.esriSearchOrderSpatial);filter.setWhereClause();filter.setSpatialReferenceFieldName();filter.setSpatialRelDescription();intcount=mapserver.queryFeatureCount(“Layers”,0,(QueryFilter)filter);JOptionPane.showMessageDialog(this,Featurecount=+count);上面涉及到的各个ArcGIS的功能类都在com.esri.arcgisws包下,从命名上就可以看出这是专门为WebService准备的。代码里用到的url是地图服务的地址,比如““。在整个环节中你可能会对MapServerBindingStub的queryFeatureCount方法有一点兴趣,其实你打开ArcGIS帮助里的SOAPSDK,找到MapServices下面的QueryFeatureCount方法就可以看到,QueryFeatureCount需要3个参数,分别对应DataFrame名称、图层序号和QueryFilter,正与上面的代码相符。换句话说,com.esri.arcgisws包里的功能类就是SOAPSDK的Java实现。可是,不管是ADF还是RESTSDK都提供了比SOAPSDK好用多的调用ArcGISServer功能的方法,所以想来你会和我一样,对上面的这些内容兴趣寥寥——我觉得ESRI对SOAPSDK也是兴趣寥寥,以至于在SOAPSDK的文档里几乎都没有Java的示例代码。好了,让我们抛开ArcGIS提供的WebService,来看看怎么自定义WebService吧。我个人觉得自定义的WebService是更加有用的,而且,功能也可以做得更强大。二两种方式自定义WebService在IDE里创建一个WebService工程是很容易的,只要找到【File】-【New】-【WebService】菜单就可以了,点击这个菜单将会弹出下面的对话框:这里的Webservicetype有两种选择:一种是Bottomup、另外一种是Topdown。这两种方式分别对应了自下而上和自上而下两种新建WebService的模式。如果你已经有了实现的功能类,现在想要把它封装成WebService,那么你应当选择Bottomup模式;如果你首先定义了WebService的描述文件(wsdl),现在想要实现这个wsdl的功能,那么你应当选择Topdown模式。三实现WebService的功能不管通过Bottomup还是Topdown方式,当你把WebService的框架搭起来以后,剩下的工作就是如何去实现WebService的功能了。下面让我们通过讲解一个网络分析WebService的实现,来了解自定义WebService的运作。这个网络分析的WebService需要的功能是预先定义好的,其中有比如上下游追溯、连通性分析等等,这里只挑连通性分析这个小功能进行说明。首先,我们通过给定的wsdl新建了一个WebService工程,然后找到实现类,在这个类中已经根据wsdl自动生成了对应各个功能的方法,这里就连通性分析功能进行讲解,对应的方法是connectivity,下面是这个方法的实现:publicclassTestGISAnalysisSoapBindingImplimplementsTestGISAnalysisPortType{privateGeoNetworkAnalysisgeoNetAnalysis;publicTestGISAnalysisSoapBindingImpl(){geoNetAnalysis=newGeoNetworkAnalysis();}publicjava.lang.Stringconnectivity(StringsourceDeviceType,StringsourceDeviceID,StringtargetDeviceType,StringtargetDeviceID,Stringtype)throwsjava.rmi.RemoteException{Stringresult=;try{result=geoNetAnalysis.findPath(Integer.parseInt(sourceDeviceType),Integer.parseInt(sourceDeviceID),Integer.parseInt(targetDeviceType),Integer.parseInt(targetDeviceID),type);}catch(Exceptionex){ex.printStackTrace();}returnresult;}}怎么这么简单?当然,因为这里对功能做了封装,真正的分析功能在geoNetAnalysis这个对象中,在这个对象中进行的都是直接对AO的操作,我们通过一些代码片段来看一下这个功能的实现:publicclassGeoNetworkAnalysis{publicGeoNetworkAnalysis(){try{EngineInitializer.initializeEngine();newAoInitialize().initialize(esriLicenseProductCode.esriLicenseProductCodeArcInfo);ResourceBundlebundle=ResourceBundle.getBundle(geometrynetwork);traceFlowSolver=newTraceFlowSolver();INetSolvernetSolver=(INetSolver)traceFlowSolver;geometricNetwork=openNetwork(bundle.getString(workspacePath),bundle.getString(datasetName),bundle.getString(networkName));pNetElements=newINetElementsProxy(geometricNetwork.getNetwork());netSolver.setSourceNetworkByRef(geometricNetwork.getNetwork());...}catch(Exceptione){e.printStackTrace();}}/***连通性分析**@paramsourceLyrID*起点的图层ID*@paramsourceFeatID*起点的要素ID*@paramtargetLyrID*终点的图层ID*@paramtargetFeatID*终点的要素ID*@paramtype*@return*/publicStringfindPath(intsourceLyrID,intsourceFeatID,inttargetLyrID,inttargetFeatID,Stringtype)throwsException{this.putTraceOrigins(getOriginPoints(sourceLyrID,sourceFeatID,targetLyrID,targetFeatID));IEnumNetEID[]junctionEIDS=newIEnumNetEID[1];IEnumNetEID[]edgeEIDs=newIEnumNetEID[1];Object[][]costArray=newObject[1][1];traceFlowSolver.findPath(esriFlowMethod.esriFMConnected,esriShortestPathObjFn.esriSPObjFnMinSum,junctionEIDS,edgeEIDs,1,costArray);...SetIFeaturejunctions=this.getSolverResultFeature(junctionEIDS[0]);SetIFeatureedges=this.getSolverResultFeature(edgeEIDs[0]);returnFeatureUtil.networkResultToJSON(junctions,edges);}}注意,上面只是代码片段,整个功能的实现代码太长了,和我们要了解的WebService其实又没有什么关系,所以,就看个大概吧。做完这些,在很多场合都可以调用这个自定义的WebService了,比如上面这个功能我们是在Flex中调用的:mx:Script![CDATA[privatefunctionanalysisConnectivity():void{opt=wsAnalysis.getOperation(connectivity);args=newObject();args.sourceDeviceType=g1.attributes.layerId;args.sourceDeviceID=g1.attributes.OBJECTID;args.targetDev
本文标题:ArcGISServerJavaADF案例教程
链接地址:https://www.777doc.com/doc-2901720 .html