您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > ArcGIS Server开发系列
-1-ArcGISArcGISArcGISArcGISServerServerServerServer开发系列((((一))))编程框架总览ArcGISServer是一个发布企业级GIS应用程序的综合平台,如果想对ArcGISServer基础有更多的了解,可以先看看《ArcGISServer体系结构》、ESRI(中国)BBS论坛和ESRI网站。这里及接下来的一系列文章将主要介绍ArcGISServer开发相关的内容(如不加说明,后文中Server专指ArcGISServer),由浅入深,充分利用Server的资源来构建我们的企业级应用,同时也可以了解Server的优势及不足,在实际应用中扬长避短。进行Server开发之前,我们首先需要了解Server开发的整体架构。下图(截取自官方文档)可以看到,Server提供了一系列的应用开发途径,从1到4难度逐步增加,当然功能和可定制性也越来越强,我们可以充分利用Server提供的这些资源来构建我们的应用。WeWeWeWebbbb应用开发Server为Web应用开发提供了一系列的开发方式,在visualstudio2005中可以直接使用WebMappingApplicationtemplate建立应用,它包含了WebADF框架,是学习Server开发的入口。对照上面的示意图,可以这样来理解,如果想使用各种Web控件加上少量代码来构建Web应用,可以直接使用第一种途径,这样的应用比较死板,让人感觉有点想搭积木,程序员可能没有任何成就感,好处是开发迅速,适合入门学习或做个简单的Server演示。如果想在CommonAPI基础上,使用各种通用的functionality,通过各种datasource类型来定制WebADF,可以使用第二种开发途径。如果想使用CommonAPI,并且需要通过CommonAPI调用specificAPI来定制WebADF,可以通过第三种途径来开发。WebWebWebWebServiceServiceServiceService开发WebService是什么不用再介绍,ArcGIS提供了两种类型的WebService创建方法:GISWebService和ApplicationWebService。GISWebService提供了一种将ArcGISServerObject(Localdatasource)发布为ArcGISServerWebService(Internetdatasource)的ESRI标准,GISWebService不用于开发,通常它们是用来发布信息和提供资-2-源,ArcMap就可以直接使用GISWebService的资源而不用进行任何开发,另外WebADF控件和CommonAPI也可以使用GISWebService资源。因为GISWebService基于标准webservice,它可以作为传统webservice来使用,ArcGISServer提供了SOAPAPI进行相关的开发,以后的学习中会使用到。ApplicationWebService是基于标准webservice建立的应用,使用一种ESRI的datasource进行开发。因为webservice没有用户接口,上图中途径一不适合这样的应用,途径四是最适合的,因为webservice可充分利用ESRI提供的各种datasourcespecificAPI的所有functionality。桌面客户端应用开发ESRI在桌面客户端应用中提供了两种实现GIS功能和服务的方法:ArcGISEngine和datasourcespecificdeveloperAPIs,上图中只有第四种途径可用于桌面客户端应用。ArcEngine不论是和本地GIS资源交互,还是使用远程数据资源,都拥有丰富的控件和众多API,但它在使用和分发之前必须进行授权注册,而任何datasourcespecificdeveloperAPIs都可以在桌面客户端应用中编程使用。移动应用开发移动应用和Web应用、webservices比较类似,但它们是为某一个特定的客户端环境而设计,如PocketPC。MobileADF是为移动应用定制的开发框架,通常使用途径四来进行开发,这样可以充分利用ArcGISServerWebservices和SOAPAPI提供的功能。在以后的实际开发过程中,我们会逐步了解上述各种开发方式,并不断深入。ArcGISArcGISArcGISArcGISServerServerServerServer开发系列(二)--Web--Web--Web--WebADFADFADFADF编程WebADF全名是WebApplicationDevelopeFramework,是ArcGISServer专用的开发框架,9.2版本的ArcIMS也开始提供ADF的封装。完全使用Web控件编程几乎不能解决我们实际项目中的问题,因此我们从《ArcGISServer开发系列(一)--编程框架总览》中提到的途径二开始,即webcontrols+commondatasourceapis。目标:根据查询语句实现图层信息查询准备工作:1.WindowsXPsp2中/英文版2.VisualStudio2005中/英文版3.ArcGISServer9.2(我打上了sp2补丁),创建一个ArcGISServer服务,MapServer属性中更改Pooling,使用池化连接方式,Progresses选择“Inaseperateprocessforeachinstance(highisolation)”,我的服务为“World”4.利用vs2005创建一个模板server应用--WebMappingApplication,并更改MapResourceManager属性-3-这样我们可以测试程序看是否能够正常运行,启动调试看到如下结果:代码实现:-4-我们要完成的工作是对图层属性信息的查询,首先在页面左侧添加一个新的panel,左侧的Tasks、Results等都是放置在panel之中,在这个新的panel中分别添加TreeViewPlus、TextBox、Button三个控件,TextBox输入查询条件,Button确定查询,TreeViewPlus显示结果,在设计试图中浏览效果如下:双击“Query”Button,编写点击事件。protectedvoidcmdQuery_Click(objectsender,EventArgse){Query(Map1.Extent);}Query方法实现了对图层属性信息的查询。protectedvoidQuery(ESRI.ArcGIS.ADF.Web.Geometry.Geometrygeometry){IEnumerablefunc_enum=null;//获取当前map1控件中所有的functionalityfunc_enum=Map1.GetFunctionalities();System.Data.DataTabledatatable;//对所有的functionality进行遍历foreach(ESRI.ArcGIS.ADF.Web.DataSources.IGISFunctionalitygisfunctionalityinfunc_enum){ESRI.ArcGIS.ADF.Web.DataSources.IGISResourcegisresource=null;//得到该functionality的resourcegisresource=gisfunctionality.Resource;//判断该resource是否支持IQueryFunctionalityboolsupported=false;supported=gisresource.SupportsFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality));-5-if(supported){ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionalityqfunc;qfunc=(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality)gisresource.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality),null);string[]lids;string[]lnames;//获得图层的layerId和layerName,GetQueryableLayers的重载方法可以指定图层类型qfunc.GetQueryableLayers(null,outlids,outlnames);ESRI.ArcGIS.ADF.Web.SpatialFilterspatialfilter=newESRI.ArcGIS.ADF.Web.SpatialFilter();//设置过滤器的过滤条件,txtQuery就是panel中textbox的IDspatialfilter.ReturnADFGeometries=false;spatialfilter.MaxRecords=1000;spatialfilter.WhereClause=txtQuery.Text;spatialfilter.Geometry=geometry;//对指定的图层进行查询,查询的结果保存为DataTabledatatable=qfunc.Query(null,lids[0],spatialfilter);TreeViewPlus1.Nodes.Clear();if(datatable!=null){System.Data.DataSetds=newSystem.Data.DataSet();ds.Tables.Add(datatable);TreeViewPlus1.ShowClearAllButton=false;//将结果绑定到TreeViewPlus控件上TreeViewPlus1.BindToDataSet(ds);TreeViewPlus1.Nodes[0].Expanded=true;}}}}-6-运行程序,textbox中输入“CNTRY_NAMELIKE'A%'”,查询结果:这样这个小程序就完成了,在server中实现了对图层属性信息的查询,现在我们需要进行更多的考虑:第一,考虑web控件、functionality、datasource、resource、resourcemamager之间的关系,代码中多次对它们的关系进行了描述,用文档中的一幅图可以概括整个框架,这篇文章对此进行了阐述--《ArcGISServer.NetWebADF体系结构》。第二,程序中使用的mxd仅仅包含一个world图层,因此对图层进行遍历的过程中只需获得第一图层的ID,如果指定图层名,可以在lnames得到所需的图层进行查询。第三,程序实现的查询方式相当简单,在textbox中输入原始的sql来完成where语句,只仅仅是一个测试,一般我们会屏蔽掉sql相关的关键字,提供多个textbox或dropdownlist供用户选择进行字段查询。第四,如果查询信息量不大,返回结果数量不多,完全可以考虑ajax来完成页面请求,不论是速度还是用户体验都会得到提高。-7-第五,通过程序可以看到,查询结果保存在一个datatable中,这极大的方便了server查询和.net的无缝连接,直接将结果和TreeViewPlus绑定,换成其他的visualstudio控件也没问题。只要整个框架思路清晰了,查询功能的实现其实很简单,这也是途径2开发方式的一个例子,可以看出ArcGISServerADF给开发提供了很多便利,和ArcIMS相比开发难度相当,多看看文档和ADFOMD图可以让我们对ArcGISServerADF开发有更
本文标题:ArcGIS Server开发系列
链接地址:https://www.777doc.com/doc-5587422 .html