• ArcGIS.Server.9.2.DotNet实现点、线、面的MapTips


    目的:
    1.arcgis server9.2 ADF实现实现点、线、面的MapTips。输入关键字查询出结果,然后给这些结果加上MapTips
    准备工作:
    0.参考multimaptips-en.rtf。
    1.用ArcGis Server Manager或者ArcCatalog发布一个叫usa的Map Service,并且把这个Service启动起来。
    注:要为这个usa的地图添加一个点层名为New_Shapefile,因为maptips控件必须初始设置Layer属性不然会报错,这个控件真是问题多多了。
    完成后的效果图:


    开始:
    1.新建名为myMapTips的ASP.NET Web应用程序,在页面上添加MapResourceManager1、Map1、MapTips1控件、Text1的input(输入查询关键字用)、Button1的input(搜索按钮)。
    2.设置MapResourceManager1的属性,这里需要2个MapResourceItem,由上到下分别为maptips、usa。maptips的DataSourceType:GraphicsLayer;usa的DataSourceType:ArcGIS Server Local,就是连接上面发布的usa的Map Service。
    3.设置MapTips1控件属性,map="Map1" BodyFormatString="{Id}" HeaderFormatString="{Id}" Layer="MapResourceManager1::usa::New_Shapefile" WhereClause="2>1"  上面的这些属性必须设置不然会报错了,这个控件设计的真是怪,还有一点了要在程序里动态设置MapTips1控件属性并且刷新必须设置 ShowOnlyWhenLayerIsVisible="False"不然也会报错。
    4.Button1的input(搜索按钮),添加onclick事件:search(),其他的控件也做好相应的设置。
    5.接下开始代码编写,首先实现ICallbackEventHandler接口,实现GetCallbackResult()和RaiseCallbackEvent(string eventArgument)两方法,具体代码如下:

     1public partial class TipsPage : System.Web.UI.Page, ICallbackEventHandler
     2    {
     3        public string m_Callback = "";
     4        protected void Page_Load(object sender, EventArgs e)
     5        {
     6            m_Callback = Page.ClientScript.GetCallbackEventReference(Page, "argument""processCallbackResult""context""processCallbackError"true);
     7        }

     8
     9        ICallbackEventHandler 成员
    23
    24        private string RaiseCallbackEvent(string _callbackArg)
    25        {
    26            return "";
    27        }
    6.切换到html视图编写search()的脚本方法,具体代码如下:
     1<script>
     2    //搜索事件
     3    function search()
     4    {
     5       var v=document.getElementById("Text1").value;
     6       var argument = "ControlID=Map1&ControlType=Map&Type=query&EventArg=" + v;
     7       var context = "Map";
     8       var rv=<%= m_Callback %>;
     9       eval(rv);
    10
    11    }

    12    
    13    function processCallbackError()
    14    {
    15       alert("错误啦!");
    16    }

    17    </script>
    7.添加上面的代码时必须注意这段代码不能放在head标签内,不然maptips控件会报“控件包含代码块(即 <% ... %>),因此无法修改控件集合”的错误。再次鄙视一下这个控件。
    8.接下来切换cs代码端处理search()的脚本方法发起的请求,具体在RaiseCallbackEvent(string _callbackArg)方法中进行请求处理并且把处理结果返回给客户端,具体代码和说明如下:
      1private string RaiseCallbackEvent(string _callbackArg)
      2        {
      3            CallbackResultCollection m_ADFCallbackResultCollection = new ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResultCollection();
      4            string v = "";
      5            NameValueCollection keyValColl = CallbackUtility.ParseStringIntoNameValueCollection(_callbackArg);
      6            if (keyValColl["Type"].ToString() == "query")
      7            {
      8                //查询结果数
      9                int featurecount = 0;
     10                //获取usa的MapFunctionality、Resource
     11                ESRI.ArcGIS.ADF.Web.UI.WebControls.Map map = (ESRI.ArcGIS.ADF.Web.UI.WebControls.Map)Map1;
     12                ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality mf = (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality)map.GetFunctionality("usa");
     13                ESRI.ArcGIS.ADF.Web.DataSources.IGISResource gr = mf.Resource;
     14                ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality qf;
     15                string[] lids;
     16                string[] lnames;
     17                //创建QueryFunctionality
     18                qf = (ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality)gr.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality), null);
     19                //查询图层id、名称
     20                qf.GetQueryableLayers(nullout lids, out lnames);
     21
     22                //获取maptips的MapFunctionality、Resource
     23                ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality mf_maptips = (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality)map.GetFunctionality("maptips");
     24                ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource gr_matips = (ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource)mf_maptips.Resource;
     25                //创建FeatureGraphicsLayer
     26                ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer gl_maptips = new ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer("maptips", ESRI.ArcGIS.ADF.Web.FeatureType.Point, new ESRI.ArcGIS.ADF.Web.Display.Renderer.SimpleRenderer(ESRI.ArcGIS.ADF.Web.FeatureType.Point, System.Drawing.Color.Red));
     27
     28                //给新建的FeatureGraphicsLayer添加字段
     29                gl_maptips.Columns.Add("peid"typeof(Int32));
     30                gl_maptips.Columns.Add("objectid"typeof(Int32));
     31                gl_maptips.Columns.Add("name"typeof(string));
     32                gr_matips.Graphics.Tables.Clear();
     33
     34                IMapFunctionality pMapfun;
     35                DataTable dt4 = null;
     36                ESRI.ArcGIS.ADF.Web.SpatialFilter sfilter = new ESRI.ArcGIS.ADF.Web.SpatialFilter();
     37                //获取查询关键字
     38                string Input = keyValColl["EventArg"];
     39                for (int i = 0; i < lids.Length; i++)
     40                {
     41                    //设置过滤条件
     42                    sfilter.ReturnADFGeometries = true;
     43                    sfilter.MaxRecords = 100;
     44                    sfilter.Geometry = null;
     45                    sfilter.WhereClause = "NAME LIKE '" + Input + "%'";
     46                    //查询并且把结果放在dt4中
     47                    dt4 = qf.Query(null, lids[i], sfilter);
     48                    if (dt4 != null)
     49                    {
     50                        //累加查询到的结果数
     51                        featurecount += dt4.Rows.Count;
     52
     53                        //对查询到结果进行遍历,更加不同的类型在FeatureGraphicsLayer中生成显示点
     54                        foreach (DataRow dr in dt4.Rows)
     55                        {
     56                            int objectid = Int32.Parse(dr["objectid"].ToString());
     57                            int layerid = Int32.Parse(lids[i]);
     58                            pMapfun = mf;
     59                            if (pMapfun.Resource is ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceLocal)
     60                            {
     61                                ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceLocal pLocal = pMapfun.Resource as ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceLocal;
     62                                ESRI.ArcGIS.Carto.IMapServer pMapServer = (ESRI.ArcGIS.Carto.IMapServer)pLocal.MapServer;
     63                                //获取Objects
     64                                ESRI.ArcGIS.Carto.IMapServerObjects pMapServerObjects = pMapServer as ESRI.ArcGIS.Carto.IMapServerObjects;
     65                                //用Objects的方法获取FeatureLayer
     66                                ESRI.ArcGIS.Carto.IFeatureLayer pFLayer = pMapServerObjects.get_Layer(pMapServer.get_MapName(0), layerid) as ESRI.ArcGIS.Carto.IFeatureLayer;
     67                                ESRI.ArcGIS.Geodatabase.IFeatureClass pFClass = pFLayer.FeatureClass;
     68                                //根据objectid获取Feature
     69                                ESRI.ArcGIS.Geodatabase.IFeature pFeature = pFClass.GetFeature(objectid);
     70                                //获取Geometry
     71                                ESRI.ArcGIS.Geometry.IGeometry pGeometry = pFeature.Shape;
     72                                //查询结果为点的时候
     73                                if (pGeometry.GeometryType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint)
     74                                {
     75                                    //新建点并且添加到FeatureGraphicsLayer
     76                                    IPoint ippoint = pGeometry as IPoint;
     77                                    ESRI.ArcGIS.ADF.Web.Geometry.Point adfpt = ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.Converter.FromIPoint(ippoint);
     78                                    DataRow dtr = gl_maptips.Add(adfpt);
     79                                    //添加属性值
     80                                    try
     81                                    {
     82                                        dtr["objectid"= objectid;
     83                                        dtr["peid"= dr["peid"];
     84                                        dtr["name"= dr["name"];
     85                                    }

     86                                    catch
     87                                    {
     88                                        dtr["objectid"= objectid;
     89                                        dtr["peid"= 0;
     90                                        dtr["name"= dr["name"];
     91                                    }

     92                                }

     93                                //查询结果为线的时候
     94                                if (pGeometry.GeometryType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline)
     95                                {
     96                                    IPolyline ippolyline = pGeometry as IPolyline;
     97                                    ESRI.ArcGIS.Geometry.IPointCollection com_pointcollection = (ESRI.ArcGIS.Geometry.IPointCollection)ippolyline;
     98                                    ESRI.ArcGIS.ADF.Web.Geometry.Point[] new_adf_points = ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.Converter.FromIPointCollection(com_pointcollection);
     99                                    ESRI.ArcGIS.ADF.Web.Geometry.Point adfpt = new ESRI.ArcGIS.ADF.Web.Geometry.Point();
    100                                    //获取线的中间一个点
    101                                    adfpt = new_adf_points[new_adf_points.Length / 2];
    102                                    DataRow dtr = gl_maptips.Add(adfpt);
    103                                    try
    104                                    {
    105                                        dtr["objectid"= objectid;
    106                                        dtr["peid"= dr["peid"];
    107                                        dtr["name"= dr["name"];
    108                                    }

    109                                    catch
    110                                    {
    111                                        dtr["objectid"= objectid;
    112                                        dtr["peid"= 0;
    113                                        dtr["name"= dr["name"];
    114                                    }

    115
    116                                }

    117                                //查询结果为面的时候
    118                                if (pGeometry.GeometryType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon)
    119                                {
    120                                    IPolygon ippolygon = pGeometry as IPolygon;
    121                                    //面曲线的开始点
    122                                    ESRI.ArcGIS.Geometry.IPoint ippoint = ippolygon.FromPoint;
    123                                    ESRI.ArcGIS.ADF.Web.Geometry.Point adfpt = ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.Converter.FromIPoint(ippoint);
    124                                    DataRow dtr = gl_maptips.Add(adfpt);
    125                                    try
    126                                    {
    127                                        dtr["objectid"= objectid;
    128                                        dtr["peid"= dr["peid"];
    129                                        dtr["name"= dr["NAME"];
    130                                    }

    131                                    catch
    132                                    {
    133                                        dtr["objectid"= objectid;
    134                                        dtr["peid"= 0;
    135                                        dtr["name"= dr["NAME"];
    136                                    }

    137
    138                                }

    139                            }
    //end if
    140                        }
    //end foreach
    141                    }

    142                    
    143                }
    // end for
    144                //把FeatureGraphicsLayer添加到maptips
    145                gr_matips.Graphics.Tables.Add(gl_maptips);
    146                if (featurecount > 0)
    147                {
    148                    //设置地图视图范围
    149                    ESRI.ArcGIS.ADF.Web.Geometry.Geometry geom;
    150                    ESRI.ArcGIS.ADF.Web.Geometry.Envelope env = new ESRI.ArcGIS.ADF.Web.Geometry.Envelope(double.MaxValue, double.MaxValue, double.MinValue, double.MinValue);
    151                    foreach (DataRow row in gl_maptips.Rows)
    152                    {
    153                        geom = gl_maptips.GeometryFromRow(row);
    154                        env.Union(geom);
    155                    }

    156                    int percent = 20;
    157                    double newwidth, newheight;
    158                    newwidth = map.GetFullExtent().Width * (percent / 100);
    159                    newheight = map.GetFullExtent().Height * (percent / 100);
    160                    env.XMin -= newwidth;
    161                    env.XMax += newwidth;
    162                    env.YMin -= newheight;
    163                    env.YMax += newheight;
    164                    map.Extent = env;
    165
    166                    //设置MapTips1的属性
    167                    MapTips1.FeatureLimit = 20;
    168                    MapTips1.Layer = "MapResourceManager1::maptips::maptips";
    169                    MapResourceManager mr = MapResourceManager1;
    170                    MapTips1.HeaderFormatString = "{objectid}";
    171                    MapTips1.BodyFormatString = "{name}";
    172                    MapTips1.Features = null;
    173                    MapTips1.WhereClause = "2>1";
    174                    MapTips1.Map = map.ClientID;
    175                    //刷新MapTips1
    176                    MapTips1.Refresh();
    177                    
    178                    m_ADFCallbackResultCollection.Add(MapTips1.CallbackResults[0]);
    179                    m_ADFCallbackResultCollection.Add(Map1.CallbackResults[0]);
    180                }

    181            }

    182
    183            return m_ADFCallbackResultCollection.ToString();
    184        }
    9.这样完成了代码编写,可以运行测试查看效果。
  • 相关阅读:
    【尺取法】
    [USACO12MAR]花盆Flowerpot [单调队列]
    数据库笔记
    NYOJ 91 阶乘之和(贪心)
    NYOJ 71 独木舟上的旅行(贪心)
    水池数目(DFS)
    poj 1164城堡问题(DFS)
    NYOJ 12 喷水装置(二)( 贪心)
    NYOJ 6(贪心)
    NYOJ 45( 分治,大数)
  • 原文地址:https://www.cnblogs.com/hll2008/p/1289697.html
Copyright © 2020-2023  润新知