建议大家先看看MapNet控件的程序员编程指南的帮助:http://www.studioat.it/StudioAT/Help/MapNet/MapNetWebHelp.htm相信对您会有帮助的。现在我们讨论一下今天的主要问题,其实这个问题我已经在GIS开发随笔(3)——ArcXML和NET_Link方法中探讨有相关的代码,下面我们再把此代码粘贴出来和大家一起分享和研究。
1、点击MapNet控件查询数据的代码如下:
1using System;
2using System.Collections;
3using System.ComponentModel;
4using System.Data;
5using System.Drawing;
6using System.Web;
7using System.Web.SessionState;
8using System.Web.UI;
9using System.Web.UI.WebControls;
10using System.Web.UI.HtmlControls;
11using System.Xml;
12using StudioAT.IMS;
13using StudioAT;
14
15……
16
17/**//// <summary>
18/// 单击地图时显示相关的属性信息和坐标信息
19/// </summary>
20/// <param name="rct">点的大小范围信息</param>
21private 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是必须被导入的。2using System.Collections;
3using System.ComponentModel;
4using System.Data;
5using System.Drawing;
6using System.Web;
7using System.Web.SessionState;
8using System.Web.UI;
9using System.Web.UI.WebControls;
10using System.Web.UI.HtmlControls;
11using System.Xml;
12using StudioAT.IMS;
13using StudioAT;
14
15……
16
17/**//// <summary>
18/// 单击地图时显示相关的属性信息和坐标信息
19/// </summary>
20/// <param name="rct">点的大小范围信息</param>
21private 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……
这样我们就完成了地图的属性查询工作。
2、点击DataGrid中的某条数据在MapNet中显示相应的元素,代码如下(其中的DataGrid是第三方控件):
1private 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, true, false, 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是图层表和数据库表的关联字段,只要获得了此数据值就能遨游在电子地图和数据库表之间了。
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, true, false, 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}