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

742 lines
32 KiB

4 months ago

using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using KGIS.Plugin.LayerProperty.Enum;
using KGIS.Plugin.LayerProperty.Interface;
using KGIS.Plugin.LayerProperty.View;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace KGIS.Plugin.LayerProperty.Utils
{
internal class RenderUtil
{
public delegate void LayerRenderDescriptionDelegate(string desc);
private const string CONST_SYMBOL = "F_Symbol";
private const string CONST_VALUE = "F_Value";
private const string CONST_LABEL = "F_Label";
private const string CONST_BITMAP = "F_BITMAP";
private static FormSymbolSelector frmSymbolSelector;
private static IUIPlugIn symbolSelector;
private static FormGalleryPathSelector frmGalleryPathSelector;
private static KGIS.Framework.Utils.Dialog.OpenFileDialog openFileDialog;
public static event RenderUtil.LayerRenderDescriptionDelegate LayerRenderDescription;
internal static IDoStyleGalleryItem OpenStyleSelector(esriGeometryType GeometryType)
{
try
{
if (RenderUtil.frmSymbolSelector == null)
{
RenderUtil.frmSymbolSelector = new FormSymbolSelector();
RenderUtil.symbolSelector = RenderUtil.frmSymbolSelector;
//RenderUtil.symbolSelector.RDBHelper = RdbUtil.RDBHelper;
//RenderUtil.symbolSelector.TraceHandler = Util.TraceHandler;
//RenderUtil.symbolSelector.Log = Util.Log;
RenderUtil.frmSymbolSelector.Init();
}
switch (GeometryType)
{
case esriGeometryType.esriGeometryPoint:
RenderUtil.frmSymbolSelector.Init(esriStyleClass.MarkerSymbols);
break;
case esriGeometryType.esriGeometryPolyline:
RenderUtil.frmSymbolSelector.Init(esriStyleClass.LineSymbols);
break;
case esriGeometryType.esriGeometryPolygon:
RenderUtil.frmSymbolSelector.Init(esriStyleClass.FillSymbols);
break;
}
if (RenderUtil.frmSymbolSelector.ShowDialog() == DialogResult.OK)
{
return RenderUtil.frmSymbolSelector.DoStyleGalleryItem;
}
}
catch (Exception ex)
{
//RdbUtil.AddException(ex);
}
return null;
}
internal static object OpenStyleSelector(esriGeometryType GeometryType, ISymbol symbol)
{
try
{
if (RenderUtil.frmSymbolSelector == null)
{
RenderUtil.frmSymbolSelector = new FormSymbolSelector();
RenderUtil.symbolSelector = RenderUtil.frmSymbolSelector;
try
{
//RenderUtil.symbolSelector.RDBHelper = RdbUtil.RDBHelper;
//RenderUtil.symbolSelector.TraceHandler = Util.TraceHandler;
//RenderUtil.symbolSelector.Log = Util.Log;
}
catch
{
}
RenderUtil.frmSymbolSelector.Init();
}
switch (GeometryType)
{
case esriGeometryType.esriGeometryPoint:
RenderUtil.frmSymbolSelector.Init(esriStyleClass.MarkerSymbols, ref symbol);
break;
case esriGeometryType.esriGeometryPolyline:
RenderUtil.frmSymbolSelector.Init(esriStyleClass.LineSymbols, ref symbol);
break;
case esriGeometryType.esriGeometryPolygon:
RenderUtil.frmSymbolSelector.Init(esriStyleClass.FillSymbols, ref symbol);
break;
}
if (RenderUtil.frmSymbolSelector.ShowDialog() == DialogResult.OK)
{
return RenderUtil.frmSymbolSelector.ResultSymbol;
}
}
catch (Exception ex)
{
//RdbUtil.AddException(ex);
}
return null;
}
internal static object OpenStyleSelector(esriStyleClass styleClass, ISymbol symbol)
{
try
{
if (RenderUtil.frmSymbolSelector == null)
{
RenderUtil.frmSymbolSelector = new FormSymbolSelector();
RenderUtil.symbolSelector = RenderUtil.frmSymbolSelector;
try
{
//RenderUtil.symbolSelector.RDBHelper = RdbUtil.RDBHelper;
//RenderUtil.symbolSelector.TraceHandler = Util.TraceHandler;
//RenderUtil.symbolSelector.Log = Util.Log;
}
catch
{
}
RenderUtil.frmSymbolSelector.Init();
}
RenderUtil.frmSymbolSelector.Init(styleClass, ref symbol);
if (RenderUtil.frmSymbolSelector.ShowDialog() == DialogResult.OK)
{
return RenderUtil.frmSymbolSelector.ResultSymbol;
}
}
catch (Exception ex)
{
//RdbUtil.AddException(ex);
}
return null;
}
internal static object OpenGalleryPathSelector()
{
try
{
if (RenderUtil.frmGalleryPathSelector == null)
{
RenderUtil.frmGalleryPathSelector = new FormGalleryPathSelector();
RenderUtil.symbolSelector = RenderUtil.frmGalleryPathSelector;
//RenderUtil.symbolSelector.RDBHelper = RdbUtil.RDBHelper;
//RenderUtil.symbolSelector.TraceHandler = Util.TraceHandler;
//RenderUtil.symbolSelector.Log = Util.Log;
RenderUtil.frmGalleryPathSelector.Init();
}
if (RenderUtil.frmGalleryPathSelector.ShowDialog() == DialogResult.OK)
{
if (frmGalleryPathSelector.UpdateTextName != null)
{
frmGalleryPathSelector.SelectedPath = frmGalleryPathSelector.UpdateTextName;
}
return RenderUtil.frmGalleryPathSelector.SelectedPath;
}
}
catch (Exception ex)
{
//RdbUtil.AddException(ex);
}
return null;
}
internal static IDoStyleGalleryItem OpenStyleSelector(esriStyleClass styleClass)
{
try
{
if (RenderUtil.frmSymbolSelector == null)
{
RenderUtil.frmSymbolSelector = new FormSymbolSelector();
RenderUtil.symbolSelector = RenderUtil.frmSymbolSelector;
//RenderUtil.symbolSelector.RDBHelper = RdbUtil.RDBHelper;
//RenderUtil.symbolSelector.TraceHandler = Util.TraceHandler;
//RenderUtil.symbolSelector.Log = Util.Log;
RenderUtil.frmSymbolSelector.Init();
}
RenderUtil.frmSymbolSelector.Init(styleClass);
if (RenderUtil.frmSymbolSelector.ShowDialog() == DialogResult.OK)
{
return RenderUtil.frmSymbolSelector.DoStyleGalleryItem;
}
}
catch (Exception ex)
{
//RdbUtil.AddException(ex);
}
return null;
}
internal static Bitmap GetSymbolBitMap(int width, int height, IStyleGalleryClass symbologyStyleClass, ISymbol pSymbol)
{
try
{
Bitmap result;
if (pSymbol == null || symbologyStyleClass == null)
{
result = null;
return result;
}
result = StyleGalleryItemView.StyleGalleryItemToBmp(width, height, symbologyStyleClass, new ServerStyleGalleryItemClass
{
Item = pSymbol
});
return result;
}
catch (Exception ex)
{
//RdbUtil.AddException(ex);
}
return null;
}
internal static Hashtable GetAllSymbols(string path, string className)
{
IStyleGallery styleGallery = new ServerStyleGalleryClass();
Hashtable hashtable = new Hashtable();
IStyleGalleryStorage styleGalleryStorage = styleGallery as IStyleGalleryStorage;
styleGalleryStorage.AddFile(path);
IEnumStyleGalleryItem enumStyleGalleryItem = styleGallery.get_Items(className, path, null);
enumStyleGalleryItem.Reset();
for (IStyleGalleryItem styleGalleryItem = enumStyleGalleryItem.Next(); styleGalleryItem != null; styleGalleryItem = enumStyleGalleryItem.Next())
{
object item = styleGalleryItem.Item;
if (item is ISymbol)
{
ISymbol value = item as ISymbol;
string name = styleGalleryItem.Name;
try
{
hashtable.Add(name, value);
}
catch (Exception)
{
}
}
}
return hashtable;
}
internal static Hashtable GetAllSymbols(IDoStyleGalleryPath path, string className)
{
Hashtable hashtable = new Hashtable();
try
{
IDoStyleGallery doStyleGallery = StyleGalleryFactory.CreateDistStyleGallery();
IDoStyleGalleryStorage doStyleGalleryStorage = doStyleGallery as IDoStyleGalleryStorage;
doStyleGalleryStorage.AddDoStyleGalleryPath(path);
List<IDoStyleGalleryItem> list = doStyleGallery.get_Items(className, path, "");
foreach (IDoStyleGalleryItem current in list)
{
object item = current.Item.Item;
if (item is ISymbol)
{
ISymbol value = item as ISymbol;
string name = current.Name;
try
{
hashtable.Add(name, value);
}
catch (Exception)
{
}
}
}
}
catch (Exception ex)
{
//RdbUtil.AddException(ex);
}
return hashtable;
}
/// <summary>
/// 获取匹配的符号集
/// </summary>
/// <param name="path"></param>
/// <param name="className"></param>
/// <returns>王欢 2018-12-13</returns>
internal static Hashtable GetAllSymbols_NEW(string path, string className)
{
try
{
//ServerStyleGallery对象
Hashtable hashtable = new Hashtable();
IStyleGallery pStyleGaller = new ServerStyleGalleryClass();
IStyleGalleryStorage pStyleGalleryStorage = pStyleGaller as IStyleGalleryStorage;
IEnumStyleGalleryItem pEnumSyleGalleryItem = null;
IStyleGalleryItem pStyleGallerItem = null;
IStyleGalleryClass pStyleGalleryClass = null;
//使用IStyleGalleryStorage接口的AddFile方法加载ServerStyle文件
pStyleGalleryStorage.AddFile(path);
//遍历ServerGallery中的Class
for (int i = 0; i < pStyleGaller.ClassCount; i++)
{
pStyleGalleryClass = pStyleGaller.get_Class(i);
if (pStyleGalleryClass.Name != className)
continue;
//获取EnumStyleGalleryItem对象
pEnumSyleGalleryItem = pStyleGaller.get_Items(className, path, "");
pEnumSyleGalleryItem.Reset();
if (pEnumSyleGalleryItem == null)
continue;
//遍历pEnumSyleGalleryItem
pStyleGallerItem = pEnumSyleGalleryItem.Next();
while (pStyleGallerItem != null)
{
//获取符号
ISymbol pSymbol = pStyleGallerItem.Item as ISymbol;
if (pStyleGallerItem.Item is ISymbol)
{
ISymbol value = pStyleGallerItem.Item as ISymbol;
string name = pStyleGallerItem.Name;
if (!hashtable.ContainsKey(name))
{
hashtable.Add(name, value);
}
}
pStyleGallerItem = pEnumSyleGalleryItem.Next();
}
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(pEnumSyleGalleryItem);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pStyleGalleryClass);
return hashtable;
}
catch (Exception ex)
{
//KGIS.Common.Utility.LogAPI.Debug(ex);
RenderUtil.InvkeLayerRenderDescription("未找到符合的样式符合!");
return null;
}
}
internal static void FeatureLayerAutoMatch2(IFeatureLayer2 FeaLyr, object StylePath, string MatchField, int MaxMatchCount, out StringBuilder messages)
{
messages = new StringBuilder();
try
{
messages.AppendLine("开始匹配:<" + (FeaLyr as ILayer).Name + "> " + DateTime.Now.ToString());
IGeoFeatureLayer geoFeatureLayer = FeaLyr as IGeoFeatureLayer;
if (geoFeatureLayer == null)
{
messages.AppendLine("不能对图层:<" + (FeaLyr as ILayer).Name + ">进行渲染。");
messages.AppendLine("=======================");
}
else
{
IUniqueValueRenderer uniqueValueRenderer = geoFeatureLayer.Renderer as IUniqueValueRenderer;
if (uniqueValueRenderer == null)
{
uniqueValueRenderer = new UniqueValueRendererClass();
}
ISymbol defaultSymbol = uniqueValueRenderer.DefaultSymbol;
if (defaultSymbol == null)
{
defaultSymbol = RenderUtil.GetDefaultSymbol(FeaLyr.FeatureClass.ShapeType);
}
string text = null;
IDisplayTable displayTable = (IDisplayTable)FeaLyr;
ICursor cursor = displayTable.DisplayTable.Search(null, false);
IDataStatistics dataStatistics = new DataStatisticsClass();
dataStatistics.Cursor = cursor;
dataStatistics.Field = MatchField;
dataStatistics.SampleRate = -1;
IEnumerator uniqueValues = dataStatistics.UniqueValues;
uniqueValues.Reset();
string className = RenderUtil.GetClassName(FeaLyr);
Hashtable hashtable = null;
if (StylePath is IDoStyleGalleryPath)
{
hashtable = RenderUtil.GetAllSymbols(StylePath as IDoStyleGalleryPath, className);
}
else
{
hashtable = RenderUtil.GetAllSymbols(StylePath.ToString(), className);
}
uniqueValueRenderer.FieldCount = 1;
uniqueValueRenderer.RemoveAllValues();
uniqueValueRenderer.set_Field(0, MatchField);
int num = displayTable.DisplayTable.RowCount(null);
messages.AppendLine("共有:" + num + "个要素需要匹配。");
IQueryFilter queryFilter = new QueryFilterClass();
int num2 = 0;
while (uniqueValues.MoveNext())
{
try
{
text = Convert.ToString(uniqueValues.Current);
}
catch (Exception)
{
}
ISymbol symbol = hashtable[text] as ISymbol;
if (symbol == null)
{
queryFilter.WhereClause = MatchField + "='" + text + "'";
int num3 = displayTable.DisplayTable.RowCount(queryFilter);
messages.AppendLine(string.Concat(new object[]
{
MatchField,
"值为:",
text,
"的",
num3,
"个要素未匹配到符号,使用默认符号"
}));
uniqueValueRenderer.AddValue(text, MatchField, defaultSymbol);
}
else
{
uniqueValueRenderer.AddValue(text, MatchField, symbol);
}
num2++;
if (num2 >= MaxMatchCount && MaxMatchCount > 0)
{
messages.AppendLine(string.Concat(new object[]
{
"总个数",
dataStatistics.UniqueValueCount,
"个,已匹配",
MaxMatchCount,
"个,没有完全匹配"
}));
break;
}
}
uniqueValueRenderer.DefaultSymbol = defaultSymbol;
uniqueValueRenderer.UseDefaultSymbol = true;
(FeaLyr as IGeoFeatureLayer).Renderer = (uniqueValueRenderer as IFeatureRenderer);
messages.AppendLine(string.Concat(new object[]
{
"<",
(FeaLyr as ILayer).Name,
">符号匹配结束,共匹配:",
num2,
"种符号。 ",
DateTime.Now.ToString()
}));
messages.AppendLine("=======================");
}
}
catch (Exception ex)
{
//RdbUtil.AddException(ex);
}
}
internal static void FeatureLayerAutoMatch(IFeatureLayer2 FeaLyr, object StylePath, string MatchField, int MaxMatchCount)
{
try
{
RenderUtil.InvkeLayerRenderDescription("开始匹配:<" + (FeaLyr as ILayer).Name + "> " + DateTime.Now.ToString());
IGeoFeatureLayer geoFeatureLayer = FeaLyr as IGeoFeatureLayer;
if (geoFeatureLayer == null)
{
RenderUtil.InvkeLayerRenderDescription("不能对图层:<" + (FeaLyr as ILayer).Name + ">进行渲染。");
}
else
{
IUniqueValueRenderer uniqueValueRenderer = geoFeatureLayer.Renderer as IUniqueValueRenderer;
if (uniqueValueRenderer == null)
{
uniqueValueRenderer = new UniqueValueRendererClass();
}
ISymbol defaultSymbol = uniqueValueRenderer.DefaultSymbol;
if (defaultSymbol == null)
{
defaultSymbol = RenderUtil.GetDefaultSymbol(FeaLyr.FeatureClass.ShapeType);
}
string text = null;
IDisplayTable displayTable = (IDisplayTable)FeaLyr;
ICursor cursor = displayTable.DisplayTable.Search(null, false);
IDataStatistics dataStatistics = new DataStatisticsClass();
dataStatistics.Cursor = cursor;
dataStatistics.Field = MatchField;
dataStatistics.SampleRate = -1;
IEnumerator uniqueValues = dataStatistics.UniqueValues;
uniqueValues.Reset();
string className = RenderUtil.GetClassName(FeaLyr);
Hashtable hashtable = null;
if (StylePath is IDoStyleGalleryPath)
{
hashtable = RenderUtil.GetAllSymbols(StylePath as IDoStyleGalleryPath, className);
}
else
{
hashtable = RenderUtil.GetAllSymbols(StylePath.ToString(), className);
}
uniqueValueRenderer.FieldCount = 1;
uniqueValueRenderer.RemoveAllValues();
uniqueValueRenderer.set_Field(0, MatchField);
int num = displayTable.DisplayTable.RowCount(null);
RenderUtil.InvkeLayerRenderDescription("共有:" + num + "个要素需要匹配。");
IQueryFilter queryFilter = new QueryFilterClass();
int num2 = 0;
while (uniqueValues.MoveNext())
{
try
{
text = Convert.ToString(uniqueValues.Current);
}
catch (Exception)
{
}
ISymbol symbol = hashtable[text] as ISymbol;
if (symbol == null)
{
queryFilter.WhereClause = MatchField + "='" + text + "'";
int num3 = displayTable.DisplayTable.RowCount(queryFilter);
RenderUtil.InvkeLayerRenderDescription(string.Concat(new object[]
{
MatchField,
"值为:",
text,
"的",
num3,
"个要素未匹配到符号,使用默认符号"
}));
uniqueValueRenderer.AddValue(text, MatchField, defaultSymbol);
}
else
{
uniqueValueRenderer.AddValue(text, MatchField, symbol);
}
num2++;
if (num2 >= MaxMatchCount && MaxMatchCount > 0)
{
RenderUtil.InvkeLayerRenderDescription(string.Concat(new object[]
{
"总个数",
dataStatistics.UniqueValueCount,
"个,已匹配",
MaxMatchCount,
"个,没有完全匹配"
}));
break;
}
}
uniqueValueRenderer.DefaultSymbol = defaultSymbol;
uniqueValueRenderer.UseDefaultSymbol = true;
(FeaLyr as IGeoFeatureLayer).Renderer = (uniqueValueRenderer as IFeatureRenderer);
RenderUtil.InvkeLayerRenderDescription(string.Concat(new object[]
{
"<",
(FeaLyr as ILayer).Name,
">符号匹配结束,共匹配:",
num2,
"种符号。 ",
DateTime.Now.ToString()
}));
}
}
catch (Exception ex)
{
RenderUtil.InvkeLayerRenderDescription("匹配异常:" + ex.Message);
//RdbUtil.AddException(ex);
}
}
internal static string GetClassName(IFeatureLayer2 pLayer)
{
esriGeometryType shapeType = pLayer.ShapeType;
switch (shapeType)
{
case esriGeometryType.esriGeometryPoint:
return "Marker Symbols";
case esriGeometryType.esriGeometryMultipoint:
goto IL_36;
case esriGeometryType.esriGeometryPolyline:
break;
case esriGeometryType.esriGeometryPolygon:
return "Fill Symbols";
default:
if (shapeType != esriGeometryType.esriGeometryLine)
{
goto IL_36;
}
break;
}
return "Line Symbols";
IL_36:
return "";
}
internal static ISymbol GetDefaultSymbol(esriGeometryType geometryType)
{
try
{
ISymbol result = null;
IRgbColor rgbColor = new RgbColorClass();
rgbColor.Red = 184;
rgbColor.Green = 242;
rgbColor.Blue = 200;
switch (geometryType)
{
case esriGeometryType.esriGeometryPoint:
result = (new SimpleMarkerSymbolClass
{
Color = rgbColor,
Style = esriSimpleMarkerStyle.esriSMSCircle
} as ISymbol);
goto IL_B3;
case esriGeometryType.esriGeometryMultipoint:
goto IL_B3;
case esriGeometryType.esriGeometryPolyline:
break;
case esriGeometryType.esriGeometryPolygon:
result = (new SimpleFillSymbolClass
{
Color = rgbColor,
Style = esriSimpleFillStyle.esriSFSSolid
} as ISymbol);
goto IL_B3;
default:
if (geometryType != esriGeometryType.esriGeometryLine)
{
goto IL_B3;
}
break;
}
result = (new SimpleLineSymbolClass
{
Color = rgbColor,
Width = 1.0,
Style = esriSimpleLineStyle.esriSLSSolid
} as ISymbol);
IL_B3:
return result;
}
catch (Exception ex)
{
//RdbUtil.AddException(ex);
}
return null;
}
internal static ILayerFile OpenLayerFile()
{
ILayerFile layerFile = null;
if (RenderUtil.openFileDialog == null)
{
RenderUtil.openFileDialog = new KGIS.Framework.Utils.Dialog.OpenFileDialog();
}
RenderUtil.openFileDialog.Filter = "图层文件(*.lyr)|*.lyr";
RenderUtil.openFileDialog.Title = "选择图层文件";
RenderUtil.openFileDialog.Multiselect = false;
if (!RenderUtil.openFileDialog.ShowDialog())
{
return layerFile;
}
string fileName = RenderUtil.openFileDialog.FileName;
if (fileName != "")
{
layerFile = new LayerFileClass();
layerFile.Open(fileName);
return layerFile;
}
return layerFile;
}
internal static void InvkeLayerRenderDescription(string desc)
{
if (RenderUtil.LayerRenderDescription != null)
{
RenderUtil.LayerRenderDescription(desc);
}
}
internal static void SetUniqueValuesToTable(IUniqueValueRenderer m_LyrRender, IStyleGalleryClass m_SymbologyStyleClass, DataTable m_SymbolTable)
{
try
{
DataRow dataRow = null;
for (int i = 0; i < m_LyrRender.ValueCount; i++)
{
string text = m_LyrRender.get_Value(i);
ISymbol symbol = m_LyrRender.get_Symbol(text);
string value = m_LyrRender.get_Label(text);
if (symbol == null)
{
if (dataRow != null)
{
dataRow["F_Value"] = dataRow["F_Value"] + ";" + text;
dataRow.AcceptChanges();
}
}
else
{
Bitmap symbolBitMap = RenderUtil.GetSymbolBitMap(40, 20, m_SymbologyStyleClass, symbol);
IClone clone = symbol as IClone;
ISymbol value2 = clone.Clone() as ISymbol;
dataRow = m_SymbolTable.NewRow();
dataRow["F_BITMAP"] = symbolBitMap;
dataRow["F_Value"] = text;
dataRow["F_Label"] = value;
dataRow["F_Symbol"] = value2;
m_SymbolTable.Rows.Add(dataRow);
}
}
}
catch (Exception ex)
{
//RdbUtil.AddException(ex);
}
}
internal static void SetUniqueValuesFromTable(IUniqueValueRenderer m_LyrRender, string headName, DataTable m_SymbolTable)
{
try
{
for (int i = 0; i < m_SymbolTable.Rows.Count; i++)
{
DataRow dataRow = m_SymbolTable.Rows[i];
string text = Convert.ToString(dataRow["F_Value"]);
string label = (dataRow["F_Label"] == DBNull.Value) ? "" : dataRow["F_Label"].ToString();
ISymbol symbol = dataRow["F_Symbol"] as ISymbol;
string[] array = text.Split(new char[]
{
';'
});
if (array.Length > 0)
{
m_LyrRender.AddValue(array[0], headName, symbol);
m_LyrRender.set_Label(array[0], label);
m_LyrRender.set_Symbol(array[0], symbol);
for (int j = 1; j < array.Length; j++)
{
string value = array.GetValue(j).ToString();
m_LyrRender.AddReferenceValue(value, array[0]);
}
}
}
}
catch (Exception ex)
{
//RdbUtil.AddException(ex);
}
}
}
}