using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using KGIS.Framework.DBOperator; using KGIS.Framework.Maps; using KGIS.Framework.Platform.Helper; using KGIS.Framework.Utils; using KGIS.Framework.Utils.Helper; using NetTopologySuite.IO; using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Windows; using KGIS.Framework.AE.ExtensionMethod; using Kingo.PluginServiceInterface; using KGIS.Framework.Platform; namespace Kingo.Plugin.BGResultManager.View { /// /// FrmGCDataToSHPGTY.xaml 的交互逻辑 /// public partial class FrmGCDataToSHPGTY : BaseWindow, IBGResultFormHelper { public static IGeometryFactory3 GeometryFactory3 { get; set; } IFeatureLayer featureClassJCtTB = null; public FrmGCDataToSHPGTY(IFeatureLayer featurelayer) { InitializeComponent(); InitViewData(featurelayer); } public void InitView(IFeatureLayer layer) { InitViewData(layer); } private void InitViewData(IFeatureLayer layer) { if (Platform.Instance.SystemType == SystemTypeEnum.BGFWCG) { this.Title = "变化图斑成果导出"; //txtTargetLayer.Text = "变化图斑"; txtTargetLayer.ItemsSource = new List() { "监测图斑" }; panelGLZD.Visibility = Visibility.Collapsed; Height = 220; } else { this.Title = "预变更成果导出"; //txtTargetLayer.Text = "监测图斑"; txtTargetLayer.ItemsSource = new List() { "监测图斑" }; panelGLZD.Visibility = Visibility.Visible; Height = 280; } txtTargetLayer.SelectedIndex = 0; featureClassJCtTB = layer; } /// /// 导出 /// /// /// private void BtnExport_Click(object sender, RoutedEventArgs e) { try { btnExport.IsEnabled = false; btnCanel.IsEnabled = false; if (!System.IO.Directory.Exists(btnImportDataPath.Text)) { MessageHelper.ShowTips("不存在保存路径下的该文件夹!"); return; } if (featureClassJCtTB == null) { MessageHelper.ShowTips("不存在需导出的图层!"); return; } //IFeatureLayer featureClassJCtTB = MapsManager.Instance.MapService.GetFeatureLayerByName("JCTB"); string fileName = featureClassJCtTB.Name; IQueryFilter queryfilter = new QueryFilterClass(); if (txtTarget.SelectedIndex != 2)//举证条件过滤 { queryfilter.WhereClause = string.Format("SFJZ='{0}'", txtTarget.SelectedIndex.ToString()); } if (featureClassJCtTB.FeatureClass.FeatureCount(queryfilter) == 0) { MessageHelper.ShowTips("当前条件下并无数据!"); return; } fileName = featureClassJCtTB.FeatureClass.AliasName; if (rdGJJC.IsChecked == true)//GTY格式导出 { string dbPath = System.IO.Path.Combine(SysAppPath.GetCurrentAppPath() + "工作空间\\模板\\GTY模板文件", "610000NDBG2021.gty.db"); if (!System.IO.File.Exists(dbPath)) { MessageHelper.ShowTips("不存在GTY文件的DB模板!路径:" + dbPath); return; } //string DBFields = "TBBSM,XZQDM,XMC,JCBH,JCMJ,XZDM,XZMC,CSDM,CSMC,YSTBBH,TBLX,QSX,HSX,BZ,TZ,SHAPEAREA,SJDRLY,XZB,YZB,YZBLONGITUDE,LATITUDE,SHAPE"; string DBFields = ""; if (Platform.Instance.SystemType == SystemTypeEnum.BGFWCG) DBFields = "XZQDM,XMC,JCBH,TBLX,TZ,HSX,DDTC,XZB,YZB,JCMJ,BGDL,BGFW,WBGLX,BZ,SHAPEAREA,SHAPE"; else DBFields = "TBBSM,XZQDM,XMC,JCBH,JCMJ,YSTBBH,TBLX,HSX,BZ,TZ,SHAPEAREA,XZB,YZB,SHAPE"; List sqls = new List(); SQLiteDBOperate.Instance.ExecuteNonQuery(dbPath, "delete from NDBG2021", null); IFeatureCursor featureCursor = featureClassJCtTB.FeatureClass.Search(queryfilter, true); IFeature feature = null; IFields fields = featureClassJCtTB.FeatureClass.Fields; while ((feature = featureCursor.NextFeature()) != null) { string DBValue = ""; string[] fieldArr = DBFields.Split(','); foreach (string dbField in fieldArr) { if (dbField == "SHAPE") { object jObject = null; ISpatialReferenceFactory NewSpatialReference = new SpatialReferenceEnvironmentClass(); ISpatialReference s = NewSpatialReference.CreateGeographicCoordinateSystem(4490); IGeometry geo = feature.ShapeCopy; geo.Project(s); jObject = geo.ToJson(); DBValue += string.Format("'{0}',", jObject.ToString()); //每个位置必存在对应值 continue; } if (fields.FindField(dbField) != -1) { if ("XZB,YZB".Contains(dbField) && string.IsNullOrWhiteSpace(feature.Value[fields.FindField(dbField)].ToString())) DBValue += string.Format("{0},", 0); else if ("XZB,YZB".Contains(dbField)) DBValue += string.Format("{0},", feature.Value[fields.FindField(dbField)]); else DBValue += string.Format("'{0}',", feature.Value[fields.FindField(dbField)]); } else { if (dbField == "TBBSM") { if (string.IsNullOrWhiteSpace(feature.Value[fields.FindField("BSM")].ToString())) { DBValue += Guid.NewGuid() + ","; } else { DBValue += string.Format("'{0}',", feature.Value[fields.FindField("BSM")]); } } else if (dbField == "SHAPEAREA") { DBValue += string.Format("'{0}',", feature.Value[fields.FindField("SHAPE_Area")]); } else if (dbField == "YSTBBH") { DBValue += string.Format("'{0}',", feature.Value[fields.FindField("TBBH")]); } else { if ("YZBLONGITUDE,LATITUDE".Contains(dbField) && string.IsNullOrWhiteSpace(feature.Value[fields.FindField(dbField)].ToString())) DBValue += string.Format("{0},", 0); else if ("YZBLONGITUDE,LATITUDE".Contains(dbField)) DBValue += string.Format("{0},", feature.Value[fields.FindField(dbField)]); else DBValue += string.Format("'{0}',", "");//每个位置必存在对应值 } } } sqls.Add(string.Format("insert into NDBG2021 ({0})" + " VALUES ({1})", DBFields, DBValue.Trim(','))); int asd = DBValue.Trim(',').Split(',').Length; } SQLiteDBOperate.Instance.ExecuteNoQueryList(dbPath, sqls); string NewGTYName = Guid.NewGuid() + "NDBG2022.gty"; string NewdbPath = System.IO.Path.Combine(btnImportDataPath.Text, NewGTYName); System.IO.File.Copy(dbPath, NewdbPath); MessageHelper.ShowTips("GTY文件导出成功!"); } else//SHP格式导出 { if (System.IO.File.Exists(System.IO.Path.Combine(btnImportDataPath.Text, fileName + ".shp")) || System.IO.File.Exists(System.IO.Path.Combine(btnImportDataPath.Text, fileName + ".SHP"))) { if (MessageHelper.ShowYesNoAndTips("同名文件已存在,是否替换?") != System.Windows.Forms.DialogResult.Yes) { return; } DeleteShp(featureClassJCtTB.FeatureClass.AliasName, btnImportDataPath.Text); } ExportFeaturesToShp(featureClassJCtTB.FeatureClass, queryfilter, btnImportDataPath.Text, fileName); } } catch (Exception ex) { LogAPI.Debug(ex.Message); } finally { btnExport.IsEnabled = true; btnCanel.IsEnabled = true; } } /// /// 导出SHP数据 /// /// /// /// /// public 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; int count = 0; try { if (pSourceFeatureClass == null) { MessageHelper.ShowTips("未获取到要素集!"); return; } if (!System.IO.Directory.Exists(forlder)) { System.IO.Directory.CreateDirectory(forlder); } count = pSourceFeatureClass.FeatureCount(pQueryFilter); pFeatureCursor = pSourceFeatureClass.Search(pQueryFilter, true); ProgressHelper.ShowProcessBar("正在导出,请稍候..."); workFactory = new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactoryClass(); pFeatureWorkspace = workFactory.OpenFromFile(forlder, 0) as IFeatureWorkspace; //创建字段信息 IFields pFields = new FieldsClass(); IFieldsEdit pFieldsEdit = pFields as IFieldsEdit; List fieldNames = new List(); for (int i = 0; i < pSourceFeatureClass.Fields.FieldCount; i++) { IField field = pSourceFeatureClass.Fields.get_Field(i); //if ("XZQTZLX,BGZT,JCZT,TZ,BGDL,BGFW,WBGLX,SJLY,SFJCTB,NYJY,NYYPDL,SFJZ,ONLYZLBG".Contains(field.Name)) // continue; if (Platform.Instance.SystemType == SystemTypeEnum.BGFWCG) { if (!"XZQDM,XMC,JCBH,TBLX,TZ,HSX,DDTC,XZB,YZB,JCMJ,BGDL,BGFW,WBGLX,BZ,SHAPEAREA,SHAPE".Contains(field.Name)) continue; } 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); int num = 0; ProgressHelper.CountProgress = count; Dictionary dicMatchFields = new Dictionary(); GetMatchFieldsDirectory(pSourceFeatureClass, pFeatureClass, ref dicMatchFields, true); IFeatureBuffer featureAdd = pFeatureClass.CreateFeatureBuffer(); IFeature pFeature = null; while ((pFeature = pFeatureCursor.NextFeature()) != null) { featureAdd.Shape = pFeature.Shape; foreach (KeyValuePair 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); num++; if (num % 100 == 0 || num == count) { ProgressHelper.CurrentProgress = num; } } pInsertFeatureCursor.Flush(); ProgressHelper.CloseProcessBar(); MessageHelper.ShowTips("SHP文件导出成功!"); //关闭lock IWorkspaceFactoryLockControl ipWsFactoryLock = (IWorkspaceFactoryLockControl)workFactory; if (ipWsFactoryLock.SchemaLockingEnabled) { ipWsFactoryLock.DisableSchemaLocking(); } } catch (Exception ex) { ProgressHelper.CloseProcessBar(); MessageHelper.ShowError("导出SHAPE文件出错:" + ex.Message); LogAPI.Debug("导出SHAPE文件出错,可能的原因是:" + ex.Message); } 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); } } } /// /// 获得匹配的字段索引集合 /// /// 源要素类 /// 目标要素类 /// 匹配字段集合-KEY为目标图层字段,VALUE为源图层字段 /// 是否获取必须字段 public static void GetMatchFieldsDirectory(IClass pSourceClass, IClass pTargetClass, ref Dictionary 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)); } } } /// /// 删除同名SHP /// /// 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) { LogAPI.Debug("删除shp失败,报错原因是:" + ex.Message); } finally { if (pWorkspaceFactory != null) { Marshal.ReleaseComObject(pWorkspaceFactory); } if (pWorkspace != null) { Marshal.ReleaseComObject(pWorkspace); } if (pFeatureClass != null) { Marshal.ReleaseComObject(pFeatureClass); } } } /// /// 选择保存路径 /// /// /// private void BtnSelectedImportDataPath_Click(object sender, RoutedEventArgs e) { KGIS.Framework.Utils.Dialog.FolderBrowserDialog pBrowser = new KGIS.Framework.Utils.Dialog.FolderBrowserDialog { ShowNewFolderButton = true }; if (pBrowser.ShowDialog() == System.Windows.Forms.DialogResult.OK) { btnImportDataPath.Text = pBrowser.SelectedPath; } } public static string ConvertIGeoemtryToWKT(IGeometry geometry) { return ConvertWKBToWKT(ConvertGeometryToWKB(geometry)); } /// /// IGeometry转WKB /// /// /// public static byte[] ConvertGeometryToWKB(IGeometry geometry) { //IWkb wkb = geometry as IWkb; ITopologicalOperator oper = geometry as ITopologicalOperator; oper.Simplify(); if (GeometryFactory3 == null) { GeometryFactory3 = new GeometryEnvironment() as IGeometryFactory3; } byte[] b = GeometryFactory3.CreateWkbVariantFromGeometry(geometry) as byte[]; return b; } /// /// WKB转WKT /// /// /// public static string ConvertWKBToWKT(byte[] wkb) { try { WKTWriter writer = new WKTWriter(); WKBReader reader = new WKBReader(); return writer.Write(reader.Read(wkb)); } catch (Exception ex) { return ex.Message; } } private void BtnCanel_Click(object sender, RoutedEventArgs e) { this.Close(); } } }