且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

ArcGIS Server 开发系列(三)--漫游 Graphics data sources

更新时间:2022-09-15 13:29:37

    和ArcGIS Server Local、ArcGIS Server Internet一样,GraphicsLayer是ArcGIS Server MapResource的一种,提供functionality给web controls使用。本文将在《ArcGIS Server 开发系列(二)--Web ADF 编程》示例基础上,增加查询结果高亮显示的功能,因为高亮显示的结果并不是图层本身所具备的,因此只需将高亮显示的图片存为graphics即可。

    目标:
    查询结果的高亮显示

    准备工作:
    1.以《ArcGIS Server 开发系列(二)--Web ADF 编程》示例配置和代码为基础。
    2.MapResourceManager属性中增加一个名为Selection的MapResource,并将它移动到编号为0的位置,即显示在所有MapResource最上面。
ArcGIS Server 开发系列(三)--漫游 Graphics data sources

    可以看到GraphicsLayer的datasource是在内存中的,也就是说是为了临时显示或存储使用的,这样速度比较快。Selection一定要放在World上面,否则就被World图层覆盖掉了。

    代码实现:

    在UI界面上,增加一个command,用来清除graphics。
ArcGIS Server 开发系列(三)--漫游 Graphics data sources

    双击“Select”生成事件响应方法:

ArcGIS Server 开发系列(三)--漫游 Graphics data sourcesprotected void cmdSelect_Click(object sender, EventArgs e)
ArcGIS Server 开发系列(三)--漫游 Graphics data sources{
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    SelectFeatures();
ArcGIS Server 开发系列(三)--漫游 Graphics data sources}


    代码的核心就在SelectFeature()里,它分为两个步骤,第一步对图层进行属性查询,第二步对查询结果进行高亮显示。首先是图层的属性查询:

ArcGIS Server 开发系列(三)--漫游 Graphics data sourcesint resource_index = 1;
ArcGIS Server 开发系列(三)--漫游 Graphics data sourcesstring targetlayername = "countries";
ArcGIS Server 开发系列(三)--漫游 Graphics data sourcesSystem.Data.DataTable datatable = null;
ArcGIS Server 开发系列(三)--漫游 Graphics data sources//直接获取MapResourceName为world的MapFunctionality,它的编号为1
ArcGIS Server 开发系列(三)--漫游 Graphics data sources
ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality mf = (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality)Map1.GetFunctionality(resource_index);
ArcGIS Server 开发系列(三)--漫游 Graphics data sources//先得到functionality,再获取resource
ArcGIS Server 开发系列(三)--漫游 Graphics data sources
ESRI.ArcGIS.ADF.Web.DataSources.IGISResource gisresource = mf.Resource;
ArcGIS Server 开发系列(三)--漫游 Graphics data sourcesbool supported = gisresource.SupportsFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality));
ArcGIS Server 开发系列(三)--漫游 Graphics data sourcesif (supported)
ArcGIS Server 开发系列(三)--漫游 Graphics data sources{
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality qfunc;
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    qfunc = (ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality)gisresource.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality), null);
ArcGIS Server 开发系列(三)--漫游 Graphics data sources
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    string[] lids;
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    string[] lnames;
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    qfunc.GetQueryableLayers(nullout lids, out lnames);
ArcGIS Server 开发系列(三)--漫游 Graphics data sources
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    ESRI.ArcGIS.ADF.Web.SpatialFilter spatialfilter = new ESRI.ArcGIS.ADF.Web.SpatialFilter();
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    spatialfilter.ReturnADFGeometries = false;
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    spatialfilter.MaxRecords = 1000;
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    spatialfilter.WhereClause = txtQuery.Text;
ArcGIS Server 开发系列(三)--漫游 Graphics data sources           
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    datatable = qfunc.Query(null, lids[0], spatialfilter);
ArcGIS Server 开发系列(三)--漫游 Graphics data sources}

    这段代码和《ArcGIS Server 开发系列(二)--Web ADF 编程》示例中的代码相比,没有太多改动的地方,用到了ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality,它继承于ESRI.ArcGIS.ADF.Web.DataSources.IGISFunctionality 接口。每一个web control可能拥有多个functionality,而funtionality是各种resource展现出来的,因此可以通过web controls--funcionalities--resources这条路线来获得当前的资源,那么如何让查询结果高亮显示呢?

