ArcEngine 数据导出Shape的几种方式
这里志列出关键代码,该代码不是 方法一:创建一个shape要素类,结果与导出要素类一致,保存使用store速度最慢,忽略
方法二:使用IFeatureBuffer速度较快,缺点:数据量大,导出的时候容易报内存损坏错误使程序崩溃,把arcgis lisence服务重启几次后有时能导出成功不会崩溃,没找到原因,如有解决方案,请告知,谢谢 private static void ExportShapeLayer(string filePath, IFeatureLayer featureLayer) { string parentPath = filePath.Substring(0, filePath.LastIndexOf('\\')); string fcName = filePath.Substring(filePath.LastIndexOf('\\') + 1, filePath.Length - filePath.LastIndexOf('\\') - 1);
string filedir = parentPath.Substring(parentPath.LastIndexOf('\\') + 1, parentPath.Length - parentPath.LastIndexOf('\\') - 1); DirectoryInfo directoryInfoPath = Directory.GetParent(parentPath);
IWorkspaceFactory pWorkSpaceFac = new ShapefileWorkspaceFactoryClass(); IFeatureWorkspace pFeatureWorkSpace = pWorkSpaceFac.OpenFromFile(parentPath, 0) as IFeatureWorkspace;
//创建字段集2 IFeatureClassDescription fcDescription = new FeatureClassDescriptionClass(); IObjectClassDescription ocDescription = (IObjectClassDescription)fcDescription;//创建必要字段 IFields fields = ocDescription.RequiredFields;
int shapeFieldIndex = fields.FindField(fcDescription.ShapeFieldName); IField field = fields.get_Field(shapeFieldIndex); IGeometryDef geometryDef = field.GeometryDef; IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
if (featureLayer.FeatureClass.ShapeType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon) { geometryDefEdit.GeometryType_2 = ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon; } else if (featureLayer.FeatureClass.ShapeType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline) { geometryDefEdit.GeometryType_2 = ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline; } else if (featureLayer.FeatureClass.ShapeType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint) { geometryDefEdit.GeometryType_2 = ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint; }
ESRI.ArcGIS.Geometry.IProjectedCoordinateSystem tProjectedCoordinateSystem = ((featureLayer as IGeoDataset).SpatialReference) as ESRI.ArcGIS.Geometry.IProjectedCoordinateSystem; geometryDefEdit.SpatialReference_2 = tProjectedCoordinateSystem;
IFieldChecker fieldChecker = new FieldCheckerClass(); IEnumFieldError enumFieldError = null; IFields validatedFields = null; //将传入字段 转成 validatedFields fieldChecker.ValidateWorkspace = (IWorkspace)pFeatureWorkSpace; fieldChecker.Validate(fields, out enumFieldError, out validatedFields); IFeatureClass shpFeatureClass = pFeatureWorkSpace.CreateFeatureClass(fcName, validatedFields, ocDescription.InstanceCLSID, ocDescription.ClassExtensionCLSID, esriFeatureType.esriFTSimple, fcDescription.ShapeFieldName, "");
for (int i = 0; i < featureLayer.FeatureClass.Fields.FieldCount; i++) { IField tfield = featureLayer.FeatureClass.Fields.get_Field(i); if (tfield.Type == esriFieldType |