gisempire100
捉鬼专家
捉鬼专家
  • 注册日期2004-08-13
  • 发帖数552
  • QQ
  • 铜币2462枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:2207回复:3

ArcGIS Server 开发系列(二)--Web ADF 编程

楼主#
更多 发布于:2008-03-06 20:18
    Web ADF全名是Web Application Develope Framework,是ArcGIS Server专用的开发框架,9.2版本的ArcIMS也开始提供ADF的封装。完全使用Web控件编程几乎不能解决我们实际项目中的问题,因此我们从《<a href="http://www.cnblogs.com/flyingis/archive/2007/08/09/849375.html" target="_blank" ><FONT color=#0066aa>ArcGIS Server 开发系列(一)--编程框架总览</FONT></A>》中提到的途径二开始,即web controls + common datasource apis。
<P >    目标:</P>
<P >    根据查询语句实现图层信息查询</P>
<P >    准备工作:</P>
<P >    1.Windows XP sp2中/英文版<BR>    2.Visual Studio 2005中/英文版<BR>    3.ArcGIS Server 9.2(我打上了sp2补丁),创建一个ArcGIS Server服务,Map Server属性中更改Pooling,使用池化连接方式,Progresses选择“In a seperate process for each instance(high isolation)”,我的服务为“World”<BR>    4.利用vs2005创建一个模板server应用--Web Mapping Application,并更改MapResourceManager属性<BR><IMG src="http://www.cnblogs.com/images/cnblogs_com/flyingis/server201.gif" border=0><BR><IMG src="http://www.cnblogs.com/images/cnblogs_com/flyingis/server202.gif" border=0><BR><BR>    这样我们可以测试程序看是否能够正常运行,启动调试看到如下结果:<BR><IMG src="http://www.cnblogs.com/images/cnblogs_com/flyingis/server203.gif" border=0><BR><BR>    代码实现:</P>
<P >    我们要完成的工作是对图层属性信息的查询,首先在页面左侧添加一个新的panel,左侧的Tasks、Results等都是放置在panel之中,在这个新的panel中分别添加TreeViewPlus、TextBox、Button三个控件,TextBox输入查询条件,Button确定查询, TreeViewPlus显示结果,在设计试图中浏览效果如下:<BR><IMG src="http://www.cnblogs.com/images/cnblogs_com/flyingis/server204.gif" border=0><BR><BR>    双击“Query”Button,编写点击事件。</P>
<P >protected void cmdQuery_Click(object sender, EventArgs e)<BR>    {<BR>        Query(Map1.Extent);<BR>    }<BR>    Query方法实现了对图层属性信息的查询。    </P>
<P >protected void Query(ESRI.ArcGIS.ADF.Web.Geometry.Geometry geometry)<BR>    {<BR>        IEnumerable func_enum = null;<BR>        //获取当前map1控件中所有的functionality<BR>        func_enum = Map1.GetFunctionalities();</P>
<P >        System.Data.DataTable datatable;<BR>        //对所有的functionality进行遍历<BR>        foreach (ESRI.ArcGIS.ADF.Web.DataSources.IGISFunctionality gisfunctionality in func_enum)<BR>        {<BR>            ESRI.ArcGIS.ADF.Web.DataSources.IGISResource gisresource = null;<BR>            //得到该functionality的resource<BR>            gisresource = gisfunctionality.Resource;</P>
<P >            //判断该resource是否支持IQueryFunctionality  <BR>            bool supported = false;<BR>            supported = gisresource.SupportsFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality));</P>
<P >            if (supported)<BR>            {<BR>                ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality qfunc;<BR>                qfunc = (ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality)gisresource.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality), null);</P>
<P >                string[] lids;<BR>                string[] lnames;<BR>                //获得图层的layerId和layerName,GetQueryableLayers的重载方法可以指定图层类型<BR>                qfunc.GetQueryableLayers(null, out lids, out lnames);</P>
<P >                ESRI.ArcGIS.ADF.Web.SpatialFilter spatialfilter = new ESRI.ArcGIS.ADF.Web.SpatialFilter();<BR>                //设置过滤器的过滤条件,txtQuery就是panel中text box的ID<BR>                spatialfilter.ReturnADFGeometries = false;<BR>                spatialfilter.MaxRecords = 1000;<BR>                spatialfilter.WhereClause = txtQuery.Text;<BR>                spatialfilter.Geometry = geometry;</P>
<P >                //对指定的图层进行查询,查询的结果保存为DataTable<BR>                datatable = qfunc.Query(null, lids[0], spatialfilter);</P>
<P >                TreeViewPlus1.Nodes.Clear();<BR>                if (datatable != null)<BR>                {<BR>                    System.Data.DataSet ds = new System.Data.DataSet();<BR>                    ds.Tables.Add(datatable);<BR>                    TreeViewPlus1.ShowClearAllButton = false;<BR>                    //将结果绑定到TreeViewPlus控件上<BR>                    TreeViewPlus1.BindToDataSet(ds);</P>
<P >                    TreeViewPlus1.Nodes[0].Expanded = true;<BR>                }<BR>            }<BR>        }<BR>    }<BR>    运行程序,text box中输入“CNTRY_NAME LIKE 'A%'”,查询结果:</P>
<P ><IMG src="http://www.cnblogs.com/images/cnblogs_com/flyingis/server205.gif" border=0><BR><BR>    这样这个小程序就完成了,在server中实现了对图层属性信息的查询,现在我们需要进行更多的考虑:<BR>    第一,考虑web控件、 functionality、datasource、resource、resourcemamager之间的关系,代码中多次对它们的关系进行了描述,用文档中的一幅图可以概括整个框架,这篇文章对此进行了阐述--《ArcGIS Server .Net Web ADF体系结构》。<BR><IMG src="http://www.cnblogs.com/images/cnblogs_com/flyingis/server206.gif" border=0><BR><BR>    第二,程序中使用的mxd仅仅包含一个world图层,因此对图层进行遍历的过程中只需获得第一图层的ID,如果指定图层名,可以在lnames得到所需的图层进行查询。</P>
<P >    第三,程序实现的查询方式相当简单,在text box中输入原始的sql来完成where语句,只仅仅是一个测试,一般我们会屏蔽掉sql相关的关键字,提供多个text box或dropdownlist供用户选择进行字段查询。</P>
<P >    第四,如果查询信息量不大,返回结果数量不多,完全可以考虑ajax来完成页面请求,不论是速度还是用户体验都会得到提高。</P>
<P >    第五,通过程序可以看到,查询结果保存在一个datatable中,这极大的方便了server查询和.net的无缝连接,直接将结果和TreeViewPlus绑定,换成其他的visual studio控件也没问题。</P>
<P >    只要整个框架思路清晰了,查询功能的实现其实很简单,这也是途径2开发方式的一个例子,可以看出ArcGIS Server ADF给开发提供了很多便利,和ArcIMS相比开发难度相当,多看看文档和ADF OMD图可以让我们对ArcGIS Server ADF开发有更多的了解,记住,这只是server开发的起步。</P>
喜欢0 评分0
A friend is never known till a man has need. ...CL
zsj1986
外卖仔
外卖仔
  • 注册日期2007-07-11
  • 发帖数42
  • QQ
  • 铜币221枚
  • 威望2点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
1楼#
发布于:2008-09-25 14:53
<img src="images/post/smile/dvbbs/em01.gif" /><img src="images/post/smile/dvbbs/em02.gif" />
举报 回复(0) 喜欢(0)     评分
mytest
论坛版主
论坛版主
  • 注册日期2006-12-17
  • 发帖数155
  • QQ
  • 铜币53枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2008-09-26 19:55
<img src="images/post/smile/dvbbs/em08.gif" /><img src="images/post/smile/dvbbs/em08.gif" />
举报 回复(0) 喜欢(0)     评分
muhaikun
路人甲
路人甲
  • 注册日期2009-03-20
  • 发帖数2
  • QQ
  • 铜币109枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2009-07-15 21:05
<img src="images/post/smile/dvbbs/em08.gif" /><img src="images/post/smile/dvbbs/em02.gif" /> 谢谢啦!
举报 回复(0) 喜欢(0)     评分
游客

返回顶部