(四)点空间查询
IFeatureLayer pFeatureLayer
= this.axMapControl1.get_Layer(1) as IFeatureLayer;
IFeatureClass pFeatureClass
= pFeatureLayer.FeatureClass;
IPoint pPoint
= new PointClass ();
pPoint.PutCoords(83.140965992759618,
49.669371563063862);//pPoint的坐标
ISpatialFilter pSpatialFilter
= new SpatialFilterClass();
pSpatialFilter.Geometry
= pPoint;//原图形
pSpatialFilter.SpatialRel
= esriSpatialRelEnum.esriSpatialRelIntersects;//查询条件intersect
IFeatureCursor pFeatureCursor
= pFeatureClass.Search(pSpatialFilter ,false );//将查询结果赋给指针
IFeature pFeature
= pFeatureCursor.NextFeature();//指针后移所指向的要素,赋给pFeature
while (pFeature
!= null)
{
this.axMapControl1.FlashShape(pFeature
.Shape ,3,300,null );
pFeature
= pFeatureCursor.NextFeature();
}
(五)面空间查询
//查询与一个面intersect的点有哪些
listView1.Items.Clear();
listView1.Columns.Clear();
IFeatureLayer pFeatureLayer
= this.axMapControl1.get_Layer(0) as IFeatureLayer;//Layer0是点图层,1是面图层
IFeatureClass pFeatureClass
= pFeatureLayer.FeatureClass;
// 获取字段名
int iFieldCount
= pFeatureClass.Fields.FieldCount;
for (int i
= 0; i < iFieldCount; i++)
{
string strFieldName
= pFeatureClass.Fields.get_Field(i).Name;
listView1.Columns.Add(strFieldName);
}
IEnvelope pEnv
= new EnvelopeClass ();
pEnv.PutCoords(83.140965992759618
- 10, 49.669371563063862 - 10, 83.140965992759618 + 10, 49.669371563063862 + 10);
//pPoint.PutCoords(83.140965992759618,49.669371563063862);pPoint的坐标
ISpatialFilter pSpatialFilter
= new SpatialFilterClass();
pSpatialFilter.Geometry
= pEnv ;//原图形
pSpatialFilter.SpatialRel
= esriSpatialRelEnum.esriSpatialRelIntersects;//查询条件intersect
IFeatureCursor pFeatureCursor
= pFeatureClass.Search(pSpatialFilter, false);//将查询结果赋给指针
IFeature pFeature
= pFeatureCursor.NextFeature();//指针后移所指向的要素,赋给pFeature
while (pFeature
!= null)
{
ListViewItem pListViewItem
= new ListViewItem();
pListViewItem.Text
= pFeature.get_Value(0).ToString();
//添加字段值
for (int i
= 1; i < iFieldCount; i++)
{
//添加字段值
string strFieldValue
= pFeature.get_Value(i).ToString();
ListViewItem.ListViewSubItem pListViewSbuItem
= new ListViewItem.ListViewSubItem();
pListViewSbuItem.Text
= strFieldValue;
pListViewItem.SubItems.Add(pListViewSbuItem);
}
listView1.Items.Add(pListViewItem);
this.axMapControl1.FlashShape(pFeature.Shape,
3, 300, null);
pFeature
= pFeatureCursor.NextFeature();
}
(六)点空间查询和面空间查询
private bool boolPointQuery
= false ;
private bool boolEnvQuery
= false;
private void btnSpatialQuery_Click(object sender, EventArgs e)
{
this.boolEnvQuery
= true;
this.boolPointQuery
= false;
listView1.Items.Clear();
listView1.Columns.Clear();
}
private void btnPointSpatial_Click(object sender, EventArgs e)
{
this.boolPointQuery
= true;
this.boolEnvQuery
= false;
listView1.Items.Clear();
listView1.Columns.Clear();
}
private void axMapControl1_OnMouseDown(object sender,
ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
{
listView1.Items.Clear();
listView1.Columns.Clear();
//点空间查询,单个图层
if (this.boolPointQuery
== true)
{
IFeatureLayer pFeatureLayer
= this.axMapControl1.get_Layer(1) as IFeatureLayer;
IFeatureClass pFeatureClass
= pFeatureLayer.FeatureClass;
//Create
a point to use for the search;
ESRI.ArcGIS.Geometry.IPoint pPoint
= new ESRI.ArcGIS.Geometry.PointClass();
pPoint.PutCoords(e.mapX,
e.mapY);//49.669371563063862);
//pPoint.PutCoords(83.140965992759618,
55.4932623480468);//49.669371563063862);
//Getting
a reference;
ISpatialFilter pPpatialFilter
= new SpatialFilterClass();
//Setting
the Geometry,GeometryField and SpatialRel parameters;
pPpatialFilter.Geometry
= pPoint;
pPpatialFilter.GeometryField
= pFeatureClass.ShapeFieldName;
pPpatialFilter.SpatialRel
= esriSpatialRelEnum.esriSpatialRelIntersects ;//.esriSpatialRelWithin
;//.esriSpatialRelIntersects;//.esriSpatialRelWithin ;//.esriSpatialRelIntersects;
// 获取字段名
int iFieldCount
= pFeatureClass.Fields.FieldCount;
for (int i
= 0; i < iFieldCount; i++)
{
string strFieldName
= pFeatureClass.Fields.get_Field(i).Name;
listView1.Columns.Add(strFieldName);
}
//添加要素
try
{
//Execute
the spatiafilter;
IFeatureCursor pFeatureCursor
= pFeatureClass.Search(pPpatialFilter, false);
IFeature pFeature
= pFeatureCursor.NextFeature();
while (pFeature
!= null)
{
ListViewItem pListViewItem
= new ListViewItem();
pListViewItem.Text
= pFeature.get_Value(0).ToString();
//添加字段值
for (int i
= 1; i < iFieldCount; i++)
{
//添加字段值
string strFieldValue
= pFeature.get_Value(i).ToString();
ListViewItem.ListViewSubItem pListViewSbuItem
= new ListViewItem.ListViewSubItem();
pListViewSbuItem.Text
= strFieldValue;
pListViewItem.SubItems.Add(pListViewSbuItem);
}
listView1.Items.Add(pListViewItem);
//闪烁查询到的要素
this.axMapControl1.FlashShape(pFeature.Shape,
2, 300, Type.Missing);
//下一个要素
pFeature
= pFeatureCursor.NextFeature();
}
}
catch (Exception ax)
{
MessageBox.Show(ax.ToString());
}
}
//多边形空间查询,多个图层
if (this.boolEnvQuery
== true)
{//用于查询的矩形(相当于点的缓冲区,这样比生成缓冲区节省资源),
//envelope的大小根据实际情况设定,以方便使用为准
IEnvelope pEnv
= new EnvelopeClass();
pEnv.PutCoords(e.mapX
- 2, e.mapY - 2, e.mapX + 2, e.mapY + 2);
IGeometry pGeometry
= pEnv as IGeometry;
ISpatialFilter pSpatialFilter
= new SpatialFilterClass();
pSpatialFilter.Geometry
= pGeometry;
pSpatialFilter.SpatialRel
= esriSpatialRelEnum.esriSpatialRelIntersects;//.esriSpatialRelContains;
//没有必要将地图上的高亮选择清除,因为下面对每个图层的选择都用esriSelectionResultNew,会自动清除上次的高亮显示,
//而不同图层之间的高亮选择不会有任何影响,因为IFeatureSelection接口的一切属性和方法都是针对一个图层
// this.axMapControl1.Map.ClearSelection();
IFeatureLayer pFeatureLayer;
IFeatureSelection pFeatureSelection;
ISelectionSet pSelectionSet;
IEnumIDs pEnumIDs;
IFeature pFeature;
pFeatureLayer
= this.axMapControl1.get_Layer(0) as IFeatureLayer;
IFeatureClass pFeatureClass
= pFeatureLayer.FeatureClass;
// 获取字段名到ListView中
int iFieldCount
= pFeatureClass.Fields.FieldCount;
for (int i
= 0; i < iFieldCount; i++)
{
string strFieldName
= pFeatureClass.Fields.get_Field(i).Name;
listView1.Columns.Add(strFieldName);
}
try
{
//循环显示所有图层上选中的要素
for (int i
= 0; i < this.axMapControl1.LayerCount; i++)
{
pFeatureLayer
= this.axMapControl1.get_Layer(i) as IFeatureLayer;
if (pFeatureLayer.Visible
&& pFeatureLayer.Selectable)
{
pFeatureSelection
= pFeatureLayer as IFeatureSelection;
//选择之前先清除,这是个好习惯(除非是用Add方式)
pFeatureSelection.Clear();
pFeatureSelection.SelectFeatures(pSpatialFilter,esriSelectionResultEnum.esriSelectionResultNew, true);
pSelectionSet
= pFeatureSelection.SelectionSet;
//如果选择集内有Feature
if (pSelectionSet.Count
> 0)
{
//通过pEnumIDs获得该SelectionSet中的Feature的id值,再用FeatureClass.GetFeature()方法获得该Feature对象
//这里为了学习新接口而使用了IEnumIDs,为了获得SelectionSet中的Feature,可以使用其Search()方法
//获得ICursor,再使用循环获得Feature,如下注释选定行
// pSelectionSet.Search(null,false,out
pCursor);
// pRow
= pCursor.NextRow();
// if(pRow!=null)
// {
// }
pEnumIDs
= pSelectionSet.IDs;
long id
= pEnumIDs.Next();
while (id
!= -1)
{
pFeature
= pFeatureLayer.FeatureClass.GetFeature((int)id);
ListViewItem pListViewItem
= new ListViewItem();
pListViewItem.Text
= pFeature.get_Value(0).ToString();
for (int j
= 1; j < pFeature.Fields.FieldCount; j++)
{
//添加字段值
string strFieldValue
= pFeature.get_Value(j).ToString();
ListViewItem.ListViewSubItem pListViewSbuItem
= newListViewItem.ListViewSubItem();
pListViewSbuItem.Text
= strFieldValue;
pListViewItem.SubItems.Add(pListViewSbuItem);
}
listView1.Items.Add(pListViewItem);
this.axMapControl1.FlashShape(pFeature.Shape,
2, 300, Type.Missing);
//MessageBox.Show("选中的Feature
ID为:" + id.ToString());
id
= pEnumIDs.Next();
}
pFeatureSelection.Clear();
//MessageBox.Show("选中的Feature
ID为:" + id.ToString());
}
}
}
}
catch (Exception ax)
{
MessageBox.Show(ax.ToString());
}
}
}