• ArcGIS Server 9.3下自写Idenfity功能(vs2008环境下)


     

     效果图如下所示:

     

    1、在工具栏上添加idenfify工具,其代码如下:

    <esri:Tool ClientAction="Point" DefaultImage="~/image/identify.png"

    DisabledImage="~/image/identify_OFF.gif"HoverImage="~/image/identify_HOVER.gif"JavaScriptFile=""Name="MapIdentify"SelectedImage="~/image/identify_ON.gif" ServerActionAssembly="App_code" ServerActionClass="MapIdentify" Text="MapIdentify" ToolTip="MapIdentify" />

    2、添加TaskResults控件用来存放结果并将它放在一个div中。代码如下:

    <div id="tskdiv" runat="server"   >

         <esri:TaskResults ID="TaskResults1" runat="server" BackColor="#ffffff"

                Font-Names="Verdana" Font-Size="8pt" ForeColor="#000000" Map="Map1" style="top: 253px; left: 517px; overflow:auto; width: 298px; height: 209px; "

         />

    </div>

    3.在Default 页面的Page_Load中加入

    Session["TaskResultsControl"] = TaskResults1;

    用来传递TaskResults1对象。

    4、在App_code 中加入MapIdentify.cs,其代码如下:

     

    public class MapIdentify:IMapServerToolAction

        {

            #region IMapServerToolAction Members

          

     

           void IMapServerToolAction.ServerAction(ToolEventArgs args)

            {

     

                int m_numberDecimals = 3;

                  int m_IdentifyTolerance = 5;

                Map map = (Map)args.Control;

                IGISResource resource;

                IQueryFunctionality query;

     

                string locXString = "";

                string locYString = "";

     

                IdentifyOption m_idOption = IdentifyOption.VisibleLayers;

     

                PointEventArgs pea = (PointEventArgs)args;

     

        

                System.Drawing.Point screen_point = pea.ScreenPoint;

     

     

     

                //像素坐标转换成地理坐标

                ESRI.ArcGIS.ADF.Web.Geometry.Point mapPoint = ESRI.ArcGIS.ADF.Web.Geometry.Point.ToMapPoint(screen_point.X, screen_point.Y, map.GetTransformationParams(ESRI.ArcGIS.ADF.Web.Geometry.TransformationDirection.ToMap));

     

                List<DataSet> gdsList = new List<DataSet>();

              

                DataTable[] ds = null;

     

                foreach (IMapFunctionality mapFunc in map.GetFunctionalities())

                {

                    if (mapFunc is ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality)

                    {

                        continue;

                    }

                    resource = mapFunc.Resource;

                    //建立查询方法

     

                    query = resource.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality), "identify_") as IQueryFunctionality;

     

                    string[] layerIds;

                    string[] layerNames;

                    //查询地图图层id和名称

                    query.GetQueryableLayers(null, out layerIds, out layerNames);

                    //resource类型

                    string resourceType = resource.DataSource.GetType().ToString();

     

                    //只显示坐标的3个小数

                    double roundFactor = Math.Pow(10, m_numberDecimals);

                    string pointXString = Convert.ToString(Math.Round(mapPoint.X * roundFactor) / roundFactor);

                    string pointYString = Convert.ToString(Math.Round(mapPoint.Y * roundFactor) / roundFactor);

     

                    locXString = pointXString;

                    locYString = pointYString;

     

                   

                    try

                    {

                        //进行查询并且把查询结果放入DataTable数组 

                        //                                查询坐标 冗余半径             只查可见图层

                        ds = query.Identify(mapFunc.Name, mapPoint, m_IdentifyTolerance, m_idOption, null);

                    }

                    catch (Exception e)

                    {

                        //出错处理

                        DataTable table = new DataTable();

                        table.TableName = "Identify Error: " + e.Message;

                        ds = new DataTable[] { table };

                    }

                    //判断查询结果

                    if (ds != null && ds.Length > 0)

                    {

                        DataSet gds = new DataSet();

                        DataTable table;

     

                        //对查询结果DataTable[]进行遍历添加到DataSet

                        for (int j = ds.Length - 1; j >= 0; j--)

                        {

                            table = ds[j];

                            if (table.Rows.Count == 0 && table.TableName.IndexOf("Error") < 0)

                            {

                                //跳过本次进入下一次循环

                               continue;

                            }

     

                            //把DataTable转换成GraphicsLayer

                            GraphicsLayer layer = ESRI.ArcGIS.ADF.Web.Converter.ToGraphicsLayer(table, System.Drawing.Color.Empty, System.Drawing.Color.Aqua);

                           

                            layer.RenderOnClient = true;

                            if (layer != null)

                            {

                                gds.Tables.Add(layer);

                            }

                            else

                            {

                                gds.Tables.Add(table);

                            }

                        }

                        if (gds.Tables.Count == 0)

                        {

                            //跳过本次循环

                            continue;

                        }

                        gds.DataSetName = resource.Name + " (" + pointXString + ", " + pointYString + ")";

                        gdsList.Add(gds);

                    }

                }

               

              ESRI.ArcGIS.ADF.Web.UI.WebControls.TaskResults taskResults =

        (ESRI.ArcGIS.ADF.Web.UI.WebControls.TaskResults)map.Page.Session["TaskResultsControl"];

     

               taskResults.Visible = true;

     

                for (int i = gdsList.Count - 1; i >= 0; i--)

                {

                    //用TaskResults进行查询内容显示

                    // m_resultsDisplay.DisplayResults(null, null, null, gdsList[i]);

     

                  taskResults.DisplayResults(null, null, null, gdsList[i]);

                }

     

                //没有查询到结果

                if (gdsList.Count == 0)

                {

                    string heading = "Location (" + locXString + ", " + locYString + ") No results found";

                    string detail = "No results found";

                    SimpleTaskResult str = new SimpleTaskResult(heading, detail);

               

                    taskResults.DisplayResults(null, null, null, str);

                }

     

     

              

               // Copy the TaskResults' callback results to the Map so the results show up

               map.CallbackResults.CopyFrom(taskResults.CallbackResults);

    }

    #endregion

    }

     

    一起学习GIS及其二次开发,一起进步!
  • 相关阅读:
    IA__gdk_drawable_get_size: assertion 'GDK_IS_DRAWABLE (drawable)' failed
    宿主机系统 Deepin 15.4,解决 Virtualbox 5.1 中 XP虚拟机无法使用 USB设备(如:U盘、罗技优联接收器等)的问题
    Deepin安装Virtualbox扩展包出现与gksu-run-helper通信失败的解决
    docker 学习资料收集
    从编程语言的角度看中医的【藏像】理论
    从程序员视角和编程语言角度看【中医】:一种生命健康编程语言
    使用微服务架构思想,设计部署API代理网关和OAuth2.0授权认证框架
    在Office应用中打开WPF窗体并且让子窗体显示在Office应用上
    彻底关闭Excle进程的几个方法
    70后.net老猿,尚能饭否?
  • 原文地址:https://www.cnblogs.com/tuncaysanli/p/1360084.html
Copyright © 2020-2023  润新知