MapInfo地圖查詢的簡單實現

暖楓無敵發表於2011-12-13

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個步驟就是我們一個完整的地圖查詢資訊的過程!


相關文章