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