|
|
|
|
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
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// db路径
|
|
|
|
|
/// </summary>
|
|
|
|
|
private string DBPath { get; set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 省级解密DB包
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="dbPath"></param>
|
|
|
|
|
/// <param name="SM2PrivateKey"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
/// <exception cref="Exception"></exception>
|
|
|
|
|
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");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 将DB矢量化为单个MDB(预处理时只矢量化一个mdb)
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="dbPath">需要矢量化的DB文件路径</param>
|
|
|
|
|
/// <param name="dbKey">如果db存在密码,则将密码传输过来</param>
|
|
|
|
|
/// <param name="saveMDBPath">矢量化后MDB文件路径(可选参数)</param>
|
|
|
|
|
/// <param name="tolerance">坐标参考容差:默认0.0001</param>
|
|
|
|
|
/// <returns>矢量化后MDB文件路径</returns>
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 将DB根据外业任务图斑图层矢量化为多个MDB
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="dbPath">需要矢量化的DB文件路径</param>
|
|
|
|
|
/// <param name="dbPath">需要矢量化的DB文件路径</param>
|
|
|
|
|
/// <param name="sProcessDataPath">过程数据文件</param>
|
|
|
|
|
/// <param name="dbKey">如果db存在密码,则将密码传输过来</param>
|
|
|
|
|
/// <param name="saveMDBPath">矢量化后MDB文件路径(可选参数)</param>
|
|
|
|
|
/// <param name="tolerance">坐标参考容差:默认0.0001</param>
|
|
|
|
|
/// <returns>矢量化后MDB文件路径</returns>
|
|
|
|
|
public List<string> DBToMdb(string dbPath, out string sProcessDataPath, string SM2PrivateKey = "", string dbKey = "", string saveMDBPath = "", double tolerance = 0.0001)
|
|
|
|
|
{
|
|
|
|
|
List<string> mdbList = new List<string>();
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 生成参考图层
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="dicReferenceData">辅助数据</param>
|
|
|
|
|
/// <param name="sProcessDataPath"></param>
|
|
|
|
|
public void CreateProcessData(Dictionary<string, string> 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<string> { $"{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<string> { $"{sProcessDataPath}\\Inter", $"{sProcessDataPath}\\LNGD" }, $"{sProcessDataPath}\\LNGD_R", ref featureClass, false);
|
|
|
|
|
#endregion
|
|
|
|
|
#region HFSX_R 叠加
|
|
|
|
|
GeoprocessorHelper.IntersectAnalysis(new List<string> { $"{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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 将DB矢量化为MDB
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="dbPath">需要矢量化的DB文件路径</param>
|
|
|
|
|
/// <param name="dbKey">如果db存在密码,则将密码传输过来</param>
|
|
|
|
|
/// <param name="saveMDBPath">矢量化后MDB文件路径(可选参数)</param>
|
|
|
|
|
/// <param name="sProcessDataPath">过程数据路径</param>
|
|
|
|
|
/// <param name="tolerance">坐标参考容差:默认0.0001</param>
|
|
|
|
|
/// <returns>矢量化后MDB文件路径</returns>
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 解密db
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="dbPath"></param>
|
|
|
|
|
/// <param name="sm4PrivateKey">对称加密秘钥</param>
|
|
|
|
|
private void DecryptDB(string sm4PrivateKey, string dbKey = "")
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
List<string> listTableName = new List<string>() { "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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 创建要素类并导入数据
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="featureDataset"></param>
|
|
|
|
|
/// <param name="tableName"></param>
|
|
|
|
|
/// <param name="dbKey"></param>
|
|
|
|
|
/// <param name="sProcessDataPath"></param>
|
|
|
|
|
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<string, string> dciBZTable = new Dictionary<string, string>();
|
|
|
|
|
// 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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// DataTable数据插入到MDB
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="dataTable"></param>
|
|
|
|
|
/// <param name="featureClassAPI"></param>
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 创建要素数据集
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="workspace"></param>
|
|
|
|
|
/// <param name="code"></param>
|
|
|
|
|
/// <param name="datasetName"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 根据datatable创建矢量图层字段
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="dataTable"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 建立主要字段(OBJECTID和SHAPE)
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="pFieldsEdit">IFieldsEdit,把OBJECTID和SHAPE字段加进去</param>
|
|
|
|
|
/// <param name="pSpatialReference">空间参数</param>
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 查询
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="sql">查询语句</param>
|
|
|
|
|
/// <param name="parameters">参数</param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// DB执行SQL
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="sql"></param>
|
|
|
|
|
/// <param name="dbPath"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 给指定工作空间中的对象设置空间参考
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="pWS">工作空间</param>
|
|
|
|
|
/// <param name="pSR">空间参考对象</param>
|
|
|
|
|
/// <param name="pTolerance">数据库容差</param>
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 创建本地工作空间
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="pPath">文件路径</param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
private static IWorkspace CreateLocalWorkspace(string pPath)
|
|
|
|
|
{
|
|
|
|
|
string gdbExtention = System.IO.Path.GetExtension(pPath).ToLower();
|
|
|
|
|
switch (gdbExtention)
|
|
|
|
|
{
|
|
|
|
|
case ".gdb":
|
|
|
|
|
return CreateWorkspace<FileGDBWorkspaceFactoryClass>(pPath);
|
|
|
|
|
case ".mdb":
|
|
|
|
|
return CreateWorkspace<AccessWorkspaceFactoryClass>(pPath);
|
|
|
|
|
default:
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 创建本地工作空间
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <typeparam name="T">工作空间类型</typeparam>
|
|
|
|
|
/// <param name="pPath">文件路径</param>
|
|
|
|
|
/// <returns>IWorkspace</returns>
|
|
|
|
|
private static IWorkspace CreateWorkspace<T>(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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 对称解密
|
|
|
|
|
/// </summary>
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|