天天看點

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

  從本随筆的标題中不難看出是為了實作顯示圖層屬性的,而且可以擷取圖層與資料庫關聯的ID來從資料庫中找到相應的附屬資訊。要實作此功能當然是先從資料庫入手了,為此我們來建立幾張資料庫的表;其次是使用MapNet控件為我們提供的某些接口來實作這些功能。 

1、點選MapNet控件查詢資料的代碼如下:

 1

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

using System;

 2

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

using System.Collections;

 3

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

using System.ComponentModel;

 4

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

using System.Data;

 5

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

using System.Drawing;

 6

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

using System.Web;

 7

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

using System.Web.SessionState;

 8

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

using System.Web.UI;

 9

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

using System.Web.UI.WebControls;

10

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

using System.Web.UI.HtmlControls;

11

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

using System.Xml;

12

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

using StudioAT.IMS;

13

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

using StudioAT;

14

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

15

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

……

16

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

17

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

/**//// <summary>

18

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

/// 單擊地圖時顯示相關的屬性資訊和坐标資訊

19

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

/// </summary>

20

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

/// <param name="rct">點的大小範圍資訊</param>

21

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

private void MapNet1_Click(StudioAT.IRect rct)

22

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

        {

23

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            IMapNet myMapNet = this.MapNet1;

24

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            XmlElement myXmlEle = null;

25

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            XmlDocument myXmlDoc = (XmlDocument)ArcXML.BuildRequest(ArcXML.enuRequest.GET_FEATURES, ref myXmlEle);

26

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            myXmlEle.SetAttribute(ArcXML.AttributeOutputmode,"newxml");

27

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            myXmlEle.SetAttribute(ArcXML.AttributeGeometry, "true");

28

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            myXmlEle.SetAttribute(ArcXML.AttributeEnvelope, "true");

29

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            myXmlEle.SetAttribute(ArcXML.AttributeCompact, "true");

30

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            XmlElement xmlELayer = myXmlDoc.CreateElement(ArcXML.NodeLayer);

31

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            xmlELayer.SetAttribute(ArcXML.AttributeId, this.DDL_Layer.SelectedValue);

32

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            myXmlEle.AppendChild(xmlELayer);

33

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            XmlElement xmlESQ = myXmlDoc.CreateElement(ArcXML.NodeSpatialquery);

34

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

35

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            myXmlEle.AppendChild(xmlESQ);

36

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            XmlElement xmlESF = myXmlDoc.CreateElement(ArcXML.NodeSpatialfilter);

37

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            xmlESF.SetAttribute(ArcXML.AttributeRelation, "area_intersection");

38

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            xmlESQ.AppendChild(xmlESF);

39

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            XmlElement xmlEEnv = (XmlElement)ArcXML.CreateExtent(ref myXmlDoc,rct);

40

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            xmlESF.AppendChild(xmlEEnv);

41

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            string strResponse = myMapNet.RequestArcXML(myXmlDoc.InnerXml, ArcXML.enuCustomService.Query);

42

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            myXmlDoc = new XmlDocument();

43

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            myXmlDoc.LoadXml(strResponse);

44

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            if(myXmlDoc.GetElementsByTagName("FIELD").Count > 2)

45

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            {

46

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                this.TB_BZ.Text = myXmlDoc.InnerXml;

47

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            }

48

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

        }

49

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

50

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

此時我們可以通過查找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是第三方控件):

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

