何实现添加一个面要素是判断是否与一个面图层相交(AO)
最近几天开始学习和基础ArcGIS AO 开发,感觉对一些概念性的东西很不了解,在学习过程中遇到了一些问题。突然想起前几天一同学问了我这样一个问题,如何实现添加一个面要素是判断是否与一个面图层相交。开始的时候我想起了用叠加分析来实现,但是没有亲自实践。刚好学习AO也趁此机会提高一下动手能力。
用过分析面的相交可能范围包含、被包含、叠加、相接几种情况。如下如所示:
实现代码:
public bool GetInterSection(string tableName,IGeometry gemotry,int objid)
{
IFeatureWorkspace currentWorkspace = workspace as IFeatureWorkspace;
IFeatureClass featureclass = currentWorkspace.OpenFeatureClass(tableName);
//方法1 使用空间查询用求交集 (效率高)
ISpatialFilter filter = new SpatialFilterClass();
filter.Geometry = gemotry;
filter.SpatialRel = ESRI.ArcGIS.Geodatabase.esriSpatialRelEnum.esriSpatialRelIntersects;
filter.SubFields = "*";
IFeatureCursor featureCursor = featureclass.Search(filter, false);
IFeature feature = featureCursor.NextFeature();
while (feature != null)
{
if (feature.OID != objid)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(featureCursor);
return true;
}
feature = featureCursor.NextFeature();
}
//方法2 利用空间关系运算(比起第一种效率要低)
//IQueryFilter queryFilter = new QueryFilterClass();
//queryFilter.SubFields = "*";
//queryFilter.WhereClause = "OBJECTID IS NOT NULL";
//IFeatureCursor featureCursor = featureclass.Search(queryFilter, false);
//IFeature feature = featureCursor.NextFeature();
//IRelationalOperator relationalOperator = gemotry as IRelationalOperator;
//System.Text.StringBuilder oids = new System.Text.StringBuilder();
//while (feature != null)
//{
// if (feature.OID != 200)
// {
// bool bRelation = relationalOperator.Overlaps(feature.Shape);
// if (relationalOperator.Overlaps(feature.Shape) || relationalOperator.Within(feature.Shape) || relationalOperator.Contains(feature.Shape) || relationalOperator.Touches(feature.Shape))
// {
// //System.Runtime.InteropServices.Marshal.ReleaseComObject(featureCursor);
// //return true;
// oids.Append(feature.OID);
// }
// }
// feature = featureCursor.NextFeature();
//}
return false;
}