GIS开发随笔(4)——使用MapNet控件和DataGrid实现图层数据互相查询

本文介绍如何使用MapNet控件实现在地图上点击查询图层属性,并通过获取的GIS_ID关联数据库信息,以及如何在点击数据网格时在地图上显示对应元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  从本随笔的标题中不难看出是为了实现显示图层属性的,而且可以获取图层与数据库关联的ID来从数据库中找到相应的附属信息。要实现此功能当然是先从数据库入手了,为此我们来建立几张数据库的表;其次是使用MapNet控件为我们提供的某些接口来实现这些功能。 
     建议大家先看看MapNet控件的程序员编程指南的帮助: http://www.studioat.it/StudioAT/Help/MapNet/MapNetWebHelp.htm 相信对您会有帮助的。现在我们讨论一下今天的主要问题,其实这个问题我已经在 GIS开发随笔(3)——ArcXML和NET_Link方法 中探讨有相关的代码,下面我们再把此代码粘贴出来和大家一起分享和研究。
1、点击MapNet控件查询数据的代码如下:
 1 using  System;
 2 using  System.Collections;
 3 using  System.ComponentModel;
 4 using  System.Data;
 5 using  System.Drawing;
 6 using  System.Web;
 7 using  System.Web.SessionState;
 8 using  System.Web.UI;
 9 using  System.Web.UI.WebControls;
10 using  System.Web.UI.HtmlControls;
11 using  System.Xml;
12 using  StudioAT.IMS;
13 using  StudioAT;
14
15 ……
16
17 /**/ /// <summary>
18/// 单击地图时显示相关的属性信息和坐标信息
19/// </summary>
20/// <param name="rct">点的大小范围信息</param>

21 private   void  MapNet1_Click(StudioAT.IRect rct)
22          {
23            IMapNet myMapNet = this.MapNet1;
24            XmlElement myXmlEle = null;
25            XmlDocument myXmlDoc = (XmlDocument)ArcXML.BuildRequest(ArcXML.enuRequest.GET_FEATURES, ref myXmlEle);
26            myXmlEle.SetAttribute(ArcXML.AttributeOutputmode,"newxml");
27            myXmlEle.SetAttribute(ArcXML.AttributeGeometry, "true");
28            myXmlEle.SetAttribute(ArcXML.AttributeEnvelope, "true");
29            myXmlEle.SetAttribute(ArcXML.AttributeCompact, "true");
30            XmlElement xmlELayer = myXmlDoc.CreateElement(ArcXML.NodeLayer);
31            xmlELayer.SetAttribute(ArcXML.AttributeId, this.DDL_Layer.SelectedValue);
32            myXmlEle.AppendChild(xmlELayer);
33            XmlElement xmlESQ = myXmlDoc.CreateElement(ArcXML.NodeSpatialquery);
34            xmlELayer.SetAttribute(ArcXML.AttributeId, this.DDL_Layer.SelectedValue);
35            myXmlEle.AppendChild(xmlESQ);
36            XmlElement xmlESF = myXmlDoc.CreateElement(ArcXML.NodeSpatialfilter);
37            xmlESF.SetAttribute(ArcXML.AttributeRelation, "area_intersection");
38            xmlESQ.AppendChild(xmlESF);
39            XmlElement xmlEEnv = (XmlElement)ArcXML.CreateExtent(ref myXmlDoc,rct);
40            xmlESF.AppendChild(xmlEEnv);
41            string strResponse = myMapNet.RequestArcXML(myXmlDoc.InnerXml, ArcXML.enuCustomService.Query);
42            myXmlDoc = new XmlDocument();
43            myXmlDoc.LoadXml(strResponse);
44            if(myXmlDoc.GetElementsByTagName("FIELD").Count > 2)
45            {
46                this.TB_BZ.Text = myXmlDoc.InnerXml;
47            }

48        }

49
50 ……
此时我们可以通过查找myXmlDoc.GetElementsByTagName中遍历不同域名Name来获得Value中的值(因为我们在第26行中已经申明了一个newxml的对象,和申明xml对象所产生的返回值不同,具体内容请参考ArcXML的相关文档),如果你想让地图和后台数据库交互,那么你就必须让所有需要交互的图层中包含一个和数据库图层表中数据一一对应的外建关系,可以命名为GIS_ID或者其他有意义的并且唯一的字段,这里我们假设此处用的是GIS_ID。那么我们就可以将第46行的代码换成查询到的“GIS_ID”的值的代码,然后再通过从地图中获得的这个GIS_ID的值到数据库中相应的图层表中查询到该条记录,以便完成图层中元素附属属性的现实。当然需要知道的是在此项开始之前,一定要做到一个导入工作将地图中每个数据库文件表(这里我们用的是ArcGIS,所有图层都会有一个*.dbf的文件,可以用Excel打开来查看或修改里面的内容)数据导入到相应的数据库表中,GIS_ID是必须被导入的。
     这样我们就完成了地图的属性查询工作。 
