using ESRI.ArcGIS.DataSourcesGDB; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using Kingo.Crypto; using System; using System.Collections.Generic; using System.Data; using System.Data.SQLite; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Kingo.RuleCheck.CheckHelper { public class DBToMDBHelper { /// /// db路径 /// private string DBPath { get; set; } /// /// 省级解密DB包 /// /// /// /// /// public DataTable SJDecryptDB(string dbPath, string SM2PrivateKey,out string tempDBPath) { if (string.IsNullOrWhiteSpace(dbPath)) { throw new Exception("DBPath参数为空,无法转换!"); } string tempFolder = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(dbPath), "质检文件夹"); if (!System.IO.Directory.Exists(tempFolder)) { System.IO.Directory.CreateDirectory(tempFolder); } try { string[] files = System.IO.Directory.GetFiles(tempFolder, "*.*"); if (files != null) { foreach (var item in files) { System.IO.File.Delete(item); } } } catch { } tempDBPath = System.IO.Path.Combine(tempFolder, System.IO.Path.GetFileNameWithoutExtension(dbPath) + "_checkTemp.db"); System.IO.File.Copy(dbPath, tempDBPath, true); this.DBPath = tempDBPath; DataTable dataTable = ExecuteDataTable("SELECT WKID,Encrypted,pwd FROM ysj"); string sfjm = dataTable.Rows[0][1].ToString(); if (sfjm == "1") { if (dataTable.Rows[0][2] is DBNull) { throw new Exception("db包元数据(YSJ)表中加密字段(Encrypted)为1,标识是加密包,但Pwd(密码字段)为空!"); } string pwd = dataTable.Rows[0][2].ToString(); if (string.IsNullOrWhiteSpace(SM2PrivateKey)) { throw new Exception("db包是加密包,但非对称加密私钥(SM2PrivateKey)参数为空!"); } DecryptDB(System.Text.Encoding.UTF8.GetString(Kingo.Crypto.SM2.Decrypt(SM2PrivateKey, pwd))); } return ExecuteDataTable("select tbbsm from wyrw where fwy<>1 or fwy is null"); } /// /// 将DB矢量化为单个MDB(预处理时只矢量化一个mdb) /// /// 需要矢量化的DB文件路径 /// 如果db存在密码,则将密码传输过来 /// 矢量化后MDB文件路径(可选参数) /// 坐标参考容差:默认0.0001 /// 矢量化后MDB文件路径 public string DBToSingleMdb(string dbPath, string SM2PrivateKey = "", string dbKey = "", string saveMDBPath = "", double tolerance = 0.0001) { IWorkspaceFactory2 wsFactory = null; IWorkspace workspace = null; try { if (string.IsNullOrWhiteSpace(dbPath)) { throw new Exception("DBPath参数为空,无法转换!"); } string tempFolder = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(dbPath), "质检文件夹"); if (!System.IO.Directory.Exists(tempFolder)) { System.IO.Directory.CreateDirectory(tempFolder); } try { string[] files = System.IO.Directory.GetFiles(tempFolder, "*.*"); if (files != null) { foreach (var item in files) { System.IO.File.Delete(item); } } } catch { } string tempDBPath = System.IO.Path.Combine(tempFolder, System.IO.Path.GetFileNameWithoutExtension(dbPath) + "_checkTemp.db"); System.IO.File.Copy(dbPath, tempDBPath, true); this.DBPath = tempDBPath; if (string.IsNullOrWhiteSpace(saveMDBPath)) { saveMDBPath = System.IO.Path.Combine(tempFolder, Guid.NewGuid().ToString().Replace("-", "") + ".mdb"); CreateLocalWorkspace(saveMDBPath); } //System.IO.File.Copy(tempMDB, saveMDBPath, true); DataTable hasTable = ExecuteDataTable("SELECT name FROM sqlite_master WHERE type = 'table' and name<>'sqlite_sequence' ORDER BY name;"); if (hasTable == null || hasTable.Rows.Count <= 0) { return saveMDBPath; //throw new Exception("db文件数据为空!"); } DataTable dataTable = ExecuteDataTable("SELECT WKID,Encrypted,pwd FROM ysj"); if (dataTable == null || dataTable.Rows.Count <= 0) { throw new Exception("db包元数据(YSJ)表为空,无法获取矢量化必要的坐标参考WKID!"); } if (dataTable.Rows[0][0] is DBNull) { throw new Exception("db包元数据(YSJ)表中WKID坐标参考为空!"); } string wkidStr = dataTable.Rows[0][0].ToString(); if (string.IsNullOrWhiteSpace(wkidStr) || wkidStr.Equals("0")) { throw new Exception("db包元数据(YSJ)表中WKID坐标参考为空!"); } if (dataTable.Rows[0][1] is DBNull) { throw new Exception("db包元数据(YSJ)表中是否加密字段(Encrypted)为空!"); } string sfjm = dataTable.Rows[0][1].ToString(); if (sfjm == "1") { if (dataTable.Rows[0][2] is DBNull) { throw new Exception("db包元数据(YSJ)表中加密字段(Encrypted)为1,标识是加密包,但Pwd(密码字段)为空!"); } string pwd = dataTable.Rows[0][2].ToString(); if (string.IsNullOrWhiteSpace(SM2PrivateKey)) { throw new Exception("db包是加密包,但非对称加密私钥(SM2PrivateKey)参数为空!"); } DecryptDB(System.Text.Encoding.UTF8.GetString(Kingo.Crypto.SM2.Decrypt(SM2PrivateKey, pwd))); } wsFactory = new AccessWorkspaceFactoryClass(); workspace = wsFactory.OpenFromFile(saveMDBPath, 0); IProjectedCoordinateSystem spatialReference = GeometryConvertHelper.CreateProjectedCoordinateSystem(int.Parse(wkidStr)); IFeatureDataset featureDataset = null; try { featureDataset = (workspace as IFeatureWorkspace).OpenFeatureDataset("TDBZSJJ"); } catch { featureDataset = CreateFeatureDataset(workspace, "TDBZSJJ", spatialReference); } SetGeoDatasetSpatialReference(workspace, spatialReference, tolerance); //设置坐标参考精度XYUnits 为二万分之一 try { workspace.ExecuteSQL(string.Format("UPDATE GDB_SpatialRefs SET XYUnits = 20000 ,XYTolerance = {0}", tolerance)); } catch { } foreach (DataRow dr in hasTable.Rows) { CreateFeatureClassAndImportData(featureDataset, dr[0] as string, dbKey); } return saveMDBPath; } catch (Exception ex) { throw ex; } finally { if (workspace != null) { try { IDatabaseCompact databaseCompact = workspace as IDatabaseCompact; databaseCompact.Compact(); } catch { } System.Runtime.InteropServices.Marshal.ReleaseComObject(workspace); } if (wsFactory != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(wsFactory); } } } /// /// 将DB根据外业任务图斑图层矢量化为多个MDB /// /// 需要矢量化的DB文件路径 /// 需要矢量化的DB文件路径 /// 过程数据文件 /// 如果db存在密码,则将密码传输过来 /// 矢量化后MDB文件路径(可选参数) /// 坐标参考容差:默认0.0001 /// 矢量化后MDB文件路径 public List DBToMdb(string dbPath, out string sProcessDataPath, string SM2PrivateKey = "", string dbKey = "", string saveMDBPath = "", double tolerance = 0.0001) { List mdbList = new List(); if (string.IsNullOrWhiteSpace(dbPath)) { throw new Exception("DBPath参数为空,无法转换!"); } string tempFolder = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(dbPath), "质检文件夹"); //过程数据路径 sProcessDataPath = System.IO.Path.Combine(tempFolder, DateTime.Now.ToString("yyyyMMddHHmmss") + $".mdb"); if (!System.IO.Directory.Exists(tempFolder)) { System.IO.Directory.CreateDirectory(tempFolder); } try { string[] files = System.IO.Directory.GetFiles(tempFolder, "*.*"); if (files != null) { foreach (var item in files) { System.IO.File.Delete(item); } } } catch { } string tempDBPath = System.IO.Path.Combine(tempFolder, System.IO.Path.GetFileNameWithoutExtension(dbPath) + "_checkTemp.db"); System.IO.File.Copy(dbPath, tempDBPath, true); this.DBPath = tempDBPath; DataTable dataTable = ExecuteDataTable("SELECT WKID,Encrypted,pwd FROM ysj"); if (dataTable == null || dataTable.Rows.Count <= 0) { throw new Exception("db包元数据(YSJ)表为空,无法获取矢量化必要的坐标参考WKID!"); } if (dataTable.Rows[0][0] is DBNull) { throw new Exception("db包元数据(YSJ)表中WKID坐标参考为空!"); } string wkidStr = dataTable.Rows[0][0].ToString(); if (string.IsNullOrWhiteSpace(wkidStr) || wkidStr.Equals("0")) { throw new Exception("db包元数据(YSJ)表中WKID坐标参考为空!"); } if (dataTable.Rows[0][1] is DBNull) { throw new Exception("db包元数据(YSJ)表中是否加密字段(Encrypted)为空!"); } string sfjm = dataTable.Rows[0][1].ToString(); if (sfjm == "1") { if (dataTable.Rows[0][2] is DBNull) { throw new Exception("db包元数据(YSJ)表中加密字段(Encrypted)为1,标识是加密包,但Pwd(密码字段)为空!"); } string pwd = dataTable.Rows[0][2].ToString(); if (string.IsNullOrWhiteSpace(SM2PrivateKey)) { throw new Exception("db包是加密包,但非对称加密私钥(SM2PrivateKey)参数为空!"); } DecryptDB(System.Text.Encoding.UTF8.GetString(Kingo.Crypto.SM2.Decrypt(SM2PrivateKey, pwd))); } DataTable hasTable = ExecuteDataTable("SELECT name FROM sqlite_master WHERE type = 'table' and name<>'sqlite_sequence' ORDER BY name;"); if (hasTable == null || hasTable.Rows.Count <= 0) { return mdbList; } DataTable wyrwTable = ExecuteDataTable("select tbbsm from wyrw where fwy<>1 or fwy is null;"); if (wyrwTable == null || wyrwTable.Rows.Count <= 0) { return mdbList; } foreach (DataRow item in wyrwTable.Rows) { string tbbsm = item["tbbsm"].ToString(); //if (string.IsNullOrWhiteSpace(saveMDBPath)) //{ saveMDBPath = System.IO.Path.Combine(tempFolder, Guid.NewGuid().ToString().Replace("-", "") + $"_{tbbsm}.mdb"); //} string mdbPath = DBToMdb(dbPath, tbbsm, tempFolder, hasTable, wkidStr, SM2PrivateKey, dbKey, saveMDBPath, sProcessDataPath, tolerance); mdbList.Add(mdbPath); } return mdbList; } /// /// 生成参考图层 /// /// 辅助数据 /// public void CreateProcessData(Dictionary dicReferenceData, string sProcessDataPath) { IFeatureClass featureClass = null; try { if (!dicReferenceData.ContainsKey("JCK_DLTB")) throw new Exception("未检测到参考数据,基础库DLTB"); string sBaseDataPath = dicReferenceData["JCK_DLTB"]; if (!dicReferenceData.ContainsKey("PDT")) throw new Exception("未检测到参考数据,坡度图"); string sPDTPath = dicReferenceData["PDT"]; if (!dicReferenceData.ContainsKey("LNGD")) throw new Exception("未检测到参考数据,历年耕地"); string sLNGDPath = dicReferenceData["LNGD"]; GeoprocessorHelper.FeatureClassToFeatureClass(sBaseDataPath, sProcessDataPath, "DLTB", ref featureClass, false); GeoprocessorHelper.FeatureClassToFeatureClass(sLNGDPath, sProcessDataPath, "LNGD", ref featureClass, false); GeoprocessorHelper.FeatureClassToFeatureClass(sPDTPath, sProcessDataPath, "PDT", ref featureClass, false); //DTBDLTBGX与基础库叠加 GeoprocessorHelper.IntersectAnalysis(new List { $"{sProcessDataPath}\\DTBDLTBGX", $"{sProcessDataPath}\\DLTB" }, $"{sProcessDataPath}\\Inter", ref featureClass, false); #region 生成N图层 提取->擦除 GeoprocessorHelper.SelectAnalysis($"{sProcessDataPath}\\DLTB", $"{sProcessDataPath}\\JCK_N", "bsm in (select bsm_1 from Inter)", ref featureClass, false); GeoprocessorHelper.EraseAnalysis($"{sProcessDataPath}\\JCK_N", $"{sProcessDataPath}\\DTBDLTBGX", $"{sProcessDataPath}\\Erase_N", ref featureClass, false); GeoprocessorHelper.MultipartToSinglepart($"{sProcessDataPath}\\Erase_N", $"{sProcessDataPath}\\N", ref featureClass, true); //生成五要素 GenerateAttributeHelper.CheckExtFiled(featureClass); GenerateAttributeHelper.SetFeatureAttribute(featureClass); #endregion #region LNGD_R 叠加 GeoprocessorHelper.IntersectAnalysis(new List { $"{sProcessDataPath}\\Inter", $"{sProcessDataPath}\\LNGD" }, $"{sProcessDataPath}\\LNGD_R", ref featureClass, false); #endregion #region HFSX_R 叠加 GeoprocessorHelper.IntersectAnalysis(new List { $"{sProcessDataPath}\\Inter", $"{sProcessDataPath}\\PDT" }, $"{sProcessDataPath}\\HFSX_R", ref featureClass, false); #endregion } catch (Exception ex) { throw new Exception("生成单图斑建库N图层异常:" + ex.Message); } finally { if (featureClass != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(featureClass); } } } /// /// 将DB矢量化为MDB /// /// 需要矢量化的DB文件路径 /// 如果db存在密码,则将密码传输过来 /// 矢量化后MDB文件路径(可选参数) /// 过程数据路径 /// 坐标参考容差:默认0.0001 /// 矢量化后MDB文件路径 private string DBToMdb(string dbPath, string tbbsm, string tempFolder, DataTable hasTable, string wkidStr, string SM2PrivateKey = "", string dbKey = "", string saveMDBPath = "", string sProcessDataPath = "", double tolerance = 0.0001) { IWorkspaceFactory2 wsFactory = null; IWorkspace workspace = null; try { CreateLocalWorkspace(saveMDBPath); wsFactory = new AccessWorkspaceFactoryClass(); workspace = wsFactory.OpenFromFile(saveMDBPath, 0); IProjectedCoordinateSystem spatialReference = GeometryConvertHelper.CreateProjectedCoordinateSystem(int.Parse(wkidStr)); IFeatureDataset featureDataset = null; try { featureDataset = (workspace as IFeatureWorkspace).OpenFeatureDataset("TDBZSJJ"); } catch { featureDataset = CreateFeatureDataset(workspace, "TDBZSJJ", spatialReference); } SetGeoDatasetSpatialReference(workspace, spatialReference, tolerance); //设置坐标参考精度XYUnits 为二万分之一 try { workspace.ExecuteSQL(string.Format("UPDATE GDB_SpatialRefs SET XYUnits = 20000 ,XYTolerance = {0}", tolerance)); } catch { } foreach (DataRow dr in hasTable.Rows) { string tableName = dr[0].ToString().ToUpper(); string whereSql = ""; if (tableName == "DTBDLTBGX" || tableName == "GJFKJG" || tableName == "LABEL" || tableName == "NYYSRESULT" || tableName == "RETURNCOMMENTS" || tableName == "SJSHBZ" || tableName == "WYSKETCH" || tableName == "DTBDLTBGXGC" || tableName == "WYRW") { whereSql = $" where tbbsm='{tbbsm}'"; } else if (tableName == "WYHCCG") { whereSql = $" where hcrwbsm='{tbbsm}'"; } else if (tableName == "WYHCFJ") { whereSql = $" where hcjlbsm='{tbbsm}'"; } else if (tableName == "FJGX") { whereSql = $" where tbbsm in (select bsm from DTBDLTBGX where tbbsm ='{tbbsm}')"; } else if (tableName == "DTBCCWJQGX" || tableName == "DTBCZCDYDGX" || tableName == "DTBGFBQGX" || tableName == "DTBLMFWGX" || tableName == "DTBLSYDGX" || tableName == "DTBTTQGX" || tableName == "PZWJ") { whereSql = $" where bsm in (select bsm from DTBDLTBGX where tbbsm ='{tbbsm}')"; } CreateFeatureClassAndImportData(featureDataset, dr[0] as string, dbKey, whereSql, sProcessDataPath); } return saveMDBPath; } catch (Exception ex) { throw ex; } finally { if (workspace != null) { try { IDatabaseCompact databaseCompact = workspace as IDatabaseCompact; databaseCompact.Compact(); } catch { } System.Runtime.InteropServices.Marshal.ReleaseComObject(workspace); } if (wsFactory != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(wsFactory); } } } /// /// 解密db /// /// /// 对称加密秘钥 private void DecryptDB(string sm4PrivateKey, string dbKey = "") { try { List listTableName = new List() { "dtbdltbgx", "wyrw" , "DTBDLTBGXGC" }; foreach (var item in listTableName) { DataTable dataTable = ExecuteDataTable($"select bsm,egeometry from {item}", null, dbKey); if (dataTable == null || dataTable.Rows.Count <= 0) { return; } string excuteSQL = "update {2} set egeometry='{0}' where bsm='{1}'"; foreach (DataRow dataRow in dataTable.Rows) { string geometryStr = dataRow["egeometry"] as string; try { geometryStr = SM4Decrypt(geometryStr, sm4PrivateKey); } catch (Exception ex) { try { ESRI.ArcGIS.Geometry.IGeometry geometry = GeometryConvertHelper.ConverJsonToIGeoemtry(geometryStr); } catch { throw ex; } } ExecuteSQL(string.Format(excuteSQL, geometryStr, dataRow["bsm"], item), dbKey); } } ExecuteSQL("update ysj set Encrypted=0,pwd=null", dbKey); } catch (Exception ex) { throw new Exception("解密任务包异常:" + ex.Message); } } /// /// 创建要素类并导入数据 /// /// /// /// /// private void CreateFeatureClassAndImportData(IFeatureDataset featureDataset, string tableName, string dbKey = "", string whereSql = "", string sProcessDataPath = "") { ITable table = null; try { DataTable dataTable = ExecuteDataTable($"select * from {tableName} {whereSql}", null, dbKey); if (dataTable == null) { return; } IFields fields = GetFieldsByDataTable(dataTable); switch (tableName.ToLower()) { //属性表 case "ysj": case "dtbdltbgxgc": case "nyysresult": case "dtbccwjqgx": case "dtbczcdydgx": case "dtblsydgx": case "dtbgfbqgx": case "dtblmfwgx": case "dtbttqgx": case "returncomments": case "wyhccg": case "wyhcfj": case "fjgx": //创建必要字段OBJECTID,SHAPE CreateMainField(fields as IFieldsEdit, null, esriGeometryType.esriGeometryNull); try { table = (featureDataset.Workspace as IFeatureWorkspace).OpenTable(tableName); table.DeleteSearchedRows(null); } catch { table = (featureDataset.Workspace as IFeatureWorkspace).CreateTable(tableName, fields, null, null, ""); } break; case "dtbdltbgx"://变更范围 case "wyrw"://外业任务 //创建必要字段OBJECTID,SHAPE CreateMainField(fields as IFieldsEdit, (featureDataset as IGeoDataset).SpatialReference, esriGeometryType.esriGeometryPolygon); try { table = (featureDataset.Workspace as IFeatureWorkspace).OpenTable(tableName); table.DeleteSearchedRows(null); } catch { table = featureDataset.CreateFeatureClass(tableName, fields, null, null, esriFeatureType.esriFTSimple, "Shape", "") as ITable; } break; //case "wysketch"://预处理指导草图 // //创建必要字段OBJECTID,SHAPE // CreateMainField(fields as IFieldsEdit, esriGeometryType.esriGeometryPolygon, null); // break; //case "sjshbz"://省级审核标注 // Dictionary dciBZTable = new Dictionary(); // dciBZTable.Add("点", "SHBZPoint"); // dciBZTable.Add("线", "SHBZLine"); // dciBZTable.Add("面", "SHBZPolygon"); // foreach (var item in dciBZTable) // { // //创建必要字段OBJECTID,SHAPE // CreateMainField(fields as IFieldsEdit, esriGeometryType.esriGeometryPolygon, null); // table = featureDataset.CreateFeatureClass(tableName, fields, null, null, esriFeatureType.esriFTSimple, "Shape", "") as ITable; // dataTable = ExecuteDataTable($"select * from {tableName}", null, dbKey); // if (dataTable.Rows.Count <= 0) // { // return; // } // DataTableImportToMDB(dataTable, table); // } // break; //case "label"://外业草图 // //创建必要字段OBJECTID,SHAPE // CreateMainField(fields as IFieldsEdit, esriGeometryType.esriGeometryPolygon, null); // table = featureDataset.CreateFeatureClass(tableName, fields, null, null, esriFeatureType.esriFTSimple, "Shape", "") as ITable; // break; default: return; } //dataTable = ExecuteDataTable($"select * from {tableName}", null, dbKey); //if (dataTable.Rows.Count <= 0) //{ // return; //} DataTableImportToMDB(dataTable, table); //单图斑地类图斑更新层生成五要素 if (table != null && tableName.Equals("dtbdltbgx", StringComparison.CurrentCultureIgnoreCase)) { GenerateAttributeHelper.CheckExtFiled(table as IFeatureClass); GenerateAttributeHelper.SetFeatureAttribute(table as IFeatureClass); //合并单图斑地类图斑更新层 if (System.IO.File.Exists(sProcessDataPath)) { IWorkspaceFactory2 wsFactory = new AccessWorkspaceFactoryClass(); IWorkspace workspace = wsFactory.OpenFromFile(sProcessDataPath, 0); ITable pTable = (workspace as IFeatureWorkspace).OpenTable("DTBDLTBGX"); DataTableImportToMDB(dataTable, pTable); System.Runtime.InteropServices.Marshal.ReleaseComObject(pTable); System.Runtime.InteropServices.Marshal.ReleaseComObject(workspace); System.Runtime.InteropServices.Marshal.ReleaseComObject(wsFactory); } else System.IO.File.Copy(featureDataset.Workspace.PathName, sProcessDataPath); } } catch (Exception ex) { throw ex; } finally { if (table != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(table); } } } /// /// DataTable数据插入到MDB /// /// /// private void DataTableImportToMDB(DataTable dataTable, ITable table) { ICursor cursor = null; try { cursor = table.Insert(true); IRowBuffer rowBuffer = table.CreateRowBuffer(); int indexShape = table.FindField("Shape"); foreach (DataRow dr in dataTable.Rows) { foreach (DataColumn dc in dataTable.Columns) { int index = table.FindField(dc.ColumnName); if (index > -1) { rowBuffer.set_Value(index, dr[dc.ColumnName]); } //处理图形 if (dc.ColumnName.EndsWith("geometry", StringComparison.CurrentCultureIgnoreCase) && indexShape > -1 && !string.IsNullOrWhiteSpace(dr[dc.ColumnName] as string)) { IGeometry geometry = null; IFeatureClass featureClass = table as ESRI.ArcGIS.Geodatabase.IFeatureClass; if (featureClass != null) { switch (featureClass.ShapeType) { case esriGeometryType.esriGeometryPoint: geometry = GeometryConvertHelper.ConverJsonToIGeoemtry(dr[dc.ColumnName] as string, esriGeometryType.esriGeometryPoint); break; case esriGeometryType.esriGeometryPolyline: geometry = GeometryConvertHelper.ConverJsonToIGeoemtry(dr[dc.ColumnName] as string, esriGeometryType.esriGeometryPolyline); break; case esriGeometryType.esriGeometryPolygon: geometry = GeometryConvertHelper.ConverJsonToIGeoemtry(dr[dc.ColumnName] as string); break; } } if (geometry != null) { geometry.Project((table as IGeoDataset).SpatialReference); rowBuffer.set_Value(indexShape, geometry); } } } cursor.InsertRow(rowBuffer); } cursor.Flush(); } catch (Exception ex) { throw ex; } finally { if (cursor != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(cursor); } } } /// /// 创建要素数据集 /// /// /// /// /// public static IFeatureDataset CreateFeatureDataset(IWorkspace workspace, string datasetName, IProjectedCoordinateSystem spatialReference) { try { IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace; //确定是否支持高精度存储空间 Boolean supportsHighPrecision = false; IWorkspaceProperties workspaceProperties = (IWorkspaceProperties)workspace; IWorkspaceProperty workspaceProperty = workspaceProperties.get_Property (esriWorkspacePropertyGroupType.esriWorkspacePropertyGroup, (int)esriWorkspacePropertyType.esriWorkspacePropSupportsHighPrecisionStorage); if (workspaceProperty.IsSupported) { supportsHighPrecision = Convert.ToBoolean(workspaceProperty.PropertyValue); } //设置投影精度 IControlPrecision2 controlPrecision = (IControlPrecision2)spatialReference; controlPrecision.IsHighPrecision = supportsHighPrecision; //设置容差 ISpatialReferenceResolution spatialRefResolution = (ISpatialReferenceResolution)spatialReference; spatialRefResolution.ConstructFromHorizon(); spatialRefResolution.SetDefaultXYResolution(); ISpatialReferenceTolerance spatialRefTolerance = (ISpatialReferenceTolerance)spatialReference; spatialRefTolerance.SetDefaultXYTolerance(); //创建要素集 IFeatureDataset featureDataset = featureWorkspace.CreateFeatureDataset(datasetName, spatialReference); return featureDataset; } catch (Exception ex) { throw ex; } } /// /// 根据datatable创建矢量图层字段 /// /// /// private IFields GetFieldsByDataTable(DataTable dataTable) { try { IFields fields = new FieldsClass(); IFieldsEdit pFieldsEdit = (IFieldsEdit)fields; foreach (DataColumn column in dataTable.Columns) { IField pField = new FieldClass(); IFieldEdit pFieldEdit = (IFieldEdit)pField; if (!string.IsNullOrWhiteSpace(column.Caption)) { pFieldEdit.AliasName_2 = column.Caption; } if (column.DataType == typeof(string)) { pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString; } else if (column.DataType == typeof(int) || column.DataType == typeof(int?)) { pFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger; } else if (column.DataType == typeof(float) || column.DataType == typeof(float) || column.DataType == typeof(double) || column.DataType == typeof(double?) || column.DataType == typeof(decimal) || column.DataType == typeof(decimal?)) { pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble; } else if (column.DataType == typeof(DateTime) || column.DataType == typeof(DateTime?)) { pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDate; } else { pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString; } pFieldEdit.Name_2 = column.ColumnName; if (!(column.DefaultValue is DBNull)) { pFieldEdit.DefaultValue_2 = column.DefaultValue; } else { pFieldEdit.DefaultValue_2 = DBNull.Value; } pFieldEdit.IsNullable_2 = column.AllowDBNull; if (column.ColumnName.ToLower().EndsWith("geometry") || column.ColumnName.ToLower().Equals("bz") || column.ColumnName.ToUpper().Equals("CHECK_CODE") || column.ColumnName.ToUpper().Equals("POINTS_JSON")) { pFieldEdit.Length_2 = column.MaxLength; } //pFieldEdit.Precision_2 = column.; pFieldsEdit.AddField(pField); } return fields; } catch (Exception ex) { throw ex; } } /// /// 建立主要字段(OBJECTID和SHAPE) /// /// IFieldsEdit,把OBJECTID和SHAPE字段加进去 /// 空间参数 private static void CreateMainField(IFieldsEdit pFieldsEdit, ISpatialReference pSpatialReference, esriGeometryType pGeometryType = esriGeometryType.esriGeometryNull) { IField pField; IFieldEdit pFieldEdit; //建立OBJECTID字段 pField = new FieldClass(); pFieldEdit = pField as IFieldEdit; pFieldEdit.Name_2 = "OBJECTID"; pFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID; pFieldsEdit.AddField(pField); if (pGeometryType == esriGeometryType.esriGeometryNull) { return; } //建立shap字段 pField = new FieldClass(); pFieldEdit = pField as IFieldEdit; pFieldEdit.Name_2 = "SHAPE"; pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry; IGeometryDef pGeometryDef = new GeometryDefClass(); IGeometryDefEdit pGeometryDefEdit = pGeometryDef as IGeometryDefEdit; pGeometryDefEdit.GeometryType_2 = pGeometryType; pGeometryDefEdit.SpatialReference_2 = pSpatialReference; pFieldEdit.GeometryDef_2 = pGeometryDef; pFieldsEdit.AddField(pField); } /// /// 查询 /// /// 查询语句 /// 参数 /// private DataTable ExecuteDataTable(string sql, SQLiteParameter[] parameters = null, string keyCode = "") { try { using (SQLiteConnection connection = new SQLiteConnection("Data Source=" + this.DBPath)) { using (SQLiteCommand command = new SQLiteCommand(sql, connection)) { if (parameters != null) { command.Parameters.AddRange(parameters); } SQLiteDataAdapter adapter = new SQLiteDataAdapter(command); DataTable data = new DataTable(); try { adapter.Fill(data); } catch { if (!string.IsNullOrWhiteSpace(keyCode)) connection.SetPassword(keyCode); adapter.Fill(data); } return data; } } } catch (Exception ex) { throw new Exception("无法数据包:" + ex.Message); } } /// /// DB执行SQL /// /// /// /// private bool ExecuteSQL(string sql, string keyCode) { using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + this.DBPath)) { if (!string.IsNullOrWhiteSpace(keyCode)) { conn.SetPassword(keyCode); } conn.Open(); using (SQLiteCommand cmd = new SQLiteCommand(conn)) { try { cmd.CommandText = sql; cmd.ExecuteNonQuery(); } catch (Exception ex) { throw ex; } } conn.Close(); } return true; } /// /// 给指定工作空间中的对象设置空间参考 /// /// 工作空间 /// 空间参考对象 /// 数据库容差 private void SetGeoDatasetSpatialReference(IWorkspace pWS, ISpatialReference pSR, double pTolerance) { try { //double a = 0; //double b = 0; //double c = 0; //double d = 0; //pSR.SetDomain(-100000000, 0, 0, 0); //pSR.GetDomain(out a, out b, out c, out d); if (pSR != null) { //ISpatialReferenceResolution toleranceResolution = pSR as ISpatialReferenceResolution; //toleranceResolution.set_XYResolution(true, 0.00005); ISpatialReferenceTolerance tolerance = pSR as ISpatialReferenceTolerance; if (tolerance != null) { tolerance.XYTolerance = pTolerance; tolerance.ZTolerance = pTolerance; tolerance.MTolerance = pTolerance; } } IEnumDataset pEnumDataset = pWS.Datasets[esriDatasetType.esriDTFeatureDataset]; IDataset ds = null; if (pEnumDataset != null) { while ((ds = pEnumDataset.Next()) != null) { if (ds is IGeoDataset) { if ((ds as IGeoDataset).SpatialReference != pSR) (ds as IGeoDatasetSchemaEdit).AlterSpatialReference(pSR); } } } pEnumDataset = pWS.Datasets[esriDatasetType.esriDTFeatureClass]; if (pEnumDataset == null) { return; } while ((ds = pEnumDataset.Next()) != null) { if (ds is IGeoDataset) { if ((ds as IGeoDataset).SpatialReference != pSR) (ds as IGeoDatasetSchemaEdit).AlterSpatialReference(pSR); } } //设置坐标参考精度XYUnits 为二万分之一 try { pWS.ExecuteSQL(string.Format("UPDATE GDB_SpatialRefs SET XYUnits = 20000 ,XYTolerance = {0}", pTolerance)); //pWS.ExecuteSQL("UPDATE GDB_SpatialRefs SET FalseX=0,FalseY=0,XYUnits=100000,FalseZ=0,ZUnits=0,FalseM=0,MUnits=0,XYTolerance=0.0001,ZTolerance=0,MTolerance=0"); } catch (Exception ex) { throw new Exception("设置坐标参考坐标精度和容差异常:" + ex.Message); } } catch (Exception ex) { throw ex; } } /// /// 创建本地工作空间 /// /// 文件路径 /// private static IWorkspace CreateLocalWorkspace(string pPath) { string gdbExtention = System.IO.Path.GetExtension(pPath).ToLower(); switch (gdbExtention) { case ".gdb": return CreateWorkspace(pPath); case ".mdb": return CreateWorkspace(pPath); default: return null; } } /// /// 创建本地工作空间 /// /// 工作空间类型 /// 文件路径 /// IWorkspace private static IWorkspace CreateWorkspace(string pPath) where T : IWorkspaceFactory, new() { if (string.IsNullOrEmpty(pPath)) { return null; } try { string sDirName = System.IO.Path.GetDirectoryName(pPath); string sFileName = System.IO.Path.GetFileName(pPath); IWorkspaceName pWorkspaceName = new T().Create(sDirName, sFileName, null, 0); if (pWorkspaceName == null) { return null; } return (pWorkspaceName as IName).Open() as IWorkspace; } catch (Exception ex) { throw ex; } } /// /// 对称解密 /// private static string SM4Decrypt(string txtWord, string key) { try { //if (string.IsNullOrWhiteSpace(PubKeySM2)) //{ // PrvKeySM4 = KGIS.Framework.Utils.SysConfigsOprator.GetAppsetingValueByKey("SM4K"); //} SM4 sm4 = new SM4(); sm4.secretKey = key; sm4.hexString = true; return sm4.DecryptECB(txtWord); } catch (Exception ex) { throw ex; } } } }