|
阅读:1210回复:0
ArcGIS Server标注功能
<br>饮食场所地图标注服务功能,即当客户端人员进行属性查询或者空间查询后,如果想进一步获取更加详细的信息,则点击电子地图中其位置图标,则页面将显
示企业的具体信息,如特色菜、详细介绍等。还可以通过移动、放大、缩小查看该饮食场所的周边信息。系统的后续工作还将进一步扩展此项相关功能,如到达该地 点的公交线路等。图1为系统界面图。</p> <p> <a href="http://www.cnblogs.com/images/cnblogs_com/chinazhousheng/WindowsLiveWriter/ArcGISServer_13DF3/DD6644C465AE%7D_2.jpg" target="_blank" ><img alt="DD6644C465AE}" src="http://www.cnblogs.com/images/cnblogs_com/chinazhousheng/WindowsLiveWriter/ArcGISServer_13DF3/DD6644C465AE%7D_thumb.jpg" border="0" width="372" height="372"></a> <br> <图1><br> 图中彩色块体为目标点击物,左键点击后,系统界面的右边将出现其详细信息。如图2</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/chinazhousheng/WindowsLiveWriter/ArcGISServer_13DF3/2_2.jpg" target="_blank" ><img alt="2" src="http://www.cnblogs.com/images/cnblogs_com/chinazhousheng/WindowsLiveWriter/ArcGISServer_13DF3/2_thumb.jpg" border="0" width="471" height="312"></a> </p> <p> <图2><br> 实现原理为: <br> (1)在工具栏中加入一个工具按钮。</p> <p> (2)服务器代码方面,首先查找要查询的图层,并将当前点转化成MapPoint</p> <p> (3)关键在于使用以上条件,并采用方法IQueryFunctionality.Identify获取到数据集</p> (4)适当处理,将信息显示在页面上。<br> 整个例子采用Ajax效果,达到无刷新效果,虽然没有Google的酷,但我相信,大家处理一下,采用层的显示是完全可以达到它的效果的.<br><br>using System.Drawing;<br>using System.Collections;<br>using System.Collections.Generic;<br>using ESRI.ArcGIS;<br>using ESRI.ArcGIS.ADF.Web;<br>using ESRI.ArcGIS.ADF.Web.DataSources;<br>using ESRI.ArcGIS.ADF.Web.Display.Graphics;<br>using ESRI.ArcGIS.ADF.Web.UI.WebControls;<br>using ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools;<br>using System.Data;<br>using System;<br>using System.Web.UI.WebControls;<br>using System.Web.UI;<br><br><br>using ESRI.ArcGIS.ADF.Web.UI.WebControls;<br><br><br>using ESRI.ArcGIS.ADF.Web;<br>using ESRI.ArcGIS.ADF;<br><br>using ESRI.ArcGIS.ADF.Web.DataSources;<br>using ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer;<br>using ESRI.ArcGIS.ADF.Web.DataSources.Graphics;<br>using ESRI.ArcGIS.ADF.ArcGISServer;<br><br><br>using ESRI.ArcGIS.Geometry;<br>using ESRI.ArcGIS.Server;<br>using ESRI.ArcGIS.Geodatabase;<br><br>using ESRI.ArcGIS.ADF.Connection;<br><br>/**//// <summary><br>/// MapIdentify 的摘要说明<br>/// </summary><br>public class MapIdentify :IMapServerToolAction<br>{<br> public MapIdentify()<br> {<br> //<br> // TOD 在此处添加构造函数逻辑<br> //<br> }<br><br> IMapServerToolAction 成员#region IMapServerToolAction 成员<br><br> public DataRow minus_row;<br><br> public void ServerAction(ToolEventArgs args)<br> {<br> Map mapctrl = null;<br> mapctrl = (Map)args.Control;<br><br> IEnumerable func_enum = null;<br> func_enum =mapctrl.GetFunctionalities();<br><br> System.Data.DataTable datatable = null;<br> PointN txt_Point = new PointN();<br><br><br> //<br> string name_eat = "null";<br> <br><br> foreach (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality gisfunctionality in func_enum)<br> {<br> <br><br> //对特定的数据库图层进行查询<br> if (gisfunctionality.Resource.Name == "CsMap")<br> {<br> ESRI.ArcGIS.ADF.Web.DataSources.IMapResource gResource;<br> gResource = (ESRI.ArcGIS.ADF.Web.DataSources.IMapResource)gisfunctionality.Resource;<br><br><br><br> bool supported = false;<br> ESRI.ArcGIS.ADF.Web.DataSources.IGISResource gisresource = null;<br> gisresource = gisfunctionality.Resource;<br> supported = gisresource.SupportsFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality));<br><br> //如果支持<br> if (supported)<br> {<br> ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality qfunc;<br> qfunc = (ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality)gisresource.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality), null);<br><br> string[] lids;<br> string[] lnames;<br><br> qfunc.GetQueryableLayers(null, out lids, out lnames);<br><br><br> //获取屏幕点<br> ESRI.ArcGIS.ADF.Web.Geometry.Point pnt = new ESRI.ArcGIS.ADF.Web.Geometry.Point() ;<br> ESRI.ArcGIS.ADF.Web.UI.WebControls.PointEventArgs ptargs = null;<br> ptargs = (PointEventArgs)args;<br> <br><br> pnt= ESRI.ArcGIS.ADF.Web.Geometry.Point.ToMapPoint(ptargs.ScreenPoint.X,ptargs.ScreenPoint.Y, mapctrl.Extent, (int)mapctrl.Width.Value, (int)mapctrl.Height.Value);<br> <br><br><br> System.Data.DataTable[] qdatatables = qfunc.Identify(null, pnt, 1, ESRI.ArcGIS.ADF.Web.IdentifyOption.AllLayers, lids);<br><br> //将指点的图层的表格数据赋给表<br> datatable = qdatatables[3];//为饮食所在图层<br> double pnt_xy = pnt.X + pnt.Y;<br> double minus_xy = 0;<br> double add_xy;<br> <br> int first_row=0; //判断是否是第一行,为0为第一行;为1表示为其他行;<br><br><br> 获取点的坐标#region 获取点的坐标<br> DataRowCollection drs = datatable.Rows;<br><br> int shpind = -1;<br> for (int i = 0; i < datatable.Columns.Count; i++)<br> {<br> if (datatable.Columns.DataType == typeof(ESRI.ArcGIS.ADF.Web.Geometry.Geometry))<br> {<br> shpind = i;<br> break;<br> }<br> }<br><br> try<br> {<br> foreach (DataRow dr in drs)<br> {<br> //ESRI.ArcGIS.ADF.Web.Geometry.Multipoint geom = (ESRI.ArcGIS.ADF.Web.Geometry.Multipoint)dr[shpind];<br> //ESRI.ArcGIS.ADF.Web.Geometry.PointCollection pointcol = geom.Points;<br> //txt_Point.X = pointcol[0].X;<br> //txt_Point.Y = pointcol[0].Y;<br> ESRI.ArcGIS.ADF.Web.Geometry.Point geom = (ESRI.ArcGIS.ADF.Web.Geometry.Point)dr[shpind];<br> //add_xy=pointcol[0].X+pointcol[0].Y;<br> add_xy = geom.X + geom.Y;<br><br> if(first_row==0)<br> {<br> minus_xy = System.Math.Abs(add_xy-pnt_xy);<br> minus_row = dr;<br> first_row = 1;<br> name_eat = minus_row["餐饮店名称"].ToString();<br> <br> }<br> else if(System.Math.Abs(pnt_xy-add_xy)<minus_xy)<br> {<br> minus_xy = System.Math.Abs(pnt_xy - add_xy);<br> minus_row = dr;<br> name_eat = minus_row["餐饮店名称"].ToString();<br><br> }<br><br> <br><br> }<br> }<br> catch (Exception q)<br> {<br> }<br><br> #endregion<br><br><br> if (gResource == null)<br> return;<br><br> //<br> <br> // GridView gdview = (GridView)mapctrl.Page.FindControl("GridView1");<br> //TextBox txt_name = (TextBox)mapctrl.Page.FindControl("FloatingPanel9$Txt_Name");<br> <br> //设置图片<br> System.Web.UI.WebControls.Image Image1 = (System.Web.UI.WebControls.Image)mapctrl.Page.FindControl("Image1");<br> //Image1.ImageUrl = "~/Img/images_sk.jpg";//huogongdian<br> Image1.ImageUrl = "~/Img/huogongdian.jpg";<br> Image1.Visible = true;<br><br> //设置label<br><br> Label eat_name = (Label)mapctrl.Page.FindControl("eat_name");<br> eat_name.Text = "<br/><br/>;nbsp;;nbsp;;nbsp;;nbsp;餐饮名称:" + name_eat + "<br/>";<br> eat_name.Visible = true;<br> //<br> Label eat_cai = (Label)mapctrl.Page.FindControl("eat_cai");<br> eat_cai.Text = "<br/>;nbsp;;nbsp;;nbsp;;nbsp;特色菜系:" + minus_row["特色菜"].ToString() + "<br/>";<br> //<br> Label eat_demo = (Label)mapctrl.Page.FindControl("eat_demo");<br> eat_demo.Text = "<br/>;nbsp;;nbsp;;nbsp;;nbsp;详细介绍:" + minus_row["详细介绍"].ToString() + "<br/>"; <br> //<br><br> Label eat_tel = (Label)mapctrl.Page.FindControl("eat_tel");<br> eat_tel.Text = "<br/>;nbsp;;nbsp;;nbsp;;nbsp;订餐热线:" + minus_row["订餐热线"].ToString() + "<br/>";<br><br> Label eat_recom = (Label)mapctrl.Page.FindControl("eat_recom");<br> eat_recom.Text = "<br/>;nbsp;;nbsp;;nbsp;;nbsp;推荐指数:" + minus_row["推荐数"].ToString() + "<br/>"; <br><br> <br> object[] oa = new object[1];<br> string showtable = "'visible'";<br> <br> //设置数据源<br> // gdview.DataSource = datatable;<br> //gdview.DataBind();<br> // txt_name.Text = datatable.Rows[0]["NAME"].ToString();<br> // txt_name.Visible = true;<br> string returnstring = null;<br><br> using (System.IO.StringWriter sw = new System.IO.StringWriter())<br> {<br> HtmlTextWriter htw = new HtmlTextWriter(sw);<br> // txt_name.RenderControl(htw);<br> // gdview.RenderControl(htw);<br> Image1.RenderControl(htw);<br> eat_name.RenderControl(htw);<br> eat_cai.RenderControl(htw);<br> <br> eat_tel.RenderControl(htw);<br> eat_demo.RenderControl(htw);<br><br> htw.Flush();<br> returnstring = sw.ToString();<br> }<br><br> CallbackResult cr = new CallbackResult("div", "identify", "innercontent", returnstring);<br> mapctrl.CallbackResults.Add(cr);<br> CallbackResult cr1 = new CallbackResult("div", "img_div", "innercontent", returnstring);<br> mapctrl.CallbackResults.Add(cr1);<br> CallbackResult cr2 = new CallbackResult("div", "img_lab", "innercontent", returnstring);<br> mapctrl.CallbackResults.Add(cr2);<br><br> if (datatable.Rows.Count > 0)<br> {<br> showtable = "'visible'";<br> <br> }<br> else<br> {<br> showtable = "'hidden'";<br> }<br><br> // 设置griddiv是否显示<br> string sa = "var griddiv = document.getElementById('identify');";<br> sa += "griddiv.style.visibility = " + showtable + ";";<br> oa[0] = sa;<br><br> CallbackResult cr4 = new CallbackResult(null, null, "javascript", oa);<br> mapctrl.CallbackResults.Add(cr1);<br><br> if (mapctrl.ImageBlendingMode == ImageBlendingMode.WebTier)<br> {<br> mapctrl.Refresh();<br> }<br> else if (mapctrl.ImageBlendingMode == ImageBlendingMode.Browser)<br> {<br> mapctrl.RefreshResource(gResource.Name);<br> }<br> <br> }<br> }<br> }<br><br><br> <br><br> }<br> #endregion<br>}<br><br> |
|
|