查詢是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();//遍歷要素游標,直至要素為空時為止。
}