ArcGIS.Server.9.2.DotNet自带例子分析(一、三)

2024-03-23 14:18

本文主要是介绍ArcGIS.Server.9.2.DotNet自带例子分析(一、三),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 作者:水的右边(GIS特邀嘉宾)

目的:
1.MapIdentify功能,自定义Tool以及TaskResults应用
准备:
1.(一、二)的工程,具体见前篇。

开始:
1.编辑Toolbar1的ToolbarItems属性添加一个Tool,ClientAction属性为MapIdentify('Map1'); Name属性为MapIdentify Text属性为Identify ToolTip属性为Identify (Ctrl-MouseClick) 具体代码如下:
1<esri:Tool ClientAction="MapIdentify('Map1');" DefaultImage="~/Images/identify.png"
2HoverImage="~/Images/identify_HOVER.gif" JavaScriptFile="" Name="MapIdentify" SelectedImage="~/Images/identify_ON.gif" Text="Identify" ToolTip="Identify (Ctrl-MouseClick)"
/>
2.开始代码部分的编写,添加MapIdentify.cs,用来实现具体的功能。代码和说明如下:

复制内容到剪贴板
代码:
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 ESRI.ArcGIS.ADF.Web.UI.WebControls;
using System.Collections.Specialized;
using ESRI.ArcGIS.ADF.Web.DataSources;
using System.Collections.Generic;
using ESRI.ArcGIS.ADF.Web;
using ESRI.ArcGIS.ADF.Web.Display.Graphics;
using System.Data;
namespace MappingApp
{
public class MapIdentify
{
    private Page m_page;
    private Map m_map;
    //客户端脚本段
    private string m_callbackInvocation ="";
    //脚本路径
    private string m_filePath ="";
    //保留几位小数
    private int m_numberDecimals =3;
    //可见图层
    private IdentifyOption m_idOption = IdentifyOption.VisibleLayers;
    //查询的冗余范围半径
    public  int m_IdentifyTolerance =5;
    //用来显示查询结果内容
    private TaskResults m_resultsDisplay =null;private DataSet m_dataset;
    public MapIdentify()
    {
       }
    public MapIdentify(Map map)
    {
        if (map !=null)
        {
            m_map = map;
               //生成客户端调用方法
            SetupIdentify();
        }
    }
    public MapIdentify(Map map, string filePath)
    {
        m_map = map;
        m_filePath = filePath;
        //生成客户端调用方法
        SetupIdentify();
    }
    //生成客户端调用方法
public void SetupIdentify()
{
    //获取Map控件所在的页面
    m_page = m_map.Page;
    System.Text.StringBuilder sb =new System.Text.StringBuilder();
    //生产客户端的脚本段
    m_callbackInvocation = m_page.ClientScript.GetCallbackEventReference(m_page, "message", "processCallbackResult", "context", true);
    //引用display_mapidentify.js的文件
    sb.Append("/n<script language=/"javascript/" type=/"text/javascript/" src=/"" + m_filePath + "JavaScript/display_mapidentify.js/" ></script>/n");
    //
    sb.Append("<script language=/"javascript/" type=/"text/javascript/">var identifyCallbackFunctionString = /"" + m_callbackInvocation + "/";</script>/n");
    //把sb的脚本注册到页面中
    if (!m_page.ClientScript.IsClientScriptBlockRegistered("IdentifyScript"))
    {
        m_page.ClientScript.RegisterClientScriptBlock(m_page.GetType(), "IdentifyScript", sb.ToString());
    }
}
    //具体的功能实现方法
public string Identify(NameValueCollection queryString)
{
    //x,y的坐标
    string xString = queryString["minx"];
    string yString = queryString["miny"];
    string locXString ="";
    string locYString ="";
    int x = Convert.ToInt32(xString);
    int y = Convert.ToInt32(yString);
    IGISResource resource;
    IQueryFunctionality query;
    //像素坐标转换成地理坐标
    ESRI.ArcGIS.ADF.Web.Geometry.Point mapPoint = ESRI.ArcGIS.ADF.Web.Geometry.Point.ToMapPoint(x, y, m_map.GetTransformationParams(ESRI.ArcGIS.ADF.Web.Geometry.TransformationDirection.ToMap));
    List<DataSet> gdsList =new List<DataSet>();
    foreach (IMapFunctionality mapFunc in m_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;
        DataTable[] ds =null;
        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);
                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);
        }
    }
    for (int i = gdsList.Count -1; i >=0; i--)
    {
        //用TaskResults进行查询内容显示
        m_resultsDisplay.DisplayResults(null, null, null, gdsList);
    }
    //没有查询到结果
    if (gdsList.Count ==0)
    {
        string heading ="Location ("+ locXString +", "+ locYString +") No results found";
        string detail ="No results found";
        SimpleTaskResult str =new SimpleTaskResult(heading, detail);
        m_resultsDisplay.DisplayResults(null, null, null, str);
    }
    //返回结果
return m_resultsDisplay.CallbackResults.ToString();
}
    public Map Map
    {
        get
        { return m_map; }
        set
        { m_map = value; }
    }
    public Page Page
    {
        get
        { return m_page; }
        set
        { m_page = value; }
    }
    public DataSet DataSet
    {
        get
        { return m_dataset; }
        set
        { m_dataset = value; }
    }
    public IdentifyOption IdentifyOption
    {
        get
        { return m_idOption; }
        set
        { m_idOption = value; }
    }
    public string ClientCallbackInvocation
    {
        get
        { return m_callbackInvocation; }
        set
        { m_callbackInvocation = value; }
    }
    public string FilePath
    {
        get
        { return m_filePath; }
        set
        { m_filePath = value; }
    }
    public TaskResults ResultsDisplay
    {
        get
        { return m_resultsDisplay; }
        set
        { m_resultsDisplay = value; }
    }
    public int NumberDecimals
    {
        get
        { return m_numberDecimals; }
        set
        { m_numberDecimals = value; }
    }
}
}

 

3.在页面上新增TaskResults控件用来显示查询内容ID为TaskResults1,接着在Page_Load事件里添加实例化上面的MapIdentify类具体代码和说明如下:

复制内容到剪贴板
代码:
//实例化MapIdentify,并且把Map1控件作为参数
MapIdentify identify =new MapIdentify(Map1);
//显示查询结果的控件
identify.ResultsDisplay = TaskResults1;
//小数位数
identify.NumberDecimals =4;

 



4.接着还需要对RaiseCallbackEvent方法进行修改添加对查询结果处理的代码,具体代码和说明如下:


复制内容到剪贴板
代码:
//对客户端的请求进行处理
public virtual string RaiseCallbackEvent(string responseString)
{
    //对请求字符串进行分割以键值的形式放到NameValueCollection m_queryString中,方便接下来的使用
    Array keyValuePairs = responseString.Split("&".ToCharArray())
    NameValueCollection m_queryString =new NameValueCollection();
    string[] keyValue;
    string response ="";
    if (keyValuePairs.Length >0)
    {
        for (int i =0; i < keyValuePairs.Length; i++)
        {
            keyValue = keyValuePairs.GetValue(i).ToString().Split("=".ToCharArray());
            m_queryString.Add(keyValue[0], keyValue[1]);
        }
    }
    else
    {
        keyValue = responseString.Split("=".ToCharArray());
        if (keyValue.Length >0)
        {
            m_queryString.Add(keyValue[0], keyValue[1]);
        }
    }
    //请求字符串样例:ControlID=Map1&ControlType=Map&EventArg=CloseOutApplication,这样就可以很容易理解了
    string controlType = m_queryString["ControlType"];
    string eventArg = m_queryString["EventArg"];
    if (controlType ==null)
    {
        controlType ="Map";
    }
    //根据controlType的不同对请求做不同的处理
    switch (controlType)
    {
        case "Map":
            if (eventArg =="CloseOutApplication")//关闭页面请求-CloseOut()
            {
                //ServerContext对象,需要 ESRI.ArcGIS.Server;
                IServerContext context;
                for (int i =0; i < Session.Count; i++)                 
                {
                    //清除session
                    context = Session as IServerContext;
                    if (context !=null)                            {
                        context.RemoveAll();
                        context.ReleaseContext();
                    }
                    Session.RemoveAll();
                    //从webconfig中获取关闭后的页面地址
                    response = ConfigurationManager.AppSettings["CloseOutUrl"];  
                    if (response ==null|| response.Length ==0)
                    {
                        response ="ApplicationClosed.aspx";
                    }
                }
            }
               else if (eventArg =="GetCopyrightText")
                   //显示版权-webMapAppGetCopyrightText()
               {
                   System.Text.StringBuilder sb =new System.Text.StringBuilder();
                   //webMapAppGetCopyrightText()请求服务器后返回结果由processCallbackResult进行客户端处理
                   //关于processCallbackResult方法的参数格式 控件类型:::控件ID:::内容类型:::内容,如div:::mydiv:::content:::你好,GIS!
                   sb.AppendFormat("///:::{0}:::innercontent:::", "CopyrightTextContents");
                   int sbLength = sb.Length;
                   //获取版权内容
                   sb.Append(GetCopyrightText());
                   if (sb.Length == sbLength)
                   {
                       //没有获取,显示为没有版权
                       sb.Append("No Copyright information available.");
                   }
                   response = sb.ToString();
               }
            else if (eventArg =="MapIdentify")
                //当eventArg == "MapIdentify"是调用identify类的方法进行处理并且返回内容
            {
                if (identify !=null)
                {
                    identify.Map = Map1;
                    response = identify.Identify(m_queryString);
                }
            }
            break;
        default:
            break;
    }
    //输出给客户端的内容
    return response;
}

 






5.还需要编写客户端的脚本MapIdentify('Map1');响应MapIdentify工具的操作,在javascript目录中新增display_mapidentify.js文件,至于页面对这个文件的引用在前面的MapIdentify类的SetupIdentify()方法已经添加的对这个文件的引用,具体的代码和说明如下:

复制内容到剪贴板
代码:
//路径
    var identifyFilePath ="";
    var identifyImageType ="png";
    //Tool MapIdentify的ClientAction
    function MapIdentify(divid)
    {
        //获取地图控件
        map = Maps[divid];
        //esri的方法,把工具条状态切换到MapIdentify的状态
        MapPoint(map.controlName, "MapIdentify", false);

        //设置在地图上按下鼠标后的事件为MapIdClick
        map.divObject.onmousedown = MapIdClick;
    }
//鼠标在地图上按下鼠标后触发的事件
function MapIdClick(e)
{
    //鼠标指针显示
    map.cursor = map.divObject.style.cursor;
    //map.divObject.style.cursor = "wait";
    getXY(e);
    //esri的方法,获取地图控件容器的坐标位置
    var box = calcElementPosition(map.containerDivId);
    //鼠标相对与地图控件的x坐标
    zleft = mouseX - box.left;
    //鼠标相对与地图控件的y坐标
    ztop = mouseY - box.top;
    map.xMin=zleft;
    map.yMin=ztop;
    //查找IdentifyLocation元素
    var div = document.getElementById("IdentifyLocation");
    if (div==null) {
        //调用在地图上添加小图标方法
        addIdentifyLocation();
    }
   
    //查找页面上的TaskResults1控件
    var fpBody = document.getElementById("Results_TaskResults1");
    var html = fpBody.innerHTML;
    //进行载入时的信息提醒
    fpBody.innerHTML ="<div><img src='images/callbackActivityIndicator.gif' align='middle'/> 正在获取信息. . .</div>"+ html;
    //显示放置TaskResults1的Results控件
    showFloatingPanel('Results');
    pBody=document.getElementById('Results_BodyRow');
    //如果Results控件为关闭状态就切换到展可视状态
    if (fpBody.style.display=="none")
    {
        toggleFloatingPanelState('Results','images/collapse.gif','images/expand.gif');
    }
    //传递给服务器端的参数
    var message ="ControlID=Map1&ControlType=Map&EventArg=MapIdentify&Map1_mode=MapIdentify&minx="+ zleft +"&miny="+ ztop;
    var context = map.controlName;
   //用javascript的eval的方法执行identifyCallbackFunctionString字符串
    eval(map.identifyCallbackFunctionString);
    //考虑小图标的高和宽,一遍小图标的下尖点刚刚在点击的位置上
    var div = document.getElementById("IdentifyLocation");
    var cWidth = Math.floor(div.clientWidth /2);
    var cHeight = div.clientHeight;
    if (cWidth==0) cWidth =12;
    if (cHeight==0) cHeight =29;
    var idLeft = zleft - parseInt(map.divObject.style.left) - cWidth;
    var idTop = ztop - parseInt(map.divObject.style.top) - cHeight +2;
    //移动IdentifyLocation的位置,并且显示IdentifyLocation
    window.setTimeout('moveLayer("IdentifyLocation", '+ idLeft +', '+ idTop +'); showLayer("IdentifyLocation");', 0);
    map.mode = map.tempMode;
    map.actionType = map.tempAction;
    map.cursor = map.tempCursor;
    return false;
}
//在地图上添加小图标
    function addIdentifyLocation()
    {
        var content ='<div id="IdentifyLocation" style="position: absolute; left: 0px; top: 0px; visibility: hidden;">';
       //根据浏览器的不同进行相应的处理
        if (isIE  && ieVersion <7&& (identifyImageType.toLowerCase()=="png"))
        {
            content +='<img src="'+ identifyFilePath +'images/blank.gif" alt="" border="0"  hspace="0" vspace="0" style="filter:  progidXImageTransform.Microsoft.AlphaImageLoader(src=/'' + identifyFilePath + 'images/identify-map-icon.png/');" />/n';
        }  
        else
        {
            content += '<img src="' + identifyFilePath + 'images/identify-map-icon.png" alt="" border="0"  hspace="0" vspace="0"/>/n';
        }        
   content +='</div>';
    //把包含小图标的div添加到地图之上
    map.overlayObject.insertAdjacentHTML("BeforeEnd", content);
    }


6.到此为止完成了Identify功能的开发,调试运行查看效果。剩下的下一篇继续写。

这篇关于ArcGIS.Server.9.2.DotNet自带例子分析(一、三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/838559

相关文章

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

【软考】希尔排序算法分析

目录 1. c代码2. 运行截图3. 运行解析 1. c代码 #include <stdio.h>#include <stdlib.h> void shellSort(int data[], int n){// 划分的数组,例如8个数则为[4, 2, 1]int *delta;int k;// i控制delta的轮次int i;// 临时变量,换值int temp;in

三相直流无刷电机(BLDC)控制算法实现:BLDC有感启动算法思路分析

一枚从事路径规划算法、运动控制算法、BLDC/FOC电机控制算法、工控、物联网工程师,爱吃土豆。如有需要技术交流或者需要方案帮助、需求:以下为联系方式—V 方案1:通过霍尔传感器IO中断触发换相 1.1 整体执行思路 霍尔传感器U、V、W三相通过IO+EXIT中断的方式进行霍尔传感器数据的读取。将IO口配置为上升沿+下降沿中断触发的方式。当霍尔传感器信号发生发生信号的变化就会触发中断在中断

kubelet组件的启动流程源码分析

概述 摘要: 本文将总结kubelet的作用以及原理,在有一定基础认识的前提下,通过阅读kubelet源码,对kubelet组件的启动流程进行分析。 正文 kubelet的作用 这里对kubelet的作用做一个简单总结。 节点管理 节点的注册 节点状态更新 容器管理(pod生命周期管理) 监听apiserver的容器事件 容器的创建、删除(CRI) 容器的网络的创建与删除

PostgreSQL核心功能特性与使用领域及场景分析

PostgreSQL有什么优点? 开源和免费 PostgreSQL是一个开源的数据库管理系统,可以免费使用和修改。这降低了企业的成本,并为开发者提供了一个活跃的社区和丰富的资源。 高度兼容 PostgreSQL支持多种操作系统(如Linux、Windows、macOS等)和编程语言(如C、C++、Java、Python、Ruby等),并提供了多种接口(如JDBC、ODBC、ADO.NET等

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据