You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							294 lines
						
					
					
						
							14 KiB
						
					
					
				
			
		
		
	
	
							294 lines
						
					
					
						
							14 KiB
						
					
					
				using ESRI.ArcGIS.Geodatabase; | 
						|
using ESRI.ArcGIS.Geometry; | 
						|
using KGIS.Framework.AE; | 
						|
using KGIS.Framework.Utils; | 
						|
using KGIS.Framework.Utils.Helper; | 
						|
using System; | 
						|
using System.Collections.Generic; | 
						|
using System.Runtime.InteropServices; | 
						|
 | 
						|
namespace Kingo.Plugin.DataLoad.Helper | 
						|
{ | 
						|
    /// <summary> | 
						|
    /// DataLoad_AECommonHelper | 
						|
    /// </summary> | 
						|
    public static class DLAECommonHelper | 
						|
    { | 
						|
        /// <summary> | 
						|
        /// 删除SHP文件 | 
						|
        /// </summary> | 
						|
        /// <param name=""></param> | 
						|
        public static void DeleteShp(string fileName, string filePath) | 
						|
        { | 
						|
            IWorkspace pWorkspace = null; | 
						|
            IWorkspaceFactory pWorkspaceFactory = null; | 
						|
            IFeatureClass pFeatureClass = null; | 
						|
            try | 
						|
            { | 
						|
                //打开shp工作空间 | 
						|
                pWorkspaceFactory = new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactory(); | 
						|
                pWorkspace = pWorkspaceFactory.OpenFromFile(filePath, 0); | 
						|
                IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace; | 
						|
 | 
						|
                pFeatureClass = pFeatureWorkspace.OpenFeatureClass(fileName); | 
						|
                IDataset pFeaDataset = pFeatureClass as IDataset; | 
						|
                pFeaDataset.Delete(); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                PluginServiceInterface.CommonHelper.RecordsErrLog("删除shp失败,报错原因:", ex); | 
						|
            } | 
						|
            finally | 
						|
            { | 
						|
                if (pWorkspaceFactory != null) | 
						|
                { | 
						|
                    Marshal.ReleaseComObject(pWorkspaceFactory); | 
						|
                } | 
						|
                if (pWorkspace != null) | 
						|
                { | 
						|
                    Marshal.ReleaseComObject(pWorkspace); | 
						|
                } | 
						|
                if (pFeatureClass != null) | 
						|
                { | 
						|
                    Marshal.ReleaseComObject(pFeatureClass); | 
						|
                } | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        /// <summary> | 
						|
        /// 导出SHP数据 | 
						|
        /// </summary> | 
						|
        /// <param name="pSourceFeatureClass"></param> | 
						|
        /// <param name="pQueryFilter"></param> | 
						|
        /// <param name="forlder"></param> | 
						|
        /// <param name="fileName"></param> | 
						|
        public static void ExportFeaturesToShp(IFeatureClass pSourceFeatureClass, IQueryFilter pQueryFilter, string forlder, string fileName) | 
						|
        { | 
						|
            IWorkspaceFactory workFactory = null; | 
						|
            IFeatureWorkspace pFeatureWorkspace = null; | 
						|
            IFeatureCursor pFeatureCursor = null; | 
						|
            IFeatureClass pFeatureClass = null; | 
						|
            IFeatureCursor pInsertFeatureCursor = null; | 
						|
            try | 
						|
            { | 
						|
                if (pSourceFeatureClass == null) | 
						|
                { | 
						|
                    MessageHelper.ShowTips("未获取到要素类!"); | 
						|
                    return; | 
						|
                } | 
						|
                if (!System.IO.Directory.Exists(forlder)) | 
						|
                    System.IO.Directory.CreateDirectory(forlder); | 
						|
                int count = pSourceFeatureClass.FeatureCount(pQueryFilter); | 
						|
                pFeatureCursor = pSourceFeatureClass.Search(pQueryFilter, true); | 
						|
                workFactory = new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactoryClass(); | 
						|
                pFeatureWorkspace = workFactory.OpenFromFile(forlder, 0) as IFeatureWorkspace; | 
						|
 | 
						|
                //创建字段信息 | 
						|
                IFields pFields = new FieldsClass(); | 
						|
                IFieldsEdit pFieldsEdit = pFields as IFieldsEdit; | 
						|
                List<string> fieldNames = new List<string>(); | 
						|
                for (int i = 0; i < pSourceFeatureClass.Fields.FieldCount; i++) | 
						|
                { | 
						|
                    IField field = pSourceFeatureClass.Fields.get_Field(i); | 
						|
                    if ((field.Type == esriFieldType.esriFieldTypeBlob || field.Type == esriFieldType.esriFieldTypeRaster) && field.Type != esriFieldType.esriFieldTypeGeometry) | 
						|
                        continue; | 
						|
                    if (field.Type == esriFieldType.esriFieldTypeGeometry) | 
						|
                    { | 
						|
                        IField pField = new FieldClass(); | 
						|
                        IFieldEdit pFieldEdit = pField as IFieldEdit; | 
						|
                        pFieldEdit.Name_2 = "Shape"; | 
						|
                        pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry; | 
						|
                        IGeometryDef pGeometryDef = new GeometryDef(); | 
						|
                        IGeometryDefEdit pGeometryDefEdit = pGeometryDef as IGeometryDefEdit; | 
						|
                        pGeometryDefEdit.GeometryType_2 = pSourceFeatureClass.ShapeType;//pFeature.Shape.GeometryType; | 
						|
                        if ((pSourceFeatureClass as IGeoDataset) != null) | 
						|
                        { | 
						|
                            pGeometryDefEdit.SpatialReference_2 = (pSourceFeatureClass as IGeoDataset).SpatialReference;//pFeature.Shape.SpatialReference; | 
						|
                        } | 
						|
                        pFieldEdit.GeometryDef_2 = pGeometryDef; | 
						|
                        pFieldsEdit.AddField(pField); | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        IField pField = new FieldClass(); | 
						|
                        IFieldEdit pFieldEdit = pField as IFieldEdit; | 
						|
                        pFieldEdit.Length_2 = field.Length; | 
						|
                        if (field.AliasName == "种植属性名称") | 
						|
                        { | 
						|
                            pFieldEdit.Length_2 = field.Length + 10; | 
						|
                        } | 
						|
                        if (field.Name.Length > 10) | 
						|
                        { | 
						|
                            string fname = field.Name.Substring(0, 10); | 
						|
                            int n = 1; | 
						|
                            while (fieldNames.Contains(fname)) | 
						|
                            { | 
						|
                                string end = n.ToString(); | 
						|
                                fname = fname.Remove(10 - end.Length) + end; | 
						|
                                n++; | 
						|
                            } | 
						|
                            pFieldEdit.Name_2 = fname; | 
						|
                        } | 
						|
                        else | 
						|
                        { | 
						|
                            pFieldEdit.Name_2 = field.Name; | 
						|
                        } | 
						|
                        fieldNames.Add(pFieldEdit.Name); | 
						|
                        pFieldEdit.AliasName_2 = field.AliasName; | 
						|
                        pFieldEdit.Type_2 = field.Type; | 
						|
                        pFieldsEdit.AddField(pField); | 
						|
                    } | 
						|
                } | 
						|
                pFeatureClass = pFeatureWorkspace.CreateFeatureClass(fileName, pFields, null, null, pSourceFeatureClass.FeatureType, "SHAPE", ""); | 
						|
                pInsertFeatureCursor = pFeatureClass.Insert(true); | 
						|
 | 
						|
                Dictionary<int, int> dicMatchFields = new Dictionary<int, int>(); | 
						|
                GetMatchFieldsDirectory(pSourceFeatureClass, pFeatureClass, ref dicMatchFields, true); | 
						|
                IFeatureBuffer featureAdd = pFeatureClass.CreateFeatureBuffer(); | 
						|
                IFeature pFeature = null; | 
						|
                while ((pFeature = pFeatureCursor.NextFeature()) != null) | 
						|
                { | 
						|
                    featureAdd.Shape = pFeature.Shape; | 
						|
                    foreach (KeyValuePair<int, int> kvpMatchField in dicMatchFields) | 
						|
                    { | 
						|
                        if (pFeature.Value[kvpMatchField.Value] != DBNull.Value) | 
						|
                        { | 
						|
                            featureAdd.set_Value(kvpMatchField.Key, pFeature.get_Value(kvpMatchField.Value)); | 
						|
                        } | 
						|
                        else | 
						|
                        { | 
						|
                            featureAdd.set_Value(kvpMatchField.Key, null); | 
						|
                        } | 
						|
                    } | 
						|
                    pInsertFeatureCursor.InsertFeature(featureAdd); | 
						|
                } | 
						|
                pInsertFeatureCursor.Flush(); | 
						|
 | 
						|
                //关闭lock | 
						|
                IWorkspaceFactoryLockControl ipWsFactoryLock = (IWorkspaceFactoryLockControl)workFactory; | 
						|
                if (ipWsFactoryLock.SchemaLockingEnabled) | 
						|
                { | 
						|
                    ipWsFactoryLock.DisableSchemaLocking(); | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                MessageHelper.ShowError("导出SHAPE文件出错:" + ex.Message); | 
						|
                PluginServiceInterface.CommonHelper.RecordsErrLog("导出SHAPE文件出错,可能的原因是:", ex); | 
						|
            } | 
						|
            finally | 
						|
            { | 
						|
                if (pFeatureCursor != null) | 
						|
                { | 
						|
                    Marshal.ReleaseComObject(pFeatureCursor); | 
						|
                } | 
						|
                if (pFeatureClass != null) | 
						|
                { | 
						|
                    Marshal.ReleaseComObject(pFeatureClass); | 
						|
                } | 
						|
                if (pInsertFeatureCursor != null) | 
						|
                { | 
						|
                    Marshal.ReleaseComObject(pInsertFeatureCursor); | 
						|
                } | 
						|
                if (pFeatureWorkspace != null)           | 
						|
                { | 
						|
                    Marshal.ReleaseComObject(pFeatureWorkspace); | 
						|
                } | 
						|
                if (workFactory != null) | 
						|
                { | 
						|
                    Marshal.ReleaseComObject(workFactory); | 
						|
                } | 
						|
            } | 
						|
        } | 
						|
       | 
						|
        /// <summary> | 
						|
        /// 导出SHP数据_获得匹配的字段索引集合 | 
						|
        /// </summary> | 
						|
        /// <param name="pSourceFeatureClass">源要素类</param> | 
						|
        /// <param name="pTargetClass">目标要素类</param> | 
						|
        /// <param name="dicMatchFields">匹配字段集合-KEY为目标图层字段,VALUE为源图层字段</param> | 
						|
        /// <param name="isGetRequired">是否获取必须字段</param> | 
						|
        public static void GetMatchFieldsDirectory(IClass pSourceClass, IClass pTargetClass, ref Dictionary<int, int> dicMatchFields, bool isGetRequired = false) | 
						|
        { | 
						|
            for (int i = 0; i < pTargetClass.Fields.FieldCount; i++) | 
						|
            { | 
						|
                IField pTargetField = pTargetClass.Fields.get_Field(i); | 
						|
                //目标图层的字段必须为可编辑并且不是必须字段 | 
						|
                if (pTargetField.Required == false && pTargetField.Editable == true) | 
						|
                { | 
						|
                    int iSourceFeatureClassIndex = pSourceClass.Fields.FindField(pTargetField.Name); | 
						|
                    if (pTargetField.Name == "SHAPE_Leng") | 
						|
                    { | 
						|
                        iSourceFeatureClassIndex = pSourceClass.Fields.FindField("SHAPE_Length"); | 
						|
                    } | 
						|
                    //源要素类中该字段存在 | 
						|
                    if (iSourceFeatureClassIndex > -1) | 
						|
                    { | 
						|
                        IField pSourceField = pSourceClass.Fields.get_Field(iSourceFeatureClassIndex); | 
						|
                        if ("XZQTZLX,BGZT,JCZT,TZ,BGDL,BGFW,WBGLX,SJLY,SFJCTB,NYJY,NYYPDL,SFJZ,ONLYZLBG".Contains(pSourceField.Name)) | 
						|
                            continue; | 
						|
                        //目标图层的字段也必须为可编辑并且不是必须字段 | 
						|
                        if (pSourceField.Required == false && pSourceField.Editable == true) | 
						|
                        { | 
						|
                            //添加到字段匹配集合中 | 
						|
                            dicMatchFields.Add(i, iSourceFeatureClassIndex); | 
						|
                        } | 
						|
                        else if (isGetRequired) | 
						|
                        { | 
						|
                            dicMatchFields.Add(i, iSourceFeatureClassIndex); | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
                //此处为了保留原有要素ObjectID字段值 | 
						|
                if (pTargetField.Name.Equals("OIDCOPY", StringComparison.CurrentCultureIgnoreCase)) | 
						|
                { | 
						|
                    dicMatchFields.Add(i, pSourceClass.FindField(pSourceClass.OIDFieldName)); | 
						|
                } | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        /// <summary> | 
						|
        /// 创建要素集(GDB、MDB) | 
						|
        /// </summary> | 
						|
        /// <param name="pDataset"></param> | 
						|
        /// <param name="workspaceAPI"></param> | 
						|
        /// <returns></returns> | 
						|
        public static IFeatureDataset CreateFeatureDataset(WorkspaceAPI workspaceAPI, string DataSetName = "") | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                IFeatureWorkspace targetWorkspac = workspaceAPI.CurrentWorkspace as IFeatureWorkspace; | 
						|
                //object tst = workspaceAPI.CurrentWorkspace; | 
						|
                ISpatialReference SpatialReference = new UnknownCoordinateSystemClass(); | 
						|
                IControlPrecision2 pCP = SpatialReference as IControlPrecision2; | 
						|
                //要素分辨率 | 
						|
                ISpatialReferenceResolution spatialReferenceResolution = SpatialReference as ISpatialReferenceResolution; | 
						|
                spatialReferenceResolution.set_XYResolution(false, 0.000005); | 
						|
                spatialReferenceResolution.set_ZResolution(false, 0.000005); | 
						|
                //要素数据集容差 | 
						|
                ISpatialReferenceTolerance spatialReferenceTolerance = SpatialReference as ISpatialReferenceTolerance; | 
						|
                double tolerance = 0; | 
						|
                if (double.TryParse(SysConfigsOprator.GetAppsetingValueByKey("Tolerance"), out tolerance)) | 
						|
                { | 
						|
                    spatialReferenceTolerance.XYTolerance = tolerance; | 
						|
                    spatialReferenceTolerance.ZTolerance = tolerance; | 
						|
                    spatialReferenceTolerance.MTolerance = tolerance; | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    spatialReferenceTolerance.XYTolerance = 0.0001; | 
						|
                    spatialReferenceTolerance.ZTolerance = 0.0001; | 
						|
                    spatialReferenceTolerance.MTolerance = 0.0001; | 
						|
                } | 
						|
                SpatialReference.SetDomain(0, 45035996273.705, 0, 45035996273.705); | 
						|
                return targetWorkspac.CreateFeatureDataset(DataSetName == "" ? "TDDC" : DataSetName, SpatialReference); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                PluginServiceInterface.CommonHelper.RecordsErrLog("创建要素集异常:", ex); | 
						|
                throw ex; | 
						|
            } | 
						|
        } | 
						|
 | 
						|
    } | 
						|
}
 | 
						|
 |