日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

ArcEngine简单教程——要素的属性查询、空间查询

發(fā)布時間:2024/3/26 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ArcEngine简单教程——要素的属性查询、空间查询 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

其他教程請見:

ArcEngine簡單教程匯總

?

目錄

ArcEngine簡單教程匯總???????

1?目的

?

2?概要

空間查詢

屬性查詢

3?關鍵代碼

4小結


???????

?

1?目的

實現簡單的地圖查詢功能,包括右鍵拖選形狀,進行空間查詢;在屬性查詢窗口,輸入查詢語句進行屬性查詢等;清除查詢

?

2?概要

本文只介紹主要功能方法,具體的調用關系、窗口實現可見:

https://download.csdn.net/download/nominior/11577533

?

空間查詢

空間查詢實現比較簡單,主要借助鼠標事件、空間查詢條件完成:

1)確定查詢圖層

2)調用AxMapcontrol.Track*()獲取鼠標拖選范圍

3)高亮顯示:使用空間查詢ISpatialFilter,通過游標遍歷,向IFeatureSelection中加入要素,刷新顯示

屬性查詢

屬性查詢也比較簡單,主要基于屬性查詢接口完成,但為了方便查詢,需要顯示圖層、字段、唯一值等,優(yōu)化交互

1)確定查詢圖層

2)根據圖層,確定查詢字段

3)根據圖層、自帶,確定唯一值

4)根據字段、唯一值,確定查詢條件

5)高亮顯示:使用屬性查詢IQueryFilter,通過游標遍歷,向IFeatureSelection中加入要素,刷新顯示

重置查詢

使用如下代碼清除指定圖層的選擇:

IFeatureSelection fSelection = axMapControl1.get_Layer(i) as IFeatureSelection; fSelection.Clear();

3?關鍵代碼

空間查詢

獲取指定的要素圖層

private FeatureLayer get_FL(){FeatureLayer pFeatureLayer = null;for (int i = 0; i < axMapControl1.LayerCount; i++){if (cb_layer.Text == axMapControl1.get_Layer(i).Name){pFeatureLayer = axMapControl1.get_Layer(i) as FeatureLayer;break;}}return pFeatureLayer;}

根據查詢圖層和查詢方式,獲取鼠標框選范圍(矩形框選獲取的是IEnvelope,圓形框選、多邊形框選獲取的是IGeometry),創(chuàng)建空間查詢條件對象ISpatialFilter

private void axMapControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e){FeatureLayer pFeatureLayer = get_FL();if (e.button == 2 && pFeatureLayer != null){ IEnvelope box = null;if (cb_method.Text == "框選查詢"){box = axMapControl1.TrackRectangle() as IEnvelope;ISpatialFilter filter = new SpatialFilterClass();filter.WhereClause = "";filter.Geometry = box;filter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;ShowFeatures(pFeatureLayer, filter);}else{IGeometry pGeo;if (cb_method.Text == "多邊形查詢"){pGeo = axMapControl1.TrackPolygon();}else{pGeo = axMapControl1.TrackCircle();}ISpatialFilter filter = new SpatialFilterClass();filter.WhereClause = "";filter.Geometry = pGeo;filter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;ShowFeatures(pFeatureLayer, filter);}}}

根據空間查詢對象,游標遍歷要素圖層的要素類,獲取查詢要素添加到IFeatureSelection高亮顯示

public void ShowFeatures(IFeatureLayer featureLayer, IQueryFilter condition){if (featureLayer != null){IFeatureClass featureClass = featureLayer.FeatureClass;IFeatureCursor cursor = null;try{cursor = featureLayer.Search(condition, false);}catch (Exception e){cursor = null;}if (cursor != null){axMapControl1.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);IFeatureSelection fSelection = featureLayer as IFeatureSelection;fSelection.Clear();IFeature pFeature = cursor.NextFeature();while (pFeature != null){fSelection.Add(pFeature);pFeature = cursor.NextFeature();}axMapControl1.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);}}}

?

屬性查詢

獲取圖層字段,在lb_field中存放

private void cb_layerChoose_SelectedValueChanged(object sender, EventArgs e){lb_field.Items.Clear();int index = -1;for (int i = 0; i < map.LayerCount; i++){if (cb_layer.Text == map.get_Layer(i).Name){index = i;pFeatureLayer = map.get_Layer(i) as IFeatureLayer;break;}}if (index != -1){IFeatureLayer pFLayer = map.get_Layer(index) as IFeatureLayer;for (int j = 0; j < pFLayer.FeatureClass.Fields.FieldCount; j++){if (pFLayer.FeatureClass.Fields.get_Field(j).Type == esriFieldType.esriFieldTypeDouble ||pFLayer.FeatureClass.Fields.get_Field(j).Type == esriFieldType.esriFieldTypeSingle ||pFLayer.FeatureClass.Fields.get_Field(j).Type == esriFieldType.esriFieldTypeString ||pFLayer.FeatureClass.Fields.get_Field(j).Type == esriFieldType.esriFieldTypeInteger){lb_field.Items.Add(pFLayer.FeatureClass.Fields.get_Field(j).Name);}}}}

獲取字段唯一值,在lb_uniqueValue中存放

private void lb_field_MouseDoubleClick(object sender, MouseEventArgs e){string field = lb_field.Text;txt_query.Text += field;string[] values = UniqueValuesShow(field);lb_uniqueValue.Items.Clear();int pField_num = pFeatureLayer.FeatureClass.FindField(field);IField pField = pFeatureLayer.FeatureClass.Fields.get_Field(pField_num);for (int i = 0; i < values.Length; i++){if (pField.Type == esriFieldType.esriFieldTypeString){lb_uniqueValue.Items.Add("\'" + values[i] + "\'");}else{lb_uniqueValue.Items.Add(values[i]);}}}public string[] UniqueValuesShow(string strField){IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;IFeatureCursor lFeatureCursor = pFeatureClass.Search(null, false);IDataStatistics lData = new DataStatisticsClass();lData.Field = strField;lData.Cursor = lFeatureCursor as ICursor;IEnumerator pEnumVar = lData.UniqueValues;string[] strValue = new string[lData.UniqueValueCount];pEnumVar.Reset();int i = 0;while (pEnumVar.MoveNext()){strValue[i++] = pEnumVar.Current.ToString();}return strValue;}

根據查詢語言,創(chuàng)建屬性查詢條件,并遍歷、選擇、高亮

private void btn_att_select_Click(object sender, EventArgs e){IQueryFilter filter = new QueryFilterClass();filter.WhereClause = this.txt_query.Text;ShowFeatures(pFeatureLayer, filter);}public void ShowFeatures(IFeatureLayer featureLayer, IQueryFilter condition){if (featureLayer != null){IFeatureClass featureClass = featureLayer.FeatureClass;IFeatureCursor cursor = null;try{cursor = featureLayer.Search(condition, false);}catch (Exception e){cursor = null;}if (cursor != null){this.map.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);IFeatureSelection fSelection = featureLayer as IFeatureSelection;fSelection.Clear();IFeature pFeature = cursor.NextFeature();while (pFeature != null){fSelection.Add(pFeature);pFeature = cursor.NextFeature();}this.map.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);}}}

4小結

查詢實現的最簡過程:創(chuàng)建查詢條件對象,遍歷獲取要素并添加到選擇,刷新高亮

比較復雜的是創(chuàng)建查詢條件對象之前的處理過程

總結

以上是生活随笔為你收集整理的ArcEngine简单教程——要素的属性查询、空间查询的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。