1.使用方法
IFeatureDataset pDataset =
(m_pLRModelTask.XYMotherDataBase.MotherWorkspace as IFeatureWorkspace). OpenFeatureDataset("Dataset");
IGeoDataset pGeoDataset = pDataset as IGeoDataset;
ISpatialReference m_ipSpatialRef = pGeoDataset.SpatialReference;
GDBEngineDataBase pGDBEngineDataBase = new GDBEngineDataBase();
CartoAPI.DeleteFeatureClass(m_pLRModelTask.XYMotherDataBase.MotherWorkspace, "TopoError");
IFeatureClass pTopoFeatureClass = GeoDBAPI.CreateSimpleFeatureClass("TopoError", pDataset, m_ipSpatialRef);
TopoLayerToPolygonLayer(m_pLRModelTask.XYMotherDataBase.TopoWorkspace2, "拓扑错误2", pTopoFeatureClass);
Marshal.ReleaseComObject(pTopoFeatureClass);
Marshal.ReleaseComObject(pDataset);
2.实现思路
/// <summary>
/// 提取拓扑类中的polygon到指定的要素类
/// </summary>
/// <param name="TopoWorkSpace"></param>
/// <param name="m_strTopologyName"></param>
/// <param name="outPutFeatureClass"></param>
private void TopoLayerToPolygonLayer(IWorkspace TopoWorkSpace,string m_strTopologyName, IFeatureClass outPutFeatureClass)
{
//IWorkspace TopoWorkSpace = m_pLRModelTask.XYMotherDataBase.TopoWorkspace2;
ITopology m_ipTopology = OpenTopology(TopoWorkSpace, m_strTopologyName);
if(m_ipTopology == null)
{
return;
}
IGeoDataset pGeoDataset = outPutFeatureClass as IGeoDataset;
ISpatialReference m_ipSpatialRef = pGeoDataset.SpatialReference;
// 错误容器
IErrorFeatureContainer m_ipErrorFeatContainer = (IErrorFeatureContainer)m_ipTopology;
// 拓扑规则容器
ITopologyRuleContainer m_ipTopologyRuleContainer = (ITopologyRuleContainer)m_ipTopology;
IFeatureDataset ipFeatDataset = (TopoWorkSpace as IFeatureWorkspace).OpenFeatureDataset("Dataset");
IGeoDataset ipGeoDataset = (IGeoDataset)ipFeatDataset;
IEnvelope ipEnvelope = ipGeoDataset.Extent; // 整个地图范围
IEnumRule ipEnumRule = m_ipTopologyRuleContainer.Rules;
IRule ipRule = ipEnumRule.Next();
while (ipRule != null)
{
ITopologyRule ipTopologyRule = (ITopologyRule)ipRule;
// 获取特定规则的错误(或例外,或错误和例外)
IEnumTopologyErrorFeature ipEnumErrorFeature =
GetRuleErrors(ipTopologyRule, m_ipErrorFeatContainer, m_ipSpatialRef, ipFeatDataset);
if(ipEnumErrorFeature == null)
{
continue;
}
ITopologyErrorFeature ipErrorFeature = ipEnumErrorFeature.Next();
while (ipErrorFeature != null) // 遍历错误
{
IFeature ipFeature = (IFeature)ipErrorFeature;
IGeometry pGeometry = ipFeature.Shape;
pGeometry.Project(m_ipSpatialRef);
CreateFeature(pGeometry, outPutFeatureClass);
ipErrorFeature = ipEnumErrorFeature.Next();
}
ipRule = ipEnumRule.Next();
}
}
/// <summary>
/// 获取特定规则的错误(或例外,或错误和例外)
/// </summary>
/// <param name="arrayTopoError"></param>
/// <param name="ipTopoRule"></param>
/// <param name="ipEnvelope"></param>
/// <returns></returns>
public IEnumTopologyErrorFeature GetRuleErrors( ITopologyRule ipTopoRule,
IErrorFeatureContainer m_ipErrorFeatContainer,
ISpatialReference m_ipSpatialRef, IFeatureDataset ipFeatDataset)
{
IGeoDataset ipGeoDataset = (IGeoDataset)ipFeatDataset;
IEnvelope ipEnvelope = ipGeoDataset.Extent; // 整个地图范围
// 规则类型
esriTopologyRuleType ruleType = ipTopoRule.TopologyRuleType;
string strRuleType = EngineAPI.en_GetRuleNameByTopologyType(ruleType);
// 源图层名称
int oriClassID = ipTopoRule.OriginClassID;
string strOrigionAliasClass = "";
string strOriginClass = GetClassNameByID(oriClassID, ref strOrigionAliasClass, (IFeatureClassContainer)ipFeatDataset);
// 目标图层名称
int destClassID = ipTopoRule.DestinationClassID;
string strDestinationAliasClass = "";
string strDestinationClass = GetClassNameByID(destClassID, ref strDestinationAliasClass, (IFeatureClassContainer)ipFeatDataset);
//IEnumTopologyErrorFeature ipEnumErrorFeature =m_ipErrorFeatContainer.get_ErrorFeatures(m_ipSpatialRef, ipTopoRule, ipEnvelope, true, true);
IEnumTopologyErrorFeature ipEnumErrorFeature =
m_ipErrorFeatContainer.get_ErrorFeatures(m_ipSpatialRef, ipTopoRule, ipEnvelope, true, true);
return ipEnumErrorFeature;
}
// 根据ID获取要素类名称
public string GetClassNameByID(int classID, ref string strAliasName, IFeatureClassContainer m_ipFeatClassContainer)
{
string strClassName = null;
IFeatureClass ipFeatClass = m_ipFeatClassContainer.get_ClassByID(classID);
if (ipFeatClass != null)
{
strAliasName = ipFeatClass.AliasName;
IDataset pGeoDs = (IDataset)ipFeatClass;
strClassName = pGeoDs.Name;
pGeoDs = null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(ipFeatClass);
}
ipFeatClass = null;
return strClassName;
}
// 打开拓扑类
private ITopology OpenTopology(IWorkspace TopoWorkSpace,string m_strTopologyName)
{
IWorkspace2 pWorkspace = (IWorkspace2)TopoWorkSpace;
ITopology m_ipTopology = null;
if (pWorkspace.get_NameExists(esriDatasetType.esriDTTopology, m_strTopologyName))
{
ITopologyWorkspace ipTopologyWS;
ipTopologyWS = (ITopologyWorkspace)TopoWorkSpace;
if (ipTopologyWS == null)
{
return null;
}
m_ipTopology = ipTopologyWS.OpenTopology(m_strTopologyName);
}
return m_ipTopology;
}
/// <summary>
/// 在目标图层上创建要素(所有属性信息为空,非编辑操作内完成)
/// </summary>
/// <param name="pNewGeom">新要素的图形</param>
/// <returns>操作结果</returns>
public bool CreateFeature(IGeometry pNewGeom,IFeatureClass _targetLayer)
{
try
{
//IFeatureClass pFeatureClass = _targetLayer.FeatureClass;
IFeature pFeature = _targetLayer.CreateFeature();
pFeature.Shape = pNewGeom;
pFeature.Store();
return true;
}
catch (Exception ex)
{
Logger.Exception<EditControl>(ex);
return false;
}
}
网友评论