private void UWG_Result_DblClick(object sender, Infragistics.WebUI.UltraWebGrid.ClickEventArgs e)

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢
GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            string GisID = e.Row.Cells[int.Parse(Session["GIS_IDindex"].ToString())].ToString().Trim();//獲得點選資料的GisID值

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            IMapNet myIMapNet = MapNet1;

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            string SearchStr = String.Empty; 

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            ICollectionLayers myICL = myIMapNet.CollectionLayers;

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            IGetFeatures myIGF = null;

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            ISimpleMarkerSymbol myISMS = new SimpleMarkerSymbolProperty();

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            IMapNetAcetateObjects myIMNAO = (IMapNetAcetateObjects)myIMapNet;

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            myIMNAO.Clear();

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            IObjectAcetateLayer myIOAL;

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            IPoint myIP1;

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

            try

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢
GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                ILayer myIL = (ILayer)myICL.FindById (Session["LayerID"].ToString());

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                ISpatialQuery2 myISQ2 = new SpatialQuery();

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                DataSet ds = myIL.Recordset(myISQ2, true, false, myIGF);//根據圖層讀取資料

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                for (int k = 0; k < ds.Tables[0].Columns.Count; k++)

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                {

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                    switch (ds.Tables[0].Columns[k].ColumnName)

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                    {

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                        case "#ID#":

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            ds.Tables[0].Columns[k].ColumnName = "序号";

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            break;

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                        case "EnvelopeXMin":

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            ds.Tables[0].Columns[k].ColumnName = "最小經度";

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢
GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                        case "EnvelopeXMax":

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            ds.Tables[0].Columns[k].ColumnName = "最大經度";

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢
GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                        case "EnvelopeYMin":

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            ds.Tables[0].Columns[k].ColumnName = "最小緯度";

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢
GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                        case "EnvelopeYMax":

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            ds.Tables[0].Columns[k].ColumnName = "最大緯度";

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢
GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                        default:

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢
GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                    }

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                }

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                if(GisID != "" && GisID != null)

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢
GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                    string ColumnsName = "GIS_ID";

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                    SearchStr = ColumnsName + " Like '%" + GisID + "%'";

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                    DataRow[] drs  = ds.Tables[0].Select(SearchStr);

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                    if(drs.Length > 0)

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢
GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                        double xMin = double.Parse(drs[0]["最小經度"].ToString());

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                        double xMax = double.Parse(drs[0]["最大經度"].ToString());

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                        double yMin = double.Parse(drs[0]["最小緯度"].ToString());

51

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                        double yMax = double.Parse(drs[0]["最大緯度"].ToString());

52

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                        if(xMin == xMax)

53

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                        {

54

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            //設定顯示的比例尺及點參數

55

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            myIMapNet.SetScale(5500);

56

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            myISMS.Color = Color.Red;

57

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            myISMS.Width = 20;

58

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            myISMS.Type = StudioAT.IMS.ArcXML.enuTypePoint.star;

59

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            myISMS.OutLineColor = Color.Red;

60

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            myIP1 = new StudioAT.Point(xMin,yMin);

61

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            myIOAL = new ObjectPoint(myIP1, (ISymbolPointObject)myISMS);

62

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            myIOAL.Unit = ArcXML.enuUnit.database;

63

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            myIMNAO.Add((ObjectAcetateLayer)myIOAL);

64

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            myIMapNet.CenterAt(myIP1);

65

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                        }

66

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                        else//定位線和面對象

67

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

68

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            //設定顯示範圍

69

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

70

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            myISMS.Width = 100;

71

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            myISMS.Type = StudioAT.IMS.ArcXML.enuTypePoint.square;

72

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

73

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            myISMS.Transparency = 0;

74

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            myISMS.Shadow = Color.Transparent;

75

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            myIP1 = new StudioAT.Point(((xMax+xMin)/2),((yMax+yMin)/2));//計算範圍中心

76

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

77

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

78

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

79

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

80

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                            myIMapNet.Refresh(xMin,yMin,xMax,yMax);

81

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

82

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

                        ……//在此編寫通路資料庫的代碼。通過GisID來查找相應屬性。

83

GIS開發随筆(4)——使用MapNet控件和DataGrid實作圖層資料互相查詢

}

GisID是圖層表和資料庫表的關聯字段,隻要獲得了此資料值就能遨遊在電子地圖和資料庫表之間了。

本文轉自剛剛部落格園部落格,原文連結:http://www.cnblogs.com/lijigang/archive/2007/02/12/635514.html,如需轉載請自行聯系原作者