年度变更建库软件5.0版本
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.

496 lines
20 KiB

using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using KGIS.Framework.AE;
using KGIS.Framework.AE.GPHelper;
using KGIS.Framework.DBOperator;
using KGIS.Framework.Maps;
using KGIS.Framework.Platform;
using KGIS.Framework.Platform.Helper;
using KGIS.Framework.Utils;
using KGIS.Framework.Utils.Helper;
using Newtonsoft.Json.Linq;
using OSGeo.GDAL;
using OSGeo.OGR;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Odbc;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
namespace Kingo.Plugin.ResultsOfProof.View
{
/// <summary>
/// FrmJZCGImport.xaml 的交互逻辑
/// </summary>
public partial class FrmJZCGImport : BaseWindow
{
/// <summary>
/// 举证包路径
/// </summary>
string dbPath = string.Empty;
public string CGType { get; set; }
public FrmJZCGImport(IHookHelper hookHelper)
{
InitializeComponent();
try
{
// 注册所有的驱动
Ogr.RegisterAll();
// 为了支持中文路径,请添加下面这句代码
Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
// 为了使属性表字段支持中文,请添加下面这句
Gdal.SetConfigOption("SHAPE_ENCODING", "NO");
}
catch (Exception ex)
{
MessageHelper.Show("GDAL组件注册失败!");
LogAPI.Debug(ex);
}
}
private void btnLoad_Click(object sender, RoutedEventArgs e)
{
try
{
ProgressHelper.ShowProcessBar("正在导入...");
IFeatureClass featureClass = MapsManager.Instance.MapService.GetFeatureClassByName("JCTB");
if (this.txtbzcg != null && !string.IsNullOrWhiteSpace(this.txtbzcg.Text) && string.IsNullOrWhiteSpace(dbPath))
{
dbPath = this.txtbzcg.Text;
}
if (string.IsNullOrWhiteSpace(dbPath))
{
ProgressHelper.CloseProcessBar();
MessageHelper.ShowTips("未选择导入数据!");
return;
}
DataTable rowData = null;
string geofield = "";
rowData = SQLiteDBOperate.Instance.ExceDataTable(dbPath, "select * from BGDC2021");
geofield = "TBFW";//图形字段
if (rowData != null && rowData.Rows.Count > 0)
{
InsertPolygonToTYSDJZ(rowData, "JZCG", geofield, "", radTH.IsChecked == true ? true : false, featureClass);
ProgressHelper.CloseProcessBar();
MessageHelper.ShowTips("导入完成!");
}
else
{
ProgressHelper.CloseProcessBar();
MessageHelper.ShowTips("成果查询为空!");
}
this.Close();
}
catch (Exception ex)
{
LogAPI.Debug(ex);
ProgressHelper.CloseProcessBar();
MessageHelper.ShowError("举证包数据导入失败:" + ex.Message);
}
}
private void btnClose_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
/// <summary>
/// 统一时点举证转图形并插入当前工程
/// </summary>
/// <param name="row">数据源</param>
/// <param name="featureName">图层名</param>
/// <param name="shapCol">图形字段</param>
/// <param name="dicMap">字段映射</param>
/// <param name="targetPath">目标库路径</param>
/// <param name="replace">是否替换</param>
/// <param name="sourceType">数据源类型</param>
public void InsertPolygonToTYSDJZ(DataTable dtSource, string featureName, string shapCol, string targetPath, bool replace, IFeatureClass featureClass)
{
IFeatureCursor insertfeaCursor = null;
IFeatureCursor updatefeaCursor = null;
IFeature pUpdatefeature = null;
insertfeaCursor = featureClass.Insert(true);
IFeatureBuffer feaBuffer = featureClass.CreateFeatureBuffer();
try
{
ProgressHelper.ShowProcessBar("正在导入...");
ProgressHelper.CountProgress = dtSource.Rows.Count;
foreach (DataRow item in dtSource.Rows)
{
ProgressHelper.CountProgress = dtSource.Rows.Count;
ProgressHelper.CurrentProgress = dtSource.Rows.IndexOf(item);
IQueryFilter queryFilter = new QueryFilterClass();
queryFilter.WhereClause = string.Format("TBBH='{0}'", item["JCBH"].ToString().TrimEnd());
updatefeaCursor = featureClass.Update(queryFilter, false);
if ((pUpdatefeature = updatefeaCursor.NextFeature()) != null)
{
if (replace)//替换
{
foreach (DataColumn col in item.Table.Columns)
{
//TBFW字段太长,而且无参考意义
if (col.ColumnName == "TBFW" || col.ColumnName == "SHAPE" || col.ColumnName == "JCBH")
{
continue;
}
int fieldindex = SetFeatureValue(ref pUpdatefeature, item, col);
if (fieldindex == -1)
{
continue;
}
}
SetDBPath(null, pUpdatefeature);
updatefeaCursor.UpdateFeature(pUpdatefeature);
Marshal.ReleaseComObject(pUpdatefeature);
}
else//跳过
{
continue;
}
}
else
{
IGeometry geometry = null;
ISpatialReference spatialReference = (featureClass as IGeoDataset).SpatialReference;
geometry = GetPolygonFromWkt(item[shapCol].ToString());
//fs = KGIS.Framework.AE.FeatureAPI.Identify(geometry, pDLTBBGfeatureLayer);//判断举证成果是否压盖到地类图斑变更层,未压盖到不进行导入
//if (fs == null || fs.Count == 0)
//{
// continue;
//}
ITopologicalOperator topo = geometry as ITopologicalOperator;
if (!topo.IsSimple)
topo.Simplify();
feaBuffer.Shape = geometry;
int t_fieldindex = -1;
//for (int i = 0; i < fs.Count; i++)
//{
// IFeature newfeature = fs[i];
// int jcbhIndex = newfeature.Fields.FindField("JCBH");
// t_fieldindex = feaBuffer.Fields.FindField("TBBH");
// if (jcbhIndex >= 0)
// {
// feaBuffer.set_Value(t_fieldindex, newfeature.get_Value(jcbhIndex).ToString());
// }
foreach (DataColumn col in item.Table.Columns)
{
if (col.ColumnName == "TBFW")
{
continue;
}
t_fieldindex = SetFeaBufferValue(ref feaBuffer, item, col);
if (t_fieldindex == -1)
{
continue;
}
}
//}
//保存hcdb路径
SetDBPath(feaBuffer, null);
insertfeaCursor.InsertFeature(feaBuffer);
}
}
updatefeaCursor.Flush();
insertfeaCursor.Flush();
//修复要素,防止SHAPE_AREA为负数
GeoprocessorHelper.RepairGeo(featureClass, true);
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (updatefeaCursor != null)
Marshal.ReleaseComObject(updatefeaCursor);
if (insertfeaCursor != null)
Marshal.ReleaseComObject(insertfeaCursor);
if (feaBuffer != null)
Marshal.ReleaseComObject(feaBuffer);
if (pUpdatefeature != null)
Marshal.ReleaseComObject(pUpdatefeature);
}
}
private int SetFeaBufferValue(ref IFeatureBuffer feaBuffer, DataRow row, DataColumn col)
{
int t_fieldindex = feaBuffer.Fields.FindField(col.ColumnName);
if (t_fieldindex == -1 && col.ColumnName == "JCBH")
{
t_fieldindex = feaBuffer.Fields.FindField("TBBH");
}
if (t_fieldindex == -1 && col.ColumnName == "JCMJ")
{
t_fieldindex = feaBuffer.Fields.FindField("TBMJ");
}
if (t_fieldindex == -1 && col.ColumnName == "BGDL")
{
t_fieldindex = feaBuffer.Fields.FindField("WYRDDL");
}
if (t_fieldindex == -1 && col.ColumnName == "JZRY")
{
t_fieldindex = feaBuffer.Fields.FindField("DHRY");
}
if (t_fieldindex == -1)
return t_fieldindex;
double mj = 0;
if (col.ColumnName == "XXTBKD" || col.ColumnName == "TBMJ" || col.ColumnName == "JCMJ")
{
if (row[col.ColumnName] != null && !string.IsNullOrWhiteSpace(row[col.ColumnName].ToString()))
{
mj = Convert.ToDouble(row[col.ColumnName].ToString());
}
feaBuffer.set_Value(t_fieldindex, mj);
}
else
{
feaBuffer.set_Value(t_fieldindex, row[col.ColumnName] is System.DBNull ? "" : row[col.ColumnName].ToString().TrimEnd());
}
return t_fieldindex;
}
private int SetFeatureValue(IFeatureBuffer feaBuffer, ref IFeature feature, DataRow row, DataColumn col)
{
int t_fieldindex = feaBuffer.Fields.FindField(col.ColumnName);
if (t_fieldindex == -1 && col.ColumnName == "JCBH")
{
t_fieldindex = feaBuffer.Fields.FindField("TBBH");
}
if (t_fieldindex == -1 && col.ColumnName == "JCMJ")
{
t_fieldindex = feaBuffer.Fields.FindField("TBMJ");
}
if (t_fieldindex == -1 && col.ColumnName == "BGDL")
{
t_fieldindex = feaBuffer.Fields.FindField("WYRDDL");
}
if (t_fieldindex == -1 && col.ColumnName == "JZRY")
{
t_fieldindex = feaBuffer.Fields.FindField("DHRY");
}
if (t_fieldindex == -1)
return t_fieldindex;
double mj = 0;
if (col.ColumnName == "XXTBKD" || col.ColumnName == "TBMJ")
{
if (row[col.ColumnName] != null && !string.IsNullOrWhiteSpace(row[col.ColumnName].ToString()))
{
mj = Convert.ToDouble(row[col.ColumnName].ToString());
}
feature.set_Value(t_fieldindex, mj);
}
else
{
feature.set_Value(t_fieldindex, row[col.ColumnName] is System.DBNull ? "" : row[col.ColumnName].ToString().TrimEnd());
}
return t_fieldindex;
}
private int SetFeatureValue(ref IFeature feature, DataRow row, DataColumn col)
{
int t_fieldindex = feature.Fields.FindField(col.ColumnName);
if (t_fieldindex == -1 && col.ColumnName == "JCBH")
{
t_fieldindex = feature.Fields.FindField("TBBH");
}
if (t_fieldindex == -1 && col.ColumnName == "JCMJ")
{
t_fieldindex = feature.Fields.FindField("TBMJ");
}
if (t_fieldindex == -1 && col.ColumnName == "BGDL")
{
t_fieldindex = feature.Fields.FindField("WYRDDL");
}
if (t_fieldindex == -1 && col.ColumnName == "JZRY")
{
t_fieldindex = feature.Fields.FindField("DHRY");
}
if (t_fieldindex == -1)
return t_fieldindex;
double mj = 0;
if (col.ColumnName == "XXTBKD" || col.ColumnName == "TBMJ")
{
if (row[col.ColumnName] != null && !string.IsNullOrWhiteSpace(row[col.ColumnName].ToString()))
{
mj = Convert.ToDouble(row[col.ColumnName].ToString());
}
feature.set_Value(t_fieldindex, mj);
}
else
{
feature.set_Value(t_fieldindex, row[col.ColumnName] is System.DBNull ? "" : row[col.ColumnName].ToString().TrimEnd());
}
return t_fieldindex;
}
private ISpatialReference ChangeLayerRef(IFeatureClass pFeatureClass, int wkid)
{
try
{
//QI到IGeoDataset
IGeoDataset pGeoDataset = pFeatureClass as IGeoDataset;
//QI到IGeoDatasetSchemaEdit
IGeoDatasetSchemaEdit pGeoDatasetSchemaEdit = pGeoDataset as IGeoDatasetSchemaEdit;
if (pGeoDatasetSchemaEdit.CanAlterSpatialReference == true)
{
ISpatialReferenceFactory2 pSpaRefFactory = new SpatialReferenceEnvironmentClass();
ISpatialReference spatialReference = GeoDBAPI.CreteSpatialReference(wkid);
if (spatialReference is IGeographicCoordinateSystem)
{
IGeographicCoordinateSystem pNewGeoSys = pSpaRefFactory.CreateGeographicCoordinateSystem(wkid);
pGeoDatasetSchemaEdit.AlterSpatialReference(pNewGeoSys);
return pNewGeoSys as ISpatialReference;
}
else
{
IProjectedCoordinateSystem pNewGeoSys2 = pSpaRefFactory.CreateProjectedCoordinateSystem(wkid);
pGeoDatasetSchemaEdit.AlterSpatialReference(pNewGeoSys2);
return pNewGeoSys2 as ISpatialReference;
}
}
return null;
}
catch (Exception Err)
{
return null;
}
}
public string GetNestJsonValue(JEnumerable<JToken> jToken, string key)
{
System.Collections.IEnumerator enumerator = jToken.GetEnumerator();
while (enumerator.MoveNext())
{
JToken jc = (JToken)enumerator.Current;
if (jc is JObject || ((JProperty)jc).Value is JObject)
{
return GetNestJsonValue(jc.Children(), key);
}
else
{
if (((JProperty)jc).Name == key)
{
return ((JProperty)jc).Value.ToString();
}
}
}
return null;
}
/// <summary>
/// 保存三种举证db路径
/// </summary>
/// <param name="featureBuffer"></param>
/// <param name="feature"></param>
public void SetDBPath(IFeatureBuffer featureBuffer, IFeature feature)
{
if (featureBuffer != null && featureBuffer.Fields.FindField("BZFJPATH") >= 0)
{
featureBuffer.set_Value(featureBuffer.Fields.FindField("BZFJPATH"), dbPath);
}
else if (feature != null && feature.Fields.FindField("BZFJPATH") >= 0)
{
feature.set_Value(feature.Fields.FindField("BZFJPATH"), dbPath);
}
}
public IGeometry GetPolygonFromWkt(string pointsStr)
{
//OSGeo.OGR.Ogr.RegisterAll();
IGeometry geometry = new PolygonClass();
OSGeo.OGR.Geometry rstGeometry = OSGeo.OGR.Geometry.CreateFromWkt(pointsStr);
byte[] geometryBytes = new byte[rstGeometry.WkbSize()];
rstGeometry.ExportToWkb(geometryBytes);
IGeometryFactory3 factory = new GeometryEnvironment() as IGeometryFactory3;
int bytesLen = geometryBytes.Length;
factory.CreateGeometryFromWkbVariant(geometryBytes, out geometry, out bytesLen);
IPolygon polygon = geometry as IPolygon;
polygon.Close();
ITopologicalOperator pBoundaryTop = polygon as ITopologicalOperator;
pBoundaryTop.Simplify();
return geometry;
}
/// <summary>
/// JSON字符串转成IGeometry
/// </summary>
private ESRI.ArcGIS.Geometry.IGeometry GeometryFromJsonString(string strJson, ESRI.ArcGIS.Geometry.esriGeometryType type)
{
return GeometryFromJsonString(strJson, type, false, false);
}
/// <summary>
/// JSON字符串转成IGeometry
/// </summary>
private ESRI.ArcGIS.Geometry.IGeometry GeometryFromJsonString(string strJson, ESRI.ArcGIS.Geometry.esriGeometryType type,
bool bHasZ, bool bHasM)
{
ESRI.ArcGIS.esriSystem.IJSONReader jsonReader = new ESRI.ArcGIS.esriSystem.JSONReaderClass();
jsonReader.ReadFromString(strJson);
ESRI.ArcGIS.Geometry.JSONConverterGeometryClass jsonCon = new ESRI.ArcGIS.Geometry.JSONConverterGeometryClass();
return jsonCon.ReadGeometry(jsonReader, type, bHasZ, bHasM);
}
/// <summary>
///选择db
/// </summary>
/// <param name="type"></param>
private void SelectDB(string type)
{
try
{
string Filter = "";
TextBox textBox = null;
Filter = "举证数据|*.db";
textBox = this.txtbzcg;
KGIS.Framework.Utils.Dialog.OpenFileDialog openFileDialog = new KGIS.Framework.Utils.Dialog.OpenFileDialog();
openFileDialog.Title = "选择文件";
openFileDialog.Filter = Filter;
openFileDialog.FileName = string.Empty;
openFileDialog.FilterIndex = 1;
openFileDialog.RestoreDirectory = true;
openFileDialog.DefaultExt = "VCT";
if (openFileDialog.ShowDialog())
{
textBox.Text = openFileDialog.FileName;
dbPath = openFileDialog.FileName;
}
}
catch (Exception ex)
{
LogAPI.Debug(ex.Message);
}
}
private void btnBZ_Click(object sender, RoutedEventArgs e)
{
SelectDB("BZ");
}
}
}