如题,查找面中 点的个数,先看看 IQueryFilter ISpatialFilter吧
ISpatialFilter is a QueryFilter that includes both spatial and attribute constraints.
多用于空间查询
IQueryFilter filters data based on an attribute query
多用于简间的属性查询
Code
// 获取选中的点要素类和面要素类 dstPointLayer是自定义控件,选择图层就能得到要素图层
IFeatureClass pPointFtrCls = (dstPointLayer.SelectedLayer as IFeatureLayer).FeatureClass;
IFeatureClass pAreaFtrCls = (dstAreaLayer.SelectedLayer as IFeatureLayer).FeatureClass;
// 获取面要素类的工作空间,建立不符合条件的要素OID的选择集。
IWorkspace pWorkspace = (dstPointLayer.SelectedLayer as IDataset).Workspace;
IQueryFilter pQueryFiler = new QueryFilterClass();
if (pAreaFtrCls.Fields.FieldCount > 0)
{
pQueryFiler.WhereClause = pAreaFtrCls.Fields.get_Field(0).Name + "=-1";
}
else
pQueryFiler.WhereClause = "1=0";
ISelectionSet pOIDSet = pAreaFtrCls.Select(pQueryFiler, esriSelectionType.esriSelectionTypeIDSet, esriSelectionOption.esriSelectionOptionNormal, pWorkspace);
// 用于过滤获取当前面范围内的所有点
ISpatialFilter pSpatialFilter = null;
ISpatialFilter sf = new SpatialFilterClass();
if (chkViewExtent.Checked)
{
IActiveView tav = Winsharp.BaseClass.AppConfigInfo.Framework.Application.FocusMap as IActiveView;
IGeometry tent = tav.Extent;
sf.Geometry = tent;
sf.GeometryField = "Shape";
sf.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
sf.WhereClause = "";
}
// 获取所有面要素,逐个检查其范围内的点数。
int pCount = pAreaFtrCls.FeatureCount(sf);
IFeatureCursor pAreaCursor = null;
ICursor tmpCursor;
if (chkSelection.Checked)
{
IFeatureSelection pfselection = (dstAreaLayer.SelectedLayer as IFeatureLayer) as IFeatureSelection;
pfselection.SelectionSet.Search(sf, false, out tmpCursor);
pAreaCursor = tmpCursor as IFeatureCursor;
pCount = pfselection.SelectionSet.Count;
}
else
{
pAreaCursor = pAreaFtrCls.Search(sf, false);
}
IFeature pAreaFeature = pAreaCursor.NextFeature();
while (pAreaFeature != null)
{
// 若中止操作,则退出函数。
if (this.m_HasCancel)
return;
// 定义空间过滤条件,过滤全包含在面之内的点。
pSpatialFilter = new SpatialFilterClass();
pSpatialFilter.Geometry = pAreaFeature.ShapeCopy;
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
pSpatialFilter.WhereClause = "";
pSpatialFilter.GeometryField = pPointFtrCls.ShapeFieldName;
// 获取全包含在面之内的点的数目。若点数不为1,则记录面的OID
pCount = pPointFtrCls.FeatureCount(pSpatialFilter);
if (pCount != 1)
{
pOIDSet.Add(pAreaFeature.OID);
}
// 移动指针,获取下一个面要素,同时修改进度条。
pAreaFeature = pAreaCursor.NextFeature();
this.m_Helper.Position++;
if (m_HasCancel)
break;
}