天天看點

MapInfo地圖查詢的簡單實作

GIS進階開發

【以我做的gis系統GIS_socialPolice為例,講解是如何實作一個互動操作的,因為,當你了解了如何與地圖實作互動,你就掌握了地圖的應用原理】

首先,我們想對地圖上的資料元進行操作,就必須知道它的位置,而位置無非是通過經緯度坐标來定位的,那麼,如何擷取經緯度就成了關鍵點了。

我已經跟你說了咱們是如何通過mapInfo7。0來提取坐标了【即在地圖上插入一個圖元,标示其經緯度】,那麼,在mapInfo建立每個圖層時,他就相應的給我們建立了一個來描述這個圖層的圖層資訊表,在咱們操作地圖的時候,大部分時間就是對這個底層的資訊表來操作的,說白了,GIS在很大程度上也是一種對資料庫的操作,這個需要你學的時間久了以後,自己慢慢領會。

這樣,咱們知道了GIS的操作基本原理以後,具體介紹一下,他的一個實作過程。

1、首先,添加一個觸發圖示,以提供給使用者來操作地圖,我們以坐标資訊查詢為例,這個最為典型,我們來實作一個按人員姓名來查詢資訊,查詢出該人員以後,然後将其定位在地圖上【其它的操作以此類推,基本原理都是在這個獲得坐标資訊的基礎上,來操作地圖的】

2、不妨添加一個按鈕,其值設為“查詢”,添加一個文本框,提供使用者輸入所需要查詢的資訊。

3、在安裝MapInfo的路徑下有一個MapInfo資料幫助文檔,叫“程式員參考手冊”,這裡提供了一系列對象供我們來操作資料。

4、在這裡,我們用到了SearchInfo對象,他是定義在MapInfo。Data命名空間下的對象,我們這樣來聲明這個對象

 SearchInfo si=MapInfo.Data.SearchInfoFactory.SearchWhere(strWhere);//strWhere為我們查詢的條件在這裡我們需要查詢某個人名,是以strWhere=“name like '%'"+strName+"%'"。

5、通過SearchInfo對象,我們可以擷取地圖資訊表中的查詢對象的實體,我們将其放倒一個IResultSetFeatureCollection對象中。

 這個對象使用來盛放搜尋的結果的,這個對象也是定義在MapInfo。Data命名空間下面的。我們這麼聲明對象,并且把查詢的

 資料放倒這個對象中。

 IResultSetFeatureCollection ifs =MapInfo.Engine.Session.Current.Catalog.Search(mapTable, si);

 //mapTable:表示,你是對那個表進行操作的,我們這個表就是通過mapinfo來建立的。

 //si則是,我們步驟4中建立的對象。

6、首先,判斷一下這個結果集ifs中是否有元素,ifs。count>0,如果否,則傳回空。

7、下面我們來實作如何定位到地圖上,首先,将目前地圖的選擇狀态先清空一下,來顯示目前剛做的操作。清空狀态是這樣實作的:MapInfo.Engine.Session.Current.Selections.DefaultSelection.Clear();

8、我們把剛才的結果集放到MapInfo提供的Session中:

 MapInfo.Engine.Session.Current.Selections.DefaultSelection。Add(ifs);

9、下面開始查詢:我一句一句解釋:

 //MIConnection:就像我們C#中的連接配接字元串

 MIConnection connection = new MIConnection();

 //MICommand像我們C#中的Command對象。

        MICommand command =connection.CreateCommand();

 //給Command的CommandText指派

        command.CommandText = "Selectjd,wd From  " + mapTable + "  Where name like '" + paramInfo+ "'";

       connection.Open();

 //建立一個資料集,以盛放我們的結果。

        MIDataReader reader =command.ExecuteReader();

        double[] outInfo = new double[2];

        if (reader.Read())

        {

            outInfo[0] =Convert.ToDouble(reader.GetValue(0));

            outInfo[1] =Convert.ToDouble(reader.GetValue(1));

       }

 //不要忘了釋放資源。

        reader.Close();

        command.Dispose();

        connection.Close();

 //這裡,我們傳回一個數組

        return outInfo;

10、我們第一個數組,來盛放上一步傳回的結果:

 double[] sitexy=outInfo;

11、我們要想把資料定位到地圖上,無非是獲得我們想看的資訊的經緯度坐标,然後,把這個資訊元移動到地圖的中心點,這樣也友善使用者檢視。

 具體操作是這樣的。

  setCenter(sitexy[0],sitexy[1],0.17);//這個setCenter()函數的功能就是實作了地圖的中心點移動。

  //解釋一下參數 的意義:sitexy[0]:表示經度,sitexy[1]:表示緯度,而0。17則表示我們目前把地圖放大的倍數。

12:這個函數的實作如下:

    private void setCenter(double x,double y,double level)

    {

 myMap.Center = new DPoint(x, y);     

        myMap.Size = newSystem.Drawing.Size((int)this.MainMap.Width.Value,(int)this.MainMap.Height.Value);//用指定寬度,高度初始化新的示例

        MapInfo.Geometry.Distance d = newMapInfo.Geometry.Distance(level, myMap.Zoom.Unit);//有效距離類型 距離可以是球面坐标距離或笛卡兒坐标距離。

        myMap.Zoom = d;

    }

    //myMap:MapInfo.Mapping.Map myMap,獲得正執行線程上的目前 ISession 執行個體

   上面12個步驟就是我們一個完整的地圖查詢資訊的過程!