ArcGIS Server 开发系列(三)--漫游 Graphics data sources//重新获得Map1控件所有的functionality
ArcGIS Server 开发系列(三)--漫游 Graphics data sources
IEnumerable gfc = Map1.GetFunctionalities();
ArcGIS Server 开发系列(三)--漫游 Graphics data sourcesESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource gResource = null;
ArcGIS Server 开发系列(三)--漫游 Graphics data sourcesforeach (IGISFunctionality gfunc in gfc)
ArcGIS Server 开发系列(三)--漫游 Graphics data sources{
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    //找到名为"Selection"的MapResource
ArcGIS Server 开发系列(三)--漫游 Graphics data sources
    if (gfunc.Resource.Name == "Selection")
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    {
ArcGIS Server 开发系列(三)--漫游 Graphics data sources        //down cast到ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource
ArcGIS Server 开发系列(三)--漫游 Graphics data sources
        gResource = (ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource)gfunc.Resource;
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    }

ArcGIS Server 开发系列(三)--漫游 Graphics data sources}

ArcGIS Server 开发系列(三)--漫游 Graphics data sources
ArcGIS Server 开发系列(三)--漫游 Graphics data sourcesif (gResource == null)
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    return;
ArcGIS Server 开发系列(三)--漫游 Graphics data sources
ArcGIS Server 开发系列(三)--漫游 Graphics data sourcesESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer glayer = null;
ArcGIS Server 开发系列(三)--漫游 Graphics data sources
ArcGIS Server 开发系列(三)--漫游 Graphics data sourcesforeach (System.Data.DataTable dt in gResource.Graphics.Tables)
ArcGIS Server 开发系列(三)--漫游 Graphics data sources{
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    if (dt is ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer)
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    {
ArcGIS Server 开发系列(三)--漫游 Graphics data sources        glayer = (ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer)dt;
ArcGIS Server 开发系列(三)--漫游 Graphics data sources        break;
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    }

ArcGIS Server 开发系列(三)--漫游 Graphics data sources}

ArcGIS Server 开发系列(三)--漫游 Graphics data sources
ArcGIS Server 开发系列(三)--漫游 Graphics data sourcesif (glayer == null)
ArcGIS Server 开发系列(三)--漫游 Graphics data sources{
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    glayer = new ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer();
ArcGIS Server 开发系列(三)--漫游 Graphics data sources
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    gResource.Graphics.Tables.Add(glayer);
ArcGIS Server 开发系列(三)--漫游 Graphics data sources}

ArcGIS Server 开发系列(三)--漫游 Graphics data sources
ArcGIS Server 开发系列(三)--漫游 Graphics data sources//清除已有数据
ArcGIS Server 开发系列(三)--漫游 Graphics data sources
glayer.Clear();
ArcGIS Server 开发系列(三)--漫游 Graphics data sources
ArcGIS Server 开发系列(三)--漫游 Graphics data sourcesDataRowCollection drs = datatable.Rows;
ArcGIS Server 开发系列(三)--漫游 Graphics data sources
ArcGIS Server 开发系列(三)--漫游 Graphics data sourcesint shpind = -1;
ArcGIS Server 开发系列(三)--漫游 Graphics data sourcesfor (int i = 0; i < datatable.Columns.Count; i++)
ArcGIS Server 开发系列(三)--漫游 Graphics data sources{
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    if (datatable.Columns[i].DataType == typeof(ESRI.ArcGIS.ADF.Web.Geometry.Geometry))
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    {
ArcGIS Server 开发系列(三)--漫游 Graphics data sources        //找到Geometry字段的序号
ArcGIS Server 开发系列(三)--漫游 Graphics data sources
        shpind = i;
ArcGIS Server 开发系列(三)--漫游 Graphics data sources        break;
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    }

ArcGIS Server 开发系列(三)--漫游 Graphics data sources}

ArcGIS Server 开发系列(三)--漫游 Graphics data sources
ArcGIS Server 开发系列(三)--漫游 Graphics data sourcestry
ArcGIS Server 开发系列(三)--漫游 Graphics data sources{
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    foreach (DataRow dr in drs)
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    {
ArcGIS Server 开发系列(三)--漫游 Graphics data sources        ESRI.ArcGIS.ADF.Web.Geometry.Geometry geom = (ESRI.ArcGIS.ADF.Web.Geometry.Geometry)dr[shpind];
ArcGIS Server 开发系列(三)--漫游 Graphics data sources       
ArcGIS Server 开发系列(三)--漫游 Graphics data sources        //创建一个GraphicElement
ArcGIS Server 开发系列(三)--漫游 Graphics data sources
        ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement ge = null;
ArcGIS Server 开发系列(三)--漫游 Graphics data sources        ge = new ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement(geom, System.Drawing.Color.Yellow);
ArcGIS Server 开发系列(三)--漫游 Graphics data sources        ge.Symbol.Transparency = 50.0;
ArcGIS Server 开发系列(三)--漫游 Graphics data sources       
ArcGIS Server 开发系列(三)--漫游 Graphics data sources        //将GraphicElement添加到ElementGraphicsLayer中
ArcGIS Server 开发系列(三)--漫游 Graphics data sources
        glayer.Add(ge);
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    }

ArcGIS Server 开发系列(三)--漫游 Graphics data sources}

ArcGIS Server 开发系列(三)--漫游 Graphics data sourcescatch (InvalidCastException ice)
ArcGIS Server 开发系列(三)--漫游 Graphics data sources{
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    throw new Exception("No geometry available in datatable");
ArcGIS Server 开发系列(三)--漫游 Graphics data sources}

ArcGIS Server 开发系列(三)--漫游 Graphics data sources
ArcGIS Server 开发系列(三)--漫游 Graphics data sourcesif (Map1.ImageBlendingMode == ImageBlendingMode.WebTier)
ArcGIS Server 开发系列(三)--漫游 Graphics data sources{ Map1.Refresh(); }
ArcGIS Server 开发系列(三)--漫游 Graphics data sourceselse if (Map1.ImageBlendingMode == ImageBlendingMode.Browser)
ArcGIS Server 开发系列(三)--漫游 Graphics data sources{
ArcGIS Server 开发系列(三)--漫游 Graphics data sources    //只刷新Graphics Resource
ArcGIS Server 开发系列(三)--漫游 Graphics data sources
    Map1.RefreshResource(gResource.Name);
ArcGIS Server 开发系列(三)--漫游 Graphics data sources}

    这次我们没有将搜索到的结果绑定到控件上,只要得到高亮显示的结果,测试一下程序,看看能得到什么样的效果。
ArcGIS Server 开发系列(三)--漫游 Graphics data sources

    搜索出国家名称以"C"开头的国家,最典型的“中国”、“加拿大”已经找到了,这样我们就实现了高亮显示的功能。同样,我们进行开发后的小结,能想到些什么呢?还是按照CH风格来进行总结:

    第一,GraphicsLayer有两个子类,ElementGraphicLayer和FeatureGraphicLayer,因为程序中只需要暂时显示查询的结果,因此将查询要素存为ElementGraphicLayer就可以,想想在什么情况下使用FeatureGraphicLayer。

    第二,ElementGraphicLayer继承于System.Data.DataTable,gResource.graphics属于 System.Data.DataSet类型,这样使得我们在开发过程中,可以将GraphicElement添加到 ElementGraphicLayer,然后将ElementGraphicLayer添加到gResource.graphics,通过这种途径来向 GraphicsLayer的mapresource中添加数据,这种机制方便了我们能够像操纵datatable和dataset一样来控制 mapresource中的数据,既和.Net无缝整合,也在一定程度上降低了Server开发难度,例如代码中glayer.Clear()调用了datatable的clear()方法,还有后面GraphicElement的创建。

    第三,Map1.ImageBlendingMode决定了地图的刷新是刷新整个页面,还是仅刷新当前mapresource,这样的设计在web开发中尽可能的较少了网络数据传输量。

    Graphics data sources是学习ArcGIS Server data sources的基础,下面一篇,将介绍ArcGIS Server data sources的开发,之前网上已经有朋友要求加快写作进度了,不过日常工作中的琐事实在比较多,写代码、文章经常会被打断,写的太差又对不住大家花的时间,所以只能尽量以最快的速度写好每一篇博客,大家的支持就是我的动力:)这篇到此为止,写完收工,回家过周末~~

本文转自Flyingis博客园博客,原文链接:http://www.cnblogs.com/flyingis/archive/2007/08/17/860128.html,如需转载请自行联系原作者