2、点击DataGrid中的某条数据在MapNet中显示相应的元素,代码如下(其中的DataGrid是第三方控件):
 1 private   void  UWG_Result_DblClick( object  sender, Infragistics.WebUI.UltraWebGrid.ClickEventArgs e)
 2          {
 3            string GisID = e.Row.Cells[int.Parse(Session["GIS_IDindex"].ToString())].ToString().Trim();//获得点击数据的GisID值
 4            IMapNet myIMapNet = MapNet1;
 5            string SearchStr = String.Empty; 
 6            ICollectionLayers myICL = myIMapNet.CollectionLayers;
 7            IGetFeatures myIGF = null;
 8            ISimpleMarkerSymbol myISMS = new SimpleMarkerSymbolProperty();
 9            IMapNetAcetateObjects myIMNAO = (IMapNetAcetateObjects)myIMapNet;
10            myIMNAO.Clear();
11            IObjectAcetateLayer myIOAL;
12            IPoint myIP1;
13            try
14            {
15                ILayer myIL = (ILayer)myICL.FindById (Session["LayerID"].ToString());
16                ISpatialQuery2 myISQ2 = new SpatialQuery();
17                DataSet ds = myIL.Recordset(myISQ2, truefalse, myIGF);//根据图层读取数据
18                for (int k = 0; k < ds.Tables[0].Columns.Count; k++)
19                {
20                    switch (ds.Tables[0].Columns[k].ColumnName)
21                    {
22                        case "#ID#":
23                            ds.Tables[0].Columns[k].ColumnName = "序号";
24                            break;
25                        case "EnvelopeXMin":
26                            ds.Tables[0].Columns[k].ColumnName = "最小经度";
27                            break;
28                        case "EnvelopeXMax":
29                            ds.Tables[0].Columns[k].ColumnName = "最大经度";
30                            break;
31                        case "EnvelopeYMin":
32                            ds.Tables[0].Columns[k].ColumnName = "最小纬度";
33                            break;
34                        case "EnvelopeYMax":
35                            ds.Tables[0].Columns[k].ColumnName = "最大纬度";
36                            break;
37                        default:
38                            break;
39                    }

40                }

41                if(GisID != "" && GisID != null)
42                {
43                    string ColumnsName = "GIS_ID";
44                    SearchStr = ColumnsName + " Like '%" + GisID + "%'";
45                    DataRow[] drs  = ds.Tables[0].Select(SearchStr);
46                    if(drs.Length > 0)
47                    {
48                        double xMin = double.Parse(drs[0]["最小经度"].ToString());
49                        double xMax = double.Parse(drs[0]["最大经度"].ToString());
50                        double yMin = double.Parse(drs[0]["最小纬度"].ToString());
51                        double yMax = double.Parse(drs[0]["最大纬度"].ToString());
52                        if(xMin == xMax)
53                        {
54                            //设置显示的比例尺及点参数
55                            myIMapNet.SetScale(5500);
56                            myISMS.Color = Color.Red;
57                            myISMS.Width = 20;
58                            myISMS.Type = StudioAT.IMS.ArcXML.enuTypePoint.star;
59                            myISMS.OutLineColor = Color.Red;
60                            myIP1 = new StudioAT.Point(xMin,yMin);
61                            myIOAL = new ObjectPoint(myIP1, (ISymbolPointObject)myISMS);
62                            myIOAL.Unit = ArcXML.enuUnit.database;
63                            myIMNAO.Add((ObjectAcetateLayer)myIOAL);
64                            myIMapNet.CenterAt(myIP1);
65                        }

66                        else//定位线和面对象
67                        {
68                            //设置显示范围
69                            myISMS.Color = Color.Red;
70                            myISMS.Width = 100;
71                            myISMS.Type = StudioAT.IMS.ArcXML.enuTypePoint.square;
72                            myISMS.OutLineColor = Color.Red;
73                            myISMS.Transparency = 0;
74                            myISMS.Shadow = Color.Transparent;
75                            myIP1 = new StudioAT.Point(((xMax+xMin)/2),((yMax+yMin)/2));//计算范围中心
76                            myIOAL = new ObjectPoint(myIP1, (ISymbolPointObject)myISMS);
77                            myIOAL.Unit = ArcXML.enuUnit.database;
78                            myIMNAO.Add((ObjectAcetateLayer)myIOAL);
79                            myIMapNet.CenterAt(myIP1);
80                            myIMapNet.Refresh(xMin,yMin,xMax,yMax);
81                        }

82                        ……//在此编写访问数据库的代码。通过GisID来查找相应属性。
83}

GisID是图层表和数据库表的关联字段,只要获得了此数据值就能遨游在电子地图和数据库表之间了。



本文转自刚刚博客园博客,原文链接:http://www.cnblogs.com/lijigang/archive/2007/02/12/635514.html,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值