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; |
|
} |
|
} |
|
|
|
} |
|
}
|
|
|