AE方法——查詢(一)


查詢是GIS不可或缺的功能,今天我寫一下我近期對查詢的理解。先說說屬性查詢;

A 查詢主要涉及接口: 1.IQueryFilter 通過設置這個接口的WhereClause屬性來作為查詢條件,本屬性的語句為SQL的where后的條件語句。

2.IFeatureLayer 矢量圖層,一般由ILayer進行轉化。該接口的Search方法進行查詢,Search方法的參數有兩個,前面的是IQueryFilter對象 ,后面的是bool值,一般設為false.

3.IFeature 要素接口,用來接收查詢出來的要素。

4.IFeatureCursor 游標接口,通過Search進行查詢,可以講結果保存在這里,從而利用NextFeature方法,遍歷所有要素。

B 基本的思想 獲取圖層,設置條件,進行查詢,顯示要素類。

C 如何獲取IFeatureLayer 地圖的圖層的索引從0開始,一般通過get_Layer方法或者Layer屬性獲取ILayer,然后將ILayer強制轉換為IFeatureLayer。

D 舉例 下面是一個整體的過程。 首先定義一個方法:

/// <summary> /// 查詢並高亮顯示

/// </summary> /// <param name="sql">為WhereClause賦值</param> 

/// <param name="pLayer">圖層,ILayer對象</param> 

public void QueryAndHight(string sql, ILayer pLayer) 

{//查詢                  

this.axMapControl1.Map.ClearSelection();//清除地圖的選擇 

IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;//定義矢量圖層           

IQueryFilter pQueryFilter = new QueryFilter();//實例化一個查詢條件對象           

pQueryFilter.WhereClause = sql;//將查詢條件賦值           

IFeatureCursor pFeatureCursor = pFeatureLayer.Search(pQueryFilter, false);//進行查詢           

IFeature pFeature;           

pFeature = pFeatureCursor.NextFeature();//此步是將游標中的第一個交給pFeature           

if (pFeature == null)//判斷是否查到結果           

{//如果沒有查到報錯並結束               

MessageBox.Show("沒有查詢到地物!", "查詢提示", MessageBoxButtons.OK, MessageBoxIcon.Information);               

return;           

}           

axMapControl1.Map.SelectFeature(pLayer, pFeature);//將查詢到的地物作為選擇對象高亮顯示在地圖上          

axMapControl1.CenterAt(pFeature.Shape as ESRI.ArcGIS.Geometry.IPoint);//設置當前查詢到的要素為地圖的中心          

axMapControl1.MapScale = pLayer.MinimumScale;//將當前地圖的比例尺設置為ILayer的最小顯示比例尺          

axMapControl1.ActiveView.Refresh();//刷新地圖,這樣才能顯示出地物 

} 下面我們進行方法的調用:

Ilayer pLayer=axMapControl1.Map.get_Layer(0);//第一個圖層,在地圖中第一個圖層是醫院

QueryAndHight("name='市一醫院'",pLayer);//調用函數,在醫院的圖層上查詢name為市一醫院的要素並高量顯示在地圖上。

上面的例子有一個問題,假設我們只知道圖層的名字,而不知道索引為多少,這就比較復雜了。

所以我們可以提前寫一個方法 通過名字獲得ILayer對象。 

public ILayer GetLayerByName(string strLayerName)       

{           

ILayer pLayer = null;           

for (int i = 0; i <= axMapControl1.LayerCount - 1; i++)           

{               

  if (strLayerName == axMapControl1.get_Layer(i).Name)               

  {                   

    pLayer = axMapControl1.get_Layer(i); break;               

  }           

}           

return pLayer;       

}

這樣,我們就可以用以下的方法獲得ILayer對象進行查詢:

ILayer pLayer=GetLayerByName("醫院");。。

上面我們只是進行單要素的查詢與顯示,但是我們有時候需要獲得多個查詢結果,這樣就需要用到NextFeature方法進行遍歷搜索顯示 ,我們在進行高亮顯示的時候也能獲取要素的屬性值,可以將其保存起來。

下面就是一個例子:

List<string> strName=new List<string>();//用來保存name屬性,這個可以換成listBox或者comoBox來接受要素的name 

IFeatureLayer pFeatureLayer = mainfrm.GetLayerByName("此處為圖層的名字") as IFeatureLayer; 

IQueryFilter pQueryFilter = new QueryFilter(); 

pQueryFilter.WhereClause = "name  like '%" + txtName.Text + "%'";//模糊查詢 

IFeatureCursor pFeatureCursor = pFeatureLayer.Search(pQueryFilter, false); 

IFeature pFeature;  pFeature = pFeatureCursor.NextFeature();//獲取第一個要素 

if (pFeature == null)

{//如果要素為空,則提示並返回         

MessageBox.Show("沒有查詢到" + txtName.Text + "", "查詢提示", MessageBoxButtons.OK, MessageBoxIcon.Information);         

return;   

}   

while (pFeature != null)   

{              

strName.Add(pFeature.get_Value(pFeature.Fields.FindField("name")).ToString());//將查詢出的要素的name屬性加到strName中 

//如果是listbox則可以用listBox1.items.add(....);來將name添加到listbox中。               

mainfrm.axMapControl1.Map.SelectFeature(mainfrm.GetLayerByName(“圖層的名字”), pFeature);//高亮顯示               

pFeature = pFeatureCursor.NextFeature();//遍歷要素游標,直至要素為空時為止。    

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM