ArcGIS Server 开发系列(二)–Web ADF 编程
目标:
根据查询语句实现图层信息查询
代码实现:
我们要完成的工作是对图层属性信息的查询,首先在页面左侧添加一个新的panel,左侧的Tasks、Results等都是放置在panel之中,在这个新的panel中分别添加TreeViewPlus、TextBox、Button三个控件,TextBox输入查询条件,Button确定查询, TreeViewPlus显示结果,在设计试图中浏览效果如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections;
using ESRI;
using ESRI.ArcGIS.ADF.Web.DataSources;
using ESRI.ArcGIS.ADF.Web.Geometry;
using ESRI.ArcGIS.ADF.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button_query_Click(object sender, EventArgs e)
{
Query(Map1.Extent);
}
private void Query(ESRI.ArcGIS.ADF.Web.Geometry.Envelope envelope)
{
IEnumerable func_enum = null;
func_enum = Map1.GetFunctionalities();//获取当前map1控件中所有的functionality
System.Data.DataTable datatable;
foreach (ESRI.ArcGIS.ADF.Web.DataSources.IGISFunctionality gisfun in func_enum)//对所有的functionality进行遍历
{
ESRI.ArcGIS.ADF.Web.DataSources.IGISResource gisresource = null;
gisresource = gisfun.Resource;//得到该functionality的resource
bool supported = false;
//判断该resource是否支持IQueryFunctionality
supported = gisresource.SupportsFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality));
if (supported)
{
ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality qfunc;
qfunc = (IQueryFunctionality)gisresource.CreateFunctionality(typeof(IQueryFunctionality), null);
string[] ids;
string[] names;
qfunc.GetQueryableLayers(null, out ids, out names);//获得图层的layerId和layerName
ESRI.ArcGIS.ADF.Web.SpatialFilter spatialfilter = new ESRI.ArcGIS.ADF.Web.SpatialFilter();
spatialfilter.ReturnADFGeometries = false;//设置查询条件
spatialfilter.MaxRecords = 1000;
spatialfilter.WhereClause = TextBox_condition.Text;
//spatialfilter.Geometry=geometry;
datatable = qfunc.Query(null, ids[0], spatialfilter);//对指定的图层进行查询ids[0]
TreeViewPlus1.Nodes.Clear();
if (datatable != null)
{
System.Data.DataSet ds = new DataSet();
ds.Tables.Add(datatable);
TreeViewPlus1.ShowClearAllButton = false;
TreeViewPlus1.Value = "搜索结果";
TreeViewPlus1.BindToDataSet(ds);//将结果绑定到TreeViewPlus控件上
TreeViewPlus1.Nodes[0].Expanded = true;
}
}
}
}
}
这样这个小程序就完成了,在server中实现了对图层属性信息的查询,现在我们需要进行更多的考虑:
第一,考虑web控件、 functionality、datasource、resource、resourcemamager之间的关系,代码中多次对它们的关系进行了描述,用文档中的一幅图可以概括整个框架,这篇文章对此进行了阐述–《ArcGIS Server .Net Web ADF体系结构》。
第二,程序中使用的mxd仅仅包含一个world图层,因此对图层进行遍历的过程中只需获得第一图层的ID,如果指定图层名,可以在lnames得到所需的图层进行查询。
第三,程序实现的查询方式相当简单,在text box中输入原始的sql来完成where语句,只仅仅是一个测试,一般我们会屏蔽掉sql相关的关键字,提供多个text box或dropdownlist供用户选择进行字段查询。
第四,如果查询信息量不大,返回结果数量不多,完全可以考虑ajax来完成页面请求,不论是速度还是用户体验都会得到提高。
第五,通过程序可以看到,查询结果保存在一个datatable中,这极大的方便了server查询和.net的无缝连接,直接将结果和TreeViewPlus绑定,换成其他的visual studio控件也没问题。
只要整个框架思路清晰了,查询功能的实现其实很简单,这也是途径2开发方式的一个例子,可以看出ArcGIS Server ADF给开发提供了很多便利,和ArcIMS相比开发难度相当,多看看文档和ADF OMD图可以让我们对ArcGIS Server ADF开发有更多的了解,记住,这只是server开发的起步。