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.这样完成了代码编写,可以运行测试查看效果。
posted @ 2008-09-12 11:55  水的右边  阅读(5174)  评论(18编辑  收藏  举报