1.创建要素类时ESRI.ArcGIS.esriSystem.UID CLSID的赋值很重要!
/// <summary>
/// 创建Line要素类
/// </summary>
/// <param name="workspace">工作空间</param>
/// <param name="featureDataset">要素集名称</param>
/// <param name="featureClassName">要素类名称</param>
/// <param name="pSpatialReference">坐标系</param>
/// <returns></returns>
public IFeatureClass CreateFeatureClassForLine(IWorkspace2 workspace, IFeatureDataset featureDataset, String featureClassName, ISpatialReference pSpatialReference)
{
ESRI.ArcGIS.Geodatabase.IFeatureClass featureClass;
ESRI.ArcGIS.Geodatabase.IFeatureWorkspace featureWorkspace = (ESRI.ArcGIS.Geodatabase.IFeatureWorkspace)workspace; // Explicit Cast
if (workspace.get_NameExists(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTFeatureClass, featureClassName)) //feature class with that name already exists
{
IFeatureClass pFeaCls = (workspace as IFeatureWorkspace).OpenFeatureClass(featureClassName);
(pFeaCls as ITable).DeleteSearchedRows(null);
return pFeaCls;
}
if (featureClassName == "")
{
return null;
}
ESRI.ArcGIS.esriSystem.UID CLSID = null;
ESRI.ArcGIS.esriSystem.UID CLSEXT = null;
System.String strConfigKeyword = null;
// assign the class id value if not assigned
if (CLSID == null)
{
CLSID = new ESRI.ArcGIS.esriSystem.UIDClass();
CLSID.Value = "esriGeoDatabase.Feature";
//CLSID.Value = "esriGeometryType.esriGeometryPolyline";
}
IObjectClassDescription objectClassDescription = new FeatureClassDescriptionClass();
IFields fields = null;
// if a fields collection is not passed in then supply our own
if (fields == null)
{
// create the fields using the required fields method
fields = objectClassDescription.RequiredFields;
IFieldsEdit fieldsEdit = (IFieldsEdit)fields; // Explicit Cast
IField field = new FieldClass();
// create a user defined text field
IFieldEdit fieldEdit = (IFieldEdit)field; // Explicit Cast
// setup field properties
fieldEdit.Name_2 = "FeatureType";
fieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
fieldEdit.IsNullable_2 = true;
fieldEdit.AliasName_2 = "要素类型";
fieldEdit.DefaultValue_2 = "0";
fieldEdit.Editable_2 = true;
fieldEdit.Length_2 = 100;
// add field to field collection
fieldsEdit.AddField(field);
fields = (IFields)fieldsEdit;
}
System.String strShapeField = "";
// locate the shape field
for (int j = 0; j < fields.FieldCount; j++)
{
if (fields.get_Field(j).Type == esriFieldType.esriFieldTypeGeometry)
{
//strShapeField = fields.get_Field(j).Name;
IField shapeField = fields.get_Field(j);
strShapeField = fields.get_Field(j).Name;
IGeometryDef geometryDef = shapeField.GeometryDef;
IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
// Alter the feature class geometry type to lines (default is polygons).
geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolyline;
geometryDefEdit.HasM_2 = true;
geometryDefEdit.GridCount_2 = 1;
// Set the first grid size to zero and allow ArcGIS to determine a valid grid size.
geometryDefEdit.set_GridSize(0, 0);
ISpatialReferenceFactory3 spatialReferenceFactory = new SpatialReferenceEnvironmentClass();
//geometryDefEdit.SpatialReference_2 = spatialReferenceFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_Beijing1954);
geometryDefEdit.SpatialReference_2 = pSpatialReference;
break;
}
}
// Use IFieldChecker to create a validated fields collection.
IFieldChecker fieldChecker = new FieldCheckerClass();
IEnumFieldError enumFieldError = null;
IFields validatedFields = null;
fieldChecker.ValidateWorkspace = (IWorkspace)workspace;
fieldChecker.Validate(fields, out enumFieldError, out validatedFields);
// The enumFieldError enumerator can be inspected at this point to determine
// which fields were modified during validation.
// finally create and return the feature class
if (featureDataset == null)// if no feature dataset passed in, create at the workspace level
{
featureClass = featureWorkspace.CreateFeatureClass(featureClassName, validatedFields, CLSID, CLSEXT, ESRI.ArcGIS.Geodatabase.esriFeatureType.esriFTSimple, strShapeField, strConfigKeyword);
}
else
{
featureClass = featureDataset.CreateFeatureClass(featureClassName, validatedFields, CLSID, CLSEXT, ESRI.ArcGIS.Geodatabase.esriFeatureType.esriFTSimple, strShapeField, strConfigKeyword);
}
return featureClass;
}
/// <summary>
/// 创建掩码图形,并维护相应的关系类,针对图层的选择集
/// </summary>
/// <param name="ipTrackPolygon"></param>
/// <param name="ipMaskedFeaturely"></param>
/// <param name="ipRelationshipClass"></param>
public static void CreateMaskRelationship(IGeometry ipTrackPolygon, IFeatureLayer ipMaskedFeaturely, IRelationshipClass ipRelationshipClass)
{
IFeatureSelection ipFeatureS = ipMaskedFeaturely as IFeatureSelection;
ISelectionSet ipSelectionSet = ipFeatureS.SelectionSet;
if (ipSelectionSet.Count == 0) return;
ICursor pCursor;
ipSelectionSet.Search(null, false, out pCursor);//获得选择集的查询Cursor
if (pCursor == null)
{
XtraMessageBox.Show("当前没有选择的要素符号,请确认!");
return;
}
IFeatureCursor pFtCur = pCursor as IFeatureCursor;
IObjectClass ipObjectClass = ipRelationshipClass.OriginClass;
IFeatureClass ipOriginFeatureClass = ipObjectClass as IFeatureClass;//原始目标要素类,mask要素类
// 开始编辑 掩膜层
//为掩膜层TERL_RepsMask创建新的要素
IFeatureCursor ipFeatureCursor = ipOriginFeatureClass.Insert(true);
IFeatureBuffer ipFeatureBuffer = ipOriginFeatureClass.CreateFeatureBuffer();
ipFeatureBuffer.Shape = ipTrackPolygon;
object varID = ipFeatureCursor.InsertFeature(ipFeatureBuffer);
ipFeatureCursor.Flush();
int FeatureID = (int)varID;
IFeature ipCreateDMaskFeature = ipOriginFeatureClass.GetFeature(FeatureID);//获取新的掩膜要素
//IGeometry ipMaskGeometry = ipCreateDMaskFeature.Shape;
IFeature ipSelectedFeature = null;
// 获取当前过滤图层的要素类型
while ((ipSelectedFeature = pFtCur.NextFeature()) != null)
{
IRelationship ipRelationShip;
IObject ipFeatureObject;
ipFeatureObject = ipSelectedFeature;
IObject ipFeatureMaskObject;
ipFeatureMaskObject = ipCreateDMaskFeature;
ipRelationShip = ipRelationshipClass.CreateRelationship(ipFeatureMaskObject, ipFeatureObject);
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(pCursor);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFtCur);
System.Runtime.InteropServices.Marshal.ReleaseComObject(ipFeatureCursor);
}
}
3.使用ITopologicalOperator 接口获取输出要素时,注意参数esriGeometryDimension的设置!
/// <summary>
/// 提取跳绘要素
/// </summary>
/// <param name="pFeaCls_JJX">境界线图层</param>
/// <param name="pFeaCls_HL">河流、道理图层</param>
/// <param name="pSpatialReference">空间参考</param>
/// <param name="FeaClsTiaoHuiName">制图表达RuleID值字段</param>
/// <returns></returns>
private bool CreateTiaoHuiFeaCls(IFeatureClass pFeaCls_JJX, IFeatureClass pFeaCls_HL, ISpatialReference pSpatialReference, IFeatureClass pTiaohuiFeaCls, IFeatureClass pMaskFeaCls)
{
List<GeometryAttri> plistExporyGeometry = new List<GeometryAttri>();
try
{
List<GeometryAttri> plistGeometry_JJX = PutSelectedGeomIntoBag(pFeaCls_JJX, null);
List<GeometryAttri> plistGeometry_HL = PutSelectedGeomIntoBag(pFeaCls_HL, null);
foreach (GeometryAttri pGeo_JJX in plistGeometry_JJX)
{
ITopologicalOperator pTopo = pGeo_JJX.PGeometry as ITopologicalOperator;
double douRepSize = pGeo_JJX.RepreSize;
foreach (GeometryAttri pGeo_HL in plistGeometry_HL)
{
IGeometry pExportGeometry = pTopo.Intersect(pGeo_HL.PGeometry, esriGeometryDimension.esriGeometryNoDimension);
if (pExportGeometry != null && pExportGeometry.IsEmpty == false)
{
GeometryAttri geometryAttri = new GeometryAttri();
geometryAttri.PGeometry = pExportGeometry;
geometryAttri.RepreSize = douRepSize;
plistExporyGeometry.Add(geometryAttri);
}
}
}
//ISpatialReference pSpatialReference = GlobalVars.instance.MapControl.SpatialReference;
using (ComReleaser pComRelease = new ComReleaser())
{
foreach (GeometryAttri geometry in plistExporyGeometry)
{
//写入跳绘图层
IFeature pFea_TiaoHui = pTiaohuiFeaCls.CreateFeature();
pFea_TiaoHui.Shape = geometry.PGeometry;
pFea_TiaoHui.Store();
//写入掩膜图层
IFeature pFea_Mask = pMaskFeaCls.CreateFeature();
IGeometry pGeoBuffer = (geometry.PGeometry as ITopologicalOperator).Buffer(geometry.RepreSize);
pFea_Mask.Shape = pGeoBuffer;
pFea_Mask.Store();
}
}
return true;
}
catch (Exception ex)
{
return false;
}
}
/// <summary>
/// 获取FeatureClass所有要素(Feature)的Geometry对象集合
/// </summary>
/// <param name="pFeaCls"></param>
/// <param name="pQuery">查询条件</param>
/// <returns></returns>
public static List<GeometryAttri> PutSelectedGeomIntoBag(IFeatureClass pFeaCls, IQueryFilter pQuery)
{
IFeatureLayer pFeaLyr = new FeatureLayerClass();
pFeaLyr.FeatureClass = pFeaCls;
IRepresentationRenderer pRepRenderer = (pFeaLyr as IGeoFeatureLayer).Renderer as IRepresentationRenderer;
List<GeometryAttri> plistGeometryAttri = new List<GeometryAttri>();
//获取选中的features
IFeature pFeature = null;
try
{
IFeatureCursor pFeaCursor = pFeaCls.Search(pQuery, false);
while ((pFeature = pFeaCursor.NextFeature()) != null)
{
double RepSize = getRepresentionLineSize(pRepRenderer, pFeature, GlobalVars.instance.MapControl);
GeometryAttri geometryAttri = new GeometryAttri();
IGeometry pGeo = pFeature.ShapeCopy;
if (pGeo != null)
{
geometryAttri.PGeometry = pGeo;
geometryAttri.RepreSize = RepSize;
}
plistGeometryAttri.Add(geometryAttri);
}
return plistGeometryAttri;
}
catch (Exception ex)
{
return null;
}
}