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.
945 lines
42 KiB
945 lines
42 KiB
using ESRI.ArcGIS.Carto; |
|
using ESRI.ArcGIS.Controls; |
|
using ESRI.ArcGIS.Display; |
|
using ESRI.ArcGIS.Geodatabase; |
|
using ESRI.ArcGIS.Geometry; |
|
using KGIS.Framework.AE; |
|
using KGIS.Framework.AE.Enum; |
|
using KGIS.Framework.DBOperator; |
|
using KGIS.Framework.Maps; |
|
using KGIS.Framework.Utils; |
|
using KGIS.Framework.Utils.Helper; |
|
using KGIS.Framework.Views; |
|
using Kingo.PluginServiceInterface; |
|
using Kingo.PluginServiceInterface.Model; |
|
using KUI.Windows; |
|
using stdole; |
|
using System; |
|
using System.Collections.Generic; |
|
using System.Data; |
|
using System.Linq; |
|
using System.Text; |
|
using System.Windows.Controls; |
|
using System.Windows.Input; |
|
|
|
namespace Kingo.Plugin.General.View |
|
{ |
|
/// <summary> |
|
/// UCWYInfo.xaml 的交互逻辑 |
|
/// </summary> |
|
public partial class UCWYSketch : UserControl, IElementInfo |
|
{ |
|
private IProofManager ProofMgr = null; |
|
private IHookHelper hookHelper { get; set; } |
|
private NYYSInfo OldData { get; set; } |
|
private NYYSInfo NYYSInfo { get; set; } |
|
private ProjectInfo projectInfo { get; set; } |
|
private TaskPackage taskPackage { get; set; } |
|
/// <summary> |
|
/// 数据源集合 |
|
/// </summary> |
|
private DataTable Data { get; set; } |
|
public UCWYSketch() |
|
{ |
|
InitializeComponent(); |
|
Title = "外业草图"; |
|
DevExpress.Xpf.Core.ThemeManager.SetTheme(this, DevExpress.Xpf.Core.Theme.Office2013LightGray); |
|
NYYSInfo = new NYYSInfo(); |
|
this.DataContext = NYYSInfo; |
|
this.Loaded += (s, e) => |
|
{ |
|
hookHelper = new HookHelperClass(); |
|
hookHelper.Hook = MapsManager.Instance.MapService.getAxMapControl().Object; |
|
}; |
|
} |
|
public bool IsShow { get; set; } |
|
public int ShowIndex { get; set; } |
|
public bool ResetSize { get; set; } |
|
public bool AllowEdit { get; set; } |
|
public Guid ID { get; set; } |
|
public DockStyle DockAreas { get; set; } |
|
public System.Drawing.Size FloatSize { get; set; } |
|
public int DockWidth { get; set; } |
|
public int DockHeight { get; set; } |
|
public DockStyle DefaultArea { get; set; } |
|
public bool ShowCloseButton { get; set; } |
|
public bool ShowAutoHideButton { get; set; } |
|
public string Title { get; set; } |
|
private void LoadData(IWorkspace workspace, string tableName) |
|
{ |
|
ICursor cursor = null; |
|
ITable table = null; |
|
try |
|
{ |
|
table = (workspace as IFeatureWorkspace).OpenTable(tableName); |
|
if (Data == null) |
|
{ |
|
Data = new DataTable(); |
|
ConstructColumn(table.Fields); |
|
} |
|
IQueryFilter queryFilter = new QueryFilterClass() |
|
{ |
|
WhereClause = $"TBBSM='{this.NYYSInfo.WYRWTB.TBBSM }' and BID='{this.taskPackage.BID}'" |
|
}; |
|
cursor = table.Search(queryFilter, true); |
|
IRow row = null; |
|
while ((row = cursor.NextRow()) != null) |
|
{ |
|
DataRow dr = Data.NewRow(); |
|
for (int i = 0; i < Data.Columns.Count; i++) |
|
{ |
|
object obj = row.get_Value((int)Data.Columns[i].ExtendedProperties["index"]); |
|
if (obj == null) |
|
{ |
|
continue; |
|
} |
|
else |
|
{ |
|
if ((obj.ToString()).Contains("1899/12/30 0:00:00")) |
|
{ |
|
obj = System.DBNull.Value; |
|
} |
|
} |
|
if (obj is string) |
|
obj = obj.ToString().Trim(); |
|
dr[i] = obj; |
|
} |
|
Data.Rows.Add(dr); |
|
System.Runtime.InteropServices.Marshal.ReleaseComObject(row); |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug("加载" + tableName + "数据异常:" + ex.Message); |
|
MessageHelper.ShowError("加载" + tableName + "数据异常:" + ex.Message); |
|
} |
|
finally |
|
{ |
|
if (cursor != null) |
|
{ |
|
System.Runtime.InteropServices.Marshal.ReleaseComObject(cursor); |
|
} |
|
} |
|
} |
|
private void ConstructColumn(IFields fields) |
|
{ |
|
if (fields != null) |
|
{ |
|
for (int i = 0; i < fields.FieldCount; i++) |
|
{ |
|
IField field = fields.get_Field(i); |
|
if (field.Name.ToUpper().EndsWith("SHAPE")) |
|
continue; |
|
DataColumn col = new DataColumn(); |
|
col.ExtendedProperties.Add("index", i); |
|
col.ColumnName = field.Name; |
|
col.Caption = field.AliasName; |
|
|
|
switch (field.Type) |
|
{ |
|
case esriFieldType.esriFieldTypeSmallInteger: |
|
col.DataType = typeof(short); |
|
break; |
|
case esriFieldType.esriFieldTypeInteger: |
|
col.DataType = typeof(int); |
|
break; |
|
case esriFieldType.esriFieldTypeSingle: |
|
break; |
|
case esriFieldType.esriFieldTypeDouble: |
|
col.DataType = typeof(double); |
|
break; |
|
case esriFieldType.esriFieldTypeString: |
|
col.DataType = typeof(string); |
|
break; |
|
case esriFieldType.esriFieldTypeDate: |
|
col.DataType = typeof(DateTime); |
|
break; |
|
case esriFieldType.esriFieldTypeOID: |
|
col.DataType = typeof(Int32); |
|
break; |
|
case esriFieldType.esriFieldTypeGeometry: |
|
break; |
|
case esriFieldType.esriFieldTypeBlob: |
|
break; |
|
case esriFieldType.esriFieldTypeRaster: |
|
break; |
|
case esriFieldType.esriFieldTypeGUID: |
|
break; |
|
case esriFieldType.esriFieldTypeGlobalID: |
|
break; |
|
case esriFieldType.esriFieldTypeXML: |
|
break; |
|
default: |
|
break; |
|
} |
|
col.ReadOnly = !field.Editable;//编辑状态启用默认是否可以编辑 |
|
Data.Columns.Add(col); |
|
System.Runtime.InteropServices.Marshal.ReleaseComObject(field); |
|
} |
|
} |
|
} |
|
public void BindData(object obj) |
|
{ |
|
IWorkspaceAPI workspaceAPI = null; |
|
IRDBHelper rdbHelper = null; |
|
try |
|
{ |
|
NYYSInfo nYYSInfo = obj as NYYSInfo; |
|
if (nYYSInfo == null) return; |
|
this.NYYSInfo = nYYSInfo; |
|
if (listDdeleteWYSketck == null) |
|
{ |
|
listDdeleteWYSketck = new List<WYSketch>(); |
|
} |
|
listDdeleteWYSketck.Clear(); |
|
|
|
taskPackage = nYYSInfo.TaskPackages; |
|
if (taskPackage == null || taskPackage.PackageTempPath == null || !System.IO.File.Exists(taskPackage.PackageTempPath)) return; |
|
rdbHelper = RDBFactory.CreateDbHelper($"{taskPackage.PackageTempPath}{(MapsManager.Instance.CurrProjectInfo as ProjectInfo).Pathpassword}", DatabaseType.SQLite); |
|
if (NYYSInfo.WYRWTB == null || string.IsNullOrWhiteSpace(NYYSInfo.WYRWTB.TBBSM)) |
|
{ |
|
btnAddData.IsEnabled = false; |
|
btnClearData.IsEnabled = false; |
|
this.DataContext = this.NYYSInfo; |
|
return; |
|
} |
|
btnAddData.IsEnabled = true; |
|
btnClearData.IsEnabled = true; |
|
//this.btnOk.IsEnabled = true; |
|
//外业任务图斑信息 |
|
DataTable dataTable = rdbHelper.ExecuteDatatable("WYRW", $"select * from WYRW WHERE TBBSM='{NYYSInfo.WYRWTB.TBBSM}'", true); |
|
if (dataTable == null || dataTable.Rows.Count <= 0) |
|
{ |
|
return; |
|
//throw new Exception("任务DB中未找到WYRW(外业任务图斑)=" + NYYSInfo.WYRWTB.TBBSM + "的图斑信息!"); |
|
} |
|
if (dataTable.Rows.Count > 1) |
|
{ |
|
throw new Exception("WYRW(外业任务图斑)表中存在" + dataTable.Rows.Count + "条图斑标识码为" + NYYSInfo.WYRWTB.TBBSM + "信息!"); |
|
} |
|
this.NYYSInfo.WYRWTB = KGIS.Framework.Utils.Utility.TBToList.ConvertEntity<WYRWTB>(dataTable.Rows[0]); |
|
List<string> listTable = new List<string>() { "MarkPoint", "MarkPolygon", "MarkLine" }; |
|
Data = null; |
|
workspaceAPI = new WorkspaceAPI(taskPackage.SchemeGDBPath, WorkspaceTypeEnum.GDBFile, true); |
|
foreach (var item in listTable) |
|
{ |
|
LoadData(workspaceAPI.CurrentWorkspace, item); |
|
} |
|
if (Data == null || Data.Rows.Count == 0) |
|
{ |
|
this.NYYSInfo.WYSketch = new List<WYSketch>(); |
|
} |
|
else |
|
{ |
|
this.NYYSInfo.WYSketch = KGIS.Framework.Utils.Utility.TBToList.ToList<WYSketch>(Data); |
|
} |
|
this.DataContext = this.NYYSInfo; |
|
this.OldData = PluginServiceInterface.CommonHelper.DeepCopyByBin<NYYSInfo>(this.NYYSInfo); |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug("外业标注绑定数据异常:" + ex.Message); |
|
LogAPI.Debug("外业标注绑定数据异常:" + ex); |
|
LogAPI.Debug("外业标注绑定数据异常:" + ex.StackTrace); |
|
throw ex; |
|
} |
|
finally |
|
{ |
|
if (rdbHelper != null) |
|
{ |
|
rdbHelper.DisConnect(); |
|
} |
|
if (workspaceAPI != null) |
|
{ |
|
workspaceAPI.CloseWorkspace(); |
|
} |
|
} |
|
} |
|
|
|
public void SaveEdit() |
|
{ |
|
IWorkspaceAPI workspaceAPI = null; |
|
IRDBHelper rdbHelper = null; |
|
try |
|
{ |
|
if (this.NYYSInfo.WYSketch == null) return; |
|
if (taskPackage.PackageTempPath == null || !System.IO.File.Exists(taskPackage.PackageTempPath)) return; |
|
rdbHelper = RDBFactory.CreateDbHelper($"{taskPackage.PackageTempPath}{(MapsManager.Instance.CurrProjectInfo as ProjectInfo).Pathpassword}", DatabaseType.SQLite); |
|
workspaceAPI = new WorkspaceAPI(taskPackage.SchemeGDBPath, WorkspaceTypeEnum.GDBFile, true); |
|
//标注信息保存到DB |
|
rdbHelper.ExecuteNonQueryWithException($"delete from WYSketch where TBBSM='{ NYYSInfo.WYRWTB.TBBSM }'", CommandType.Text); |
|
foreach (var item in this.NYYSInfo.WYSketch) |
|
{ |
|
rdbHelper.ExecuteNonQueryWithException(string.Format("INSERT INTO WYSketch (TBBSM, BZLX, BZMS, Geometry) VALUES('{0}', '{1}', '{2}', '{3}');", this.NYYSInfo.WYRWTB.TBBSM, item.BZLX, item.BZMS, item.Geometry), CommandType.Text); |
|
} |
|
//标注保存到矢量化图层中 |
|
List<string> listTable = new List<string>() { "MarkPoint", "MarkPolygon", "MarkLine" }; |
|
foreach (var tableName in listTable) |
|
{ |
|
IFeatureClassAPI tableAPI = null; |
|
try |
|
{ |
|
if (!workspaceAPI.ExistFeatureClass(tableName)) |
|
{ |
|
continue; |
|
} |
|
if (listDdeleteWYSketck != null && listDdeleteWYSketck.Count > 0) |
|
{ |
|
foreach (var item in listDdeleteWYSketck) |
|
{ |
|
switch (tableName) |
|
{ |
|
case "MarkPoint": |
|
if (!item.BZLX.Equals("点")) |
|
{ |
|
continue; |
|
} |
|
break; |
|
case "MarkPolygon": |
|
if (!item.BZLX.Equals("面")) |
|
{ |
|
continue; |
|
} |
|
break; |
|
case "MarkLine": |
|
if (!item.BZLX.Equals("线")) |
|
{ |
|
continue; |
|
} |
|
break; |
|
} |
|
workspaceAPI.CurrentWorkspace.ExecuteSQL(string.Format("delete from {0} where TBBSM='{1}' and objectid={2} and bid='{3}'", tableName, NYYSInfo.WYRWTB.TBBSM, item.ObjectID, taskPackage.BID)); |
|
} |
|
} |
|
List<WYSketch> list = new List<WYSketch>(); |
|
switch (tableName) |
|
{ |
|
case "MarkPoint": |
|
list = this.NYYSInfo.WYSketch.Where(x => x.BZLX.Equals("点") && !string.IsNullOrWhiteSpace(x.Geometry)).ToList(); |
|
break; |
|
case "MarkLine": |
|
list = this.NYYSInfo.WYSketch.Where(x => x.BZLX.Equals("线") && !string.IsNullOrWhiteSpace(x.Geometry)).ToList(); |
|
break; |
|
case "MarkPolygon": |
|
list = this.NYYSInfo.WYSketch.Where(x => x.BZLX.Equals("面") && !string.IsNullOrWhiteSpace(x.Geometry)).ToList(); |
|
break; |
|
} |
|
if (list.Count <= 0) |
|
{ |
|
continue; |
|
} |
|
tableAPI = workspaceAPI.OpenFeatureClass(tableName); |
|
int indexGeometry = tableAPI.FeatureClass.Fields.FindField("geometry"); |
|
foreach (var item in list) |
|
{ |
|
if (item.ObjectID <= 0) |
|
{ |
|
IGeometry geometry = null; |
|
switch (tableName) |
|
{ |
|
case "MarkPoint": |
|
geometry = ConverJsonToIGeoemtry(item.Geometry, ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint); |
|
break; |
|
case "MarkLine": |
|
geometry = ConverJsonToIGeoemtry(item.Geometry, ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline); |
|
break; |
|
case "MarkPolygon": |
|
geometry = ConverJsonToIGeoemtry(item.Geometry); |
|
break; |
|
} |
|
if (geometry.SpatialReference != null) |
|
{ |
|
geometry.Project((tableAPI.FeatureClass as IGeoDataset).SpatialReference); |
|
} |
|
IFeature feature = tableAPI.FeatureClass.CreateFeature(); |
|
feature.Shape = geometry; |
|
if (indexGeometry > -1) |
|
{ |
|
feature.set_Value(indexGeometry, ConverIGometryToJson(geometry)); |
|
} |
|
feature.Store(); |
|
item.ObjectID = feature.OID; |
|
workspaceAPI.CurrentWorkspace.ExecuteSQL(string.Format("update {0} set bsm='{5}',bzlx='{1}',bzms='{2}',TBBSM='{3}',bid='{4}' where objectid={5}", tableName, item.BZLX, item.BZMS, this.NYYSInfo.WYRWTB.TBBSM, taskPackage.BID, item.ObjectID)); |
|
System.Runtime.InteropServices.Marshal.ReleaseComObject(feature); |
|
System.Runtime.InteropServices.Marshal.ReleaseComObject(geometry); |
|
} |
|
else |
|
{ |
|
if (indexGeometry > -1) |
|
{ |
|
IFeature feature = tableAPI.FeatureClass.GetFeature(item.ObjectID); |
|
feature.set_Value(indexGeometry, ConverIGometryToJson(feature.ShapeCopy)); |
|
feature.Store(); |
|
} |
|
workspaceAPI.CurrentWorkspace.ExecuteSQL(string.Format("update {0} set bsm='{5}',bzlx='{1}',bzms='{2}',TBBSM='{3}',bid='{4}' where objectid={5}", tableName, item.BZLX, item.BZMS, this.NYYSInfo.WYRWTB.TBBSM, taskPackage.BID, item.ObjectID)); |
|
} |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw new Exception("标注保存失败:" + ex.Message); |
|
} |
|
finally |
|
{ |
|
if (tableAPI != null) |
|
{ |
|
tableAPI.CloseFeatureClass(); |
|
} |
|
} |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug("外业标注绑定数据保存异常:" + ex.Message); |
|
LogAPI.Debug("外业标注绑定数据保存异常:" + ex); |
|
LogAPI.Debug("外业标注绑定数据保存异常:" + ex.StackTrace); |
|
throw; |
|
} |
|
finally |
|
{ |
|
if (rdbHelper != null) |
|
rdbHelper.DisConnect(); |
|
if (workspaceAPI != null) |
|
workspaceAPI.CloseWorkspace(); |
|
} |
|
|
|
} |
|
|
|
private void BtnAddData_Click(object sender, System.Windows.RoutedEventArgs e) |
|
{ |
|
try |
|
{ |
|
BZToolSelected(); |
|
} |
|
catch (Exception ex) |
|
{ |
|
MessageHelper.ShowError(ex.Message); |
|
} |
|
} |
|
private void BZToolSelected() |
|
{ |
|
switch (this.bzType.SelectedIndex) |
|
{ |
|
case 0: |
|
Tool.DrawPointTool drawPolygonTool = new Tool.DrawPointTool(); |
|
drawPolygonTool.DrawCompleted += DrawCompleted; |
|
drawPolygonTool.OnCreate(this.hookHelper.Hook); |
|
drawPolygonTool.OnClick(); |
|
(this.hookHelper.Hook as IMapControl3).CurrentTool = drawPolygonTool; |
|
break; |
|
case 1: |
|
Tool.DrawPolylineTool drawPolygonTool2 = new Tool.DrawPolylineTool(); |
|
drawPolygonTool2.DrawCompleted += DrawCompleted; |
|
drawPolygonTool2.OnCreate(this.hookHelper.Hook); |
|
drawPolygonTool2.OnClick(); |
|
(this.hookHelper.Hook as IMapControl3).CurrentTool = drawPolygonTool2; |
|
break; |
|
case 2: |
|
Tool.DrawPolygonTool drawPolygonTool3 = new Tool.DrawPolygonTool(); |
|
drawPolygonTool3.DrawCompleted += DrawCompleted; |
|
drawPolygonTool3.OnCreate(this.hookHelper.Hook); |
|
drawPolygonTool3.OnClick(); |
|
(this.hookHelper.Hook as IMapControl3).CurrentTool = drawPolygonTool3; |
|
break; |
|
} |
|
} |
|
|
|
private void DrawCompleted(ESRI.ArcGIS.Geometry.IGeometry geo) |
|
{ |
|
try |
|
{ |
|
this.ShowLoading("正在更新标注......", 0, 0); |
|
//KGIS.Framework.Platform.Helper.ProgressHelper.ShowProcessBar("正在更新标注......"); |
|
if (geo.SpatialReference == null) |
|
{ |
|
geo.SpatialReference = this.hookHelper.FocusMap.SpatialReference; |
|
} |
|
else |
|
{ |
|
geo.Project(this.hookHelper.FocusMap.SpatialReference); |
|
} |
|
WYSketch wYSketch = new WYSketch() |
|
{ |
|
BSM = this.NYYSInfo.WYRWTB.ObjectID, |
|
TBBSM = this.NYYSInfo.WYRWTB.TBBSM, |
|
BID = taskPackage.BID.ToString(), |
|
}; |
|
switch (geo.GeometryType) |
|
{ |
|
case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint: |
|
this.hookHelper.ActiveView.GraphicsContainer.AddElement(PointElement(geo), 0); |
|
wYSketch.BZLX = "点"; |
|
break; |
|
case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline: |
|
this.hookHelper.ActiveView.GraphicsContainer.AddElement(PolylineElement(geo), 0); |
|
wYSketch.BZLX = "线"; |
|
break; |
|
case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon: |
|
this.hookHelper.ActiveView.GraphicsContainer.AddElement(PolygonElement(geo), 0); |
|
wYSketch.BZLX = "面"; |
|
break; |
|
} |
|
wYSketch.Geometry = ConverIGometryToJson(geo); |
|
this.NYYSInfo.WYSketch.Add(wYSketch); |
|
this.Dispatcher.Invoke(new Action(() => |
|
{ |
|
this.DataContext = null; |
|
this.DataContext = this.NYYSInfo; |
|
})); |
|
this.hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground, null, null); |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug(ex); |
|
this.CloseLoading(); |
|
//KGIS.Framework.Platform.Helper.ProgressHelper.CloseProcessBar(); |
|
MessageHelper.ShowError(ex.Message); |
|
} |
|
finally |
|
{ |
|
this.CloseLoading(); |
|
//KGIS.Framework.Platform.Helper.ProgressHelper.CloseProcessBar(); |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// IGeometry转JSON字符串 |
|
/// </summary> |
|
/// <param name="geometry">待转换图形</param> |
|
/// <param name="wkid">坐标参考wkid,4490:CGCS2000球面坐标参考,默认输出CGCS2000球面坐标参考的json图形</param> |
|
/// <param name="isGeograhicCoordinateSystem">是地理坐标参考</param> |
|
/// <returns></returns> |
|
public static string ConverIGometryToJson(IGeometry geometry, int wkid = 4490, bool isGeograhicCoordinateSystem = true) |
|
{ |
|
try |
|
{ |
|
if (geometry == null || geometry.IsEmpty || geometry.SpatialReference == null) |
|
{ |
|
throw new Exception("图形或坐标参考为空,无法转换!"); |
|
} |
|
if (wkid > 0) |
|
{ |
|
if (isGeograhicCoordinateSystem) |
|
{ |
|
geometry.Project(GeoDBAPI.CreateGeographicCoordinateSystem(wkid)); |
|
} |
|
else |
|
{ |
|
geometry.Project(GeoDBAPI.CreteSpatialReference(wkid)); |
|
} |
|
} |
|
#pragma warning disable CS0618 // “ComReleaser”已过时:“The assembly containing this class is obsolete. Reference the ESRI.ArcGIS.ADF.Connection.Local assembly instead.” |
|
#pragma warning disable CS0618 // “ComReleaser”已过时:“The assembly containing this class is obsolete. Reference the ESRI.ArcGIS.ADF.Connection.Local assembly instead.” |
|
using (ESRI.ArcGIS.ADF.ComReleaser comReleaser = new ESRI.ArcGIS.ADF.ComReleaser()) |
|
#pragma warning restore CS0618 // “ComReleaser”已过时:“The assembly containing this class is obsolete. Reference the ESRI.ArcGIS.ADF.Connection.Local assembly instead.” |
|
#pragma warning restore CS0618 // “ComReleaser”已过时:“The assembly containing this class is obsolete. Reference the ESRI.ArcGIS.ADF.Connection.Local assembly instead.” |
|
{ |
|
ESRI.ArcGIS.Geometry.JSONConverterGeometryClass jsonConverter = new JSONConverterGeometryClass(); |
|
comReleaser.ManageLifetime(jsonConverter); |
|
ESRI.ArcGIS.esriSystem.IJSONWriter jsonWriter = new ESRI.ArcGIS.esriSystem.JSONWriterClass(); |
|
jsonWriter.WriteToString(); |
|
comReleaser.ManageLifetime(jsonWriter); |
|
jsonConverter.WriteGeometry(jsonWriter, null, geometry, false); |
|
return Encoding.UTF8.GetString(jsonWriter.GetStringBuffer()); |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw ex; |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// JSON图图形转IGeometry |
|
/// </summary> |
|
/// <param name="jsonGeometry">图形串</param> |
|
/// <param name="geometryType">图形类型:点,线、面</param> |
|
/// <param name="wkid">输出图形坐标参考wkid,4490:CGCS2000球面坐标参考,默认输出CGCS2000球面坐标参考的json图形</param> |
|
/// <param name="isGeograhicCoordinateSystem">是地理坐标参考</param> |
|
/// <returns></returns> |
|
public static IGeometry ConverJsonToIGeoemtry(string jsonGeometry, esriGeometryType geometryType = esriGeometryType.esriGeometryPolygon, int wkid = 4490, bool isGeograhicCoordinateSystem = true) |
|
{ |
|
try |
|
{ |
|
#pragma warning disable CS0618 // “ComReleaser”已过时:“The assembly containing this class is obsolete. Reference the ESRI.ArcGIS.ADF.Connection.Local assembly instead.” |
|
#pragma warning disable CS0618 // “ComReleaser”已过时:“The assembly containing this class is obsolete. Reference the ESRI.ArcGIS.ADF.Connection.Local assembly instead.” |
|
using (ESRI.ArcGIS.ADF.ComReleaser comReleaser = new ESRI.ArcGIS.ADF.ComReleaser()) |
|
#pragma warning restore CS0618 // “ComReleaser”已过时:“The assembly containing this class is obsolete. Reference the ESRI.ArcGIS.ADF.Connection.Local assembly instead.” |
|
#pragma warning restore CS0618 // “ComReleaser”已过时:“The assembly containing this class is obsolete. Reference the ESRI.ArcGIS.ADF.Connection.Local assembly instead.” |
|
{ |
|
ESRI.ArcGIS.esriSystem.IJSONReader reader = new ESRI.ArcGIS.esriSystem.JSONReaderClass(); |
|
comReleaser.ManageLifetime(reader); |
|
reader.ReadFromString(jsonGeometry); |
|
ESRI.ArcGIS.Geometry.JSONConverterGeometryClass jsonConverter = new JSONConverterGeometryClass(); |
|
comReleaser.ManageLifetime(jsonConverter); |
|
IGeometry geometry = jsonConverter.ReadGeometry(reader, geometryType, false, false); |
|
if (geometry == null || geometry.IsEmpty) |
|
{ |
|
throw new Exception("转换后图形为空!"); |
|
} |
|
//此处发现湖南抽取过来的图形Simplify之后图形变化较大,会删除节点,所以湖南暂时不执行图形简化操作 |
|
if (!KGIS.Framework.Utils.SysConfigsOprator.GetAppsetingValueByKey("ArearName").Equals("43")) |
|
{ |
|
ESRI.ArcGIS.Geometry.ITopologicalOperator topological = geometry as ESRI.ArcGIS.Geometry.ITopologicalOperator; |
|
if (!topological.IsSimple) |
|
{ |
|
topological.Simplify(); |
|
} |
|
} |
|
ISpatialReference spatialReference = null; |
|
if (isGeograhicCoordinateSystem) |
|
{ |
|
spatialReference = GeoDBAPI.CreateGeographicCoordinateSystem(wkid); |
|
} |
|
else |
|
{ |
|
spatialReference = GeoDBAPI.CreteSpatialReference(wkid); |
|
} |
|
if (wkid > 0) |
|
{ |
|
if (geometry.SpatialReference == null) |
|
{ |
|
geometry.SpatialReference = spatialReference; |
|
} |
|
else if (wkid != geometry.SpatialReference.FactoryCode) |
|
{ |
|
geometry.Project(spatialReference); |
|
} |
|
} |
|
return geometry; |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw ex; |
|
} |
|
} |
|
|
|
public static IElement TextElement(IGeometry pGeometry, string textLabel) |
|
{ |
|
IRgbColor pColor = new RgbColorClass() |
|
{ |
|
Red = 0, |
|
Blue = 255, |
|
Green = 0 |
|
}; |
|
IFontDisp pFont = new StdFont() |
|
{ |
|
Name = "宋体", |
|
Size = 12 |
|
} as IFontDisp; |
|
|
|
ITextSymbol pTextSymbol = new TextSymbolClass() |
|
{ |
|
Color = pColor, |
|
Font = pFont, |
|
Size = 12 |
|
}; |
|
IGeometry geometry = pGeometry; |
|
switch (geometry.GeometryType) |
|
{ |
|
case esriGeometryType.esriGeometryPolygon: |
|
geometry = (pGeometry as IArea).Centroid; |
|
break; |
|
} |
|
IElement pTextElment = new TextElementClass() |
|
{ |
|
Symbol = pTextSymbol, |
|
ScaleText = true, |
|
Text = textLabel, |
|
Geometry = geometry |
|
}; |
|
return pTextElment; |
|
} |
|
|
|
public static IElement PointElement(IGeometry pGeometry) |
|
{ |
|
IElement pElement = new MarkerElementClass(); |
|
IMarkerElement pMarkerElement = (IMarkerElement)pElement; |
|
ISimpleMarkerSymbol pSimpleMarkerSymbol = new SimpleMarkerSymbolClass(); |
|
pSimpleMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSCircle; |
|
IRgbColor pRgbColor = new RgbColorClass(); |
|
pRgbColor.Red = 255; |
|
pSimpleMarkerSymbol.Color = pRgbColor; |
|
pSimpleMarkerSymbol.Size = 10; |
|
pMarkerElement.Symbol = pSimpleMarkerSymbol; |
|
pElement.Geometry = pGeometry; |
|
return pElement; |
|
} |
|
/// <summary> |
|
/// 创建线元素 |
|
/// </summary> |
|
/// <param name="pGeometry">线几何图形</param> |
|
/// <returns>线元素</returns> |
|
public static IElement PolylineElement(IGeometry pGeometry) |
|
{ |
|
IElement pElement = new LineElementClass(); |
|
ILineElement pLineElement = (ILineElement)pElement; |
|
ISimpleLineSymbol pSimpleLineSymbol = new SimpleLineSymbolClass(); |
|
IRgbColor pRgbColor = new RgbColorClass(); |
|
pRgbColor.Red = 0; |
|
pRgbColor.Green = 0; |
|
pRgbColor.Blue = 0; |
|
pSimpleLineSymbol.Color = pRgbColor; |
|
pSimpleLineSymbol.Width = 5; |
|
pLineElement.Symbol = pSimpleLineSymbol; |
|
pElement.Geometry = pGeometry; |
|
return pElement; |
|
} |
|
/// <summary> |
|
/// 创建面元素 |
|
/// </summary> |
|
/// <param name="pGeometry">面几何对象</param> |
|
/// <returns>面元素</returns> |
|
public static IElement PolygonElement(IGeometry pGeometry) |
|
{ |
|
IElement pElement = new PolygonElementClass(); |
|
//填充符号设置 |
|
ISimpleFillSymbol pSimpleFillSymbol = new SimpleFillSymbolClass(); |
|
//填充符号的边框设置 |
|
ILineSymbol pLineSymbol = new SimpleLineSymbolClass(); |
|
IRgbColor pRgbColol = new RgbColorClass(); |
|
pRgbColol.Red = 0; |
|
pRgbColol.Green = 0; |
|
pRgbColol.Blue = 110; |
|
pLineSymbol.Color = pRgbColol; |
|
pLineSymbol.Width = 1; |
|
pSimpleFillSymbol.Outline = pLineSymbol; |
|
//填充符号颜色 |
|
pRgbColol = new RgbColorClass(); |
|
pRgbColol.Red = 229; |
|
pRgbColol.Green = 103; |
|
pRgbColol.Blue = 102; |
|
pSimpleFillSymbol.Color = pRgbColol; |
|
pSimpleFillSymbol.Style = esriSimpleFillStyle.esriSFSCross; //.esriSFSBackwardDiagonal; |
|
//面元素设置 |
|
IFillShapeElement pFillShapeElement = (IFillShapeElement)pElement; |
|
pFillShapeElement.Symbol = pSimpleFillSymbol; |
|
pElement.Geometry = pGeometry; |
|
return pElement; |
|
} |
|
private int SelectIndex = -1; |
|
private void DgWYSketch_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e) |
|
{ |
|
try |
|
{ |
|
if (e.Key != Key.Enter) |
|
{ |
|
return; |
|
} |
|
SelectIndex = this.dgWYSketch.SelectedIndex; |
|
} |
|
catch |
|
{ |
|
SelectIndex = -1; |
|
} |
|
} |
|
|
|
private void DgWYSketch_KeyUp(object sender, System.Windows.Input.KeyEventArgs e) |
|
{ |
|
try |
|
{ |
|
if (SelectIndex < 0) |
|
{ |
|
return; |
|
} |
|
List<WYSketch> listNew = this.dgWYSketch.ItemsSource as List<WYSketch>; |
|
WYSketch wySketch = listNew[SelectIndex] as WYSketch; |
|
SelectIndex = -1; |
|
if (wySketch != null) |
|
{ |
|
RefreshBZ(wySketch); |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug(ex); |
|
MessageHelper.ShowError("绘制标注描述异常:" + ex.Message); |
|
} |
|
} |
|
private void RefreshBZ(WYSketch wYSketch) |
|
{ |
|
try |
|
{ |
|
this.hookHelper.ActiveView.GraphicsContainer.DeleteAllElements(); |
|
foreach (var item in this.NYYSInfo.WYSketch) |
|
{ |
|
if (wYSketch != null && wYSketch.Geometry.Equals(item.Geometry)) |
|
{ |
|
LocationBZ(item); |
|
} |
|
else |
|
{ |
|
LocationBZ(item, false); |
|
} |
|
} |
|
this.hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground, null, null); |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw ex; |
|
} |
|
} |
|
|
|
private void LocationBZ(WYSketch wySketch, bool isLocation = true) |
|
{ |
|
try |
|
{ |
|
if (wySketch.ObjectID > 0) |
|
{ |
|
ILayer layer = null; |
|
switch (wySketch.BZLX) |
|
{ |
|
case "点": |
|
layer = MapsManager.Instance.MapService.GetFeatureLayerByName("MarkPoint"); |
|
break; |
|
case "线": |
|
layer = MapsManager.Instance.MapService.GetFeatureLayerByName("MarkLine"); |
|
break; |
|
case "面": |
|
layer = MapsManager.Instance.MapService.GetFeatureLayerByName("MarkPolygon"); |
|
break; |
|
} |
|
if (layer != null) |
|
{ |
|
IFeature feature = (layer as IFeatureLayer).FeatureClass.GetFeature(wySketch.ObjectID); |
|
if (isLocation) |
|
{ |
|
MapsManager.Instance.MapService.Zoom(feature.ShapeCopy); |
|
} |
|
return; |
|
} |
|
} |
|
ESRI.ArcGIS.Geometry.IGeometry geometry = null; |
|
//IElement element = null; |
|
switch (wySketch.BZLX) |
|
{ |
|
case "点": |
|
geometry = ConverJsonToIGeoemtry(wySketch.Geometry, ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint); |
|
geometry.Project(this.hookHelper.FocusMap.SpatialReference); |
|
break; |
|
case "线": |
|
geometry = ConverJsonToIGeoemtry(wySketch.Geometry, ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline); |
|
geometry.Project(this.hookHelper.FocusMap.SpatialReference); |
|
break; |
|
case "面": |
|
geometry = ConverJsonToIGeoemtry(wySketch.Geometry); |
|
geometry.Project(this.hookHelper.FocusMap.SpatialReference); |
|
break; |
|
} |
|
MapsManager.Instance.MapService.DrawGraph(geometry); |
|
if (!string.IsNullOrWhiteSpace(wySketch.BZMS)) |
|
this.hookHelper.ActiveView.GraphicsContainer.AddElement(TextElement(geometry, wySketch.BZMS), 1); |
|
if (isLocation) |
|
MapsManager.Instance.MapService.Zoom(geometry); |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw ex; |
|
} |
|
} |
|
public List<WYSketch> listDdeleteWYSketck { get; set; } |
|
private void BtnClearData_Click(object sender, System.Windows.RoutedEventArgs e) |
|
{ |
|
try |
|
{ |
|
if (MessageHelper.ShowYesNoAndTips("是否确定删除当前图斑所有标注?") != System.Windows.Forms.DialogResult.Yes) |
|
{ |
|
return; |
|
} |
|
foreach (var item in this.NYYSInfo.WYSketch) |
|
{ |
|
if (item.ObjectID > 0) |
|
{ |
|
if (listDdeleteWYSketck == null) |
|
{ |
|
listDdeleteWYSketck = new List<WYSketch>(); |
|
} |
|
listDdeleteWYSketck.Add(item); |
|
} |
|
} |
|
this.NYYSInfo.WYSketch.Clear(); |
|
this.DataContext = null; |
|
this.DataContext = this.NYYSInfo; |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug(ex); |
|
MessageHelper.ShowError("清空标注异常:" + ex.Message); |
|
} |
|
} |
|
|
|
private void BzType_SelectedIndexChanged(object sender, System.Windows.RoutedEventArgs e) |
|
{ |
|
try |
|
{ |
|
BZToolSelected(); |
|
} |
|
catch (Exception ex) |
|
{ |
|
MessageHelper.ShowError(ex.Message); |
|
} |
|
} |
|
|
|
private void TxtYPSM_GotFocus(object sender, System.Windows.RoutedEventArgs e) |
|
{ |
|
if ((MapsManager.Instance.CurrProjectInfo as ProjectInfo) != null) |
|
{ |
|
(MapsManager.Instance.CurrProjectInfo as ProjectInfo).EnableShortcut = false; |
|
} |
|
} |
|
|
|
private void TxtYPSM_LostFocus(object sender, System.Windows.RoutedEventArgs e) |
|
{ |
|
if ((MapsManager.Instance.CurrProjectInfo as ProjectInfo) != null) |
|
{ |
|
(MapsManager.Instance.CurrProjectInfo as ProjectInfo).EnableShortcut = true; |
|
} |
|
} |
|
|
|
private void Txt_delete_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) |
|
{ |
|
try |
|
{ |
|
if ((sender as TextBlock) == null || (sender as TextBlock).Tag == null || (WYSketch)((sender as TextBlock).Tag) == null) |
|
{ |
|
return; |
|
} |
|
WYSketch dr = ((WYSketch)((sender as TextBlock).Tag)); |
|
this.NYYSInfo.WYSketch.Remove(dr); |
|
if (dr.ObjectID > 0) |
|
{ |
|
if (listDdeleteWYSketck == null) |
|
{ |
|
listDdeleteWYSketck = new List<WYSketch>(); |
|
} |
|
listDdeleteWYSketck.Add(dr); |
|
} |
|
this.DataContext = null; |
|
this.DataContext = this.NYYSInfo; |
|
RefreshBZ(null); |
|
} |
|
catch (Exception ex) |
|
{ |
|
MessageHelper.ShowError(ex.Message); |
|
} |
|
} |
|
|
|
private void Txt_info_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) |
|
{ |
|
try |
|
{ |
|
if ((sender as TextBlock) == null || (sender as TextBlock).Tag == null || (WYSketch)((sender as TextBlock).Tag) == null) |
|
{ |
|
return; |
|
} |
|
WYSketch wySketch = ((WYSketch)((sender as TextBlock).Tag)); |
|
LocationBZ(wySketch); |
|
} |
|
catch (Exception ex) |
|
{ |
|
MessageHelper.ShowError("定位失败:" + ex.Message); |
|
} |
|
} |
|
} |
|
}
|
|
|