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

186 lines
7.2 KiB

4 months ago
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geodatabase;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
namespace Kingo.Plugin.EngineEditor.Common
{
/// <summary>
/// 图层符号化的相关操作的API函数
/// </summary>
public static class LabelAPI
{
///<summary>
/// 获取符号信息
///</summary>
/// <param name="pFeatureRenderer">要素渲染</param>
/// <param name="pFeatureCursor"></param>
/// <param name="pDic">符号集合</param>
/// <returns></returns>
public static bool GetSymbolInfos(IFeatureRenderer pFeatureRenderer, IFeatureCursor pFeatureCursor, IDictionary<string, ISymbol> pDic, DataTable dtZD = null, string featurename = null)
{
if (pFeatureRenderer == null || pFeatureCursor == null || pDic == null)
{
return false;
}
IUniqueValueRenderer pUniqueValueRenderer = pFeatureRenderer as IUniqueValueRenderer;
if (pUniqueValueRenderer == null)
{
return true;
}
int iFieldCount = pUniqueValueRenderer.FieldCount;
int[] intArray = new int[iFieldCount];
for (int i = 0; i < iFieldCount; i++)
{
intArray[i] = pFeatureCursor.FindField(pUniqueValueRenderer.get_Field(i));
}
string sFieldDelimiter = pUniqueValueRenderer.FieldDelimiter;
StringBuilder stringBuilder = new StringBuilder();
string sValue, sLabel, sHead;
IFeature pFeature = null;
IDictionary<string, ISymbol> pDictionaryTemp = new Dictionary<string, ISymbol>();
Dictionary<string, string> lstString = new Dictionary<string, string>();
while ((pFeature = pFeatureCursor.NextFeature()) != null)
{
//支持多字段唯一值渲染
if (stringBuilder.Length > 0)
{
stringBuilder.Remove(0, stringBuilder.Length);
}
object obj = pFeature.get_Value(intArray[0]);
if (obj == null || string.IsNullOrWhiteSpace(obj.ToString()) || lstString.Keys.Contains(obj.ToString()))
{
continue;
}
if (featurename.ToUpper() == "DLTB")
{
lstString.Add(obj.ToString(), pFeature.get_Value(pFeatureCursor.FindField("DLMC")).ToString());
}
else
{
lstString.Add(obj.ToString(), obj.ToString());
}
stringBuilder.Append(obj);
for (int i = 1; i < iFieldCount; i++)
{
stringBuilder.Append(sFieldDelimiter);
stringBuilder.Append(pFeature.get_Value(i));
}
sValue = stringBuilder.ToString();
if (string.IsNullOrWhiteSpace(sValue))
{
continue;
}
try
{
sLabel = pUniqueValueRenderer.get_Label(sValue);
try
{
//查找唯一值是否存在引用值
sValue = pUniqueValueRenderer.get_ReferenceValue(sValue);
}
catch
{
}
if (sLabel != null && !pDictionaryTemp.ContainsKey(sLabel))
{
pDictionaryTemp.Add(sLabel, pUniqueValueRenderer.get_Symbol(sValue));
}
}
catch (Exception ex)
{
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeature);
}
//lstString.Clear();
//lstString = null;
pDic.Clear();
//按唯一值渲染类中的符号顺序重新加载符号
for (int i = 0; i < pUniqueValueRenderer.ValueCount; i++)
{
sValue = pUniqueValueRenderer.get_Value(i);
sLabel = pUniqueValueRenderer.get_Label(sValue);
sHead = pUniqueValueRenderer.get_Heading(sValue);
if (!pDictionaryTemp.ContainsKey(sLabel))
{
continue;
}
if (dtZD == null || dtZD.Rows.Count <= 0)
{
if (featurename.ToUpper() == "DLTB")
{
string sLabel2 = lstString.FirstOrDefault(m => m.Key == sValue).Value;
pDic.Add(sLabel2, pDictionaryTemp[sLabel]);
}
else
{
pDic.Add(sLabel, pDictionaryTemp[sLabel]);
}
continue;
}
if (sHead == "JXLX")
{
if (sLabel == "620200")
{
pDic.Add("国界", pDictionaryTemp[sLabel]);
}
else if (sLabel == "630200")
{
pDic.Add("省界", pDictionaryTemp[sLabel]);
}
else if (sLabel == "640200")
{
pDic.Add("地市界", pDictionaryTemp[sLabel]);
}
else if (sLabel == "650200")
{
pDic.Add("县界", pDictionaryTemp[sLabel]);
}
else if (sLabel == "660200")
{
pDic.Add("乡界", pDictionaryTemp[sLabel]);
}
else if (sLabel == "670500")
{
pDic.Add("村界", pDictionaryTemp[sLabel]);
}
else
{
DataRow[] drs = dtZD.Select("Type='" + sHead + "' AND Code='" + sLabel + "'");
if (drs != null && drs.Length == 1 && !string.IsNullOrEmpty(drs[0]["Name"] as string))
{
pDic.Add(drs[0]["Name"].ToString(), pDictionaryTemp[sLabel]);
}
else
{
pDic.Add(sLabel, pDictionaryTemp[sLabel]);
}
}
}
else
{
DataRow[] drs = dtZD.Select("Type='" + sHead + "' AND Code='" + sLabel + "'");
if (drs != null && drs.Length == 1 && !string.IsNullOrEmpty(drs[0]["Name"] as string))
{
pDic.Add(drs[0]["Name"].ToString(), pDictionaryTemp[sLabel]);
}
else
{
pDic.Add(sLabel, pDictionaryTemp[sLabel]);
}
}
}
pDictionaryTemp.Clear();
pDictionaryTemp = null;
return true;
}
}
}