arcgis engine開發中圖層標註設定
阿新 • • 發佈:2019-02-16
做了一個圖層標註顯示並非圖層要素對應欄位值,而作一個翻譯,網上也未找到比較詳細的說明,因此費了較長時間,這裡作一個記錄;
下面對整個設定過程作一個詳細的標註:
IFeatureLayer feaLy = curLayer as IFeatureLayer;//把需要標註的圖層轉化為featurelayer
IGeoFeatureLayer geoFeaLy = feaLy as IGeoFeatureLayer;//轉化為幾何圖層,只有幾何圖層才可以設定標註
if (geoFeaLy == null)
return;
geoFeaLy.DisplayAnnotation = true; //是否顯示標註
ILabelEngineLayerProperties labelEngine = new LabelEngineLayerPropertiesClass();//標註屬性類
IAnnotateLayerProperties labelPro = labelEngine as IAnnotateLayerProperties;//圖層標註屬性類
IAnnotateLayerPropertiesCollection annoLyProCol = geoFeaLy.AnnotationProperties;//圖層標註屬性集合類-
annoLyProCol.Clear();//清空當前圖層的標註設定
if (字典表資料)//表示不顯示圖層要素對應的欄位值,而是把欄位值翻譯成對應的別的說明文字
{
IAnnotationExpressionEngine javaSrc = new AnnotationJScriptEngineClass();
labelEngine.ExpressionParser = javaSrc;//設定成javascript語言去定義
labelEngine.IsExpressionSimple = false;//表示高階定義,而非普通
//下面一段程式碼將根據值來寫javascript語句,這裡是根據一個表資料來定義的,根據當前值是否與ELEMCODE值相等,若相等則顯示ELEMVALUE 的值;
List<Model.TCMODELCODE> coleList = MapContent.AoMapContent.MapInfo.GetModelCodeListByModelCodeGroupID(col.MODELCODEGROUPID);//拼接判斷語句
StringBuilder sb = new StringBuilder();
foreach (Model.TCMODELCODE cc in coleList)
{
if (string.IsNullOrEmpty(sb.ToString()))
sb.Append(" if( s.toLowerCase() ==\"" + cc.ELEMCODE.ToLower() + "\") newS=\" " + cc.ELEMVALUE + "\" ;");
else
sb.Append(" else if( s.toLowerCase() ==\"" + cc.ELEMCODE.ToLower() + "\") newS=\" " + cc.ELEMVALUE + "\"; ");
}
sb.Append(" return newS ");
//上面寫的是判斷語句,這裡作一個整體的javascript類的包裝,並放在標註描述定義裡
labelEngine.Expression = " function FindLabel ( [" +欄位名稱
+ "] ){ s = [" + 欄位名稱
+ "]; newS =[" + 欄位名稱
+ "]; " + sb.ToString() + " }";
}
else
{
//這裡是普通的標註定義,只要把標註欄位名用[]包,放在描述定義裡即可
labelEngine.IsExpressionSimple = true;labelEngine.Expression = string.Format("[{0}]", 欄位名稱);
}
ITextSymbol txtSymbol = new TextSymbolClass();//設定文字顯示符號
System.Drawing.Font dotNetFont = new System.Drawing.Font("宋體", mcLayerInfo.layerEffectInfo.FontSize, mcLayerInfo.layerEffectInfo.fontStyle);
txtSymbol.Font = ESRI.ArcGIS.ADF.COMSupport.OLE.GetIFontDispFromFont(dotNetFont) as stdole.IFontDisp;
IRgbColor rgbCol = new RgbColorClass();
rgbCol.Red = mcLayerInfo.layerEffectInfo.FontColor.R;
rgbCol.Green = mcLayerInfo.layerEffectInfo.FontColor.G;
rgbCol.Blue = mcLayerInfo.layerEffectInfo.FontColor.B;
txtSymbol.Color = rgbCol as IColor;
labelEngine.Symbol = txtSymbol; //把文字元號設定成標註樣式
labelPro.DisplayAnnotation = true; //是否顯示文字標註
ILineLabelPosition labelPositon = new LineLabelPositionClass(); //標註顯示在要素幾何圖層的位置設定
labelPositon.Above = true;
labelPositon.Horizontal = false;
labelPositon.InLine = true;
labelPositon.OnTop = true;
labelPositon.Parallel = true;
labelPositon.ProduceCurvedLabels = true;
labelPro.LabelWhichFeatures = esriLabelWhichFeatures.esriAllFeatures;//顯示要素過濾,這裡是顯示所有要素
IBasicOverposterLayerProperties basicOverpostLp = labelEngine.BasicOverposterLayerProperties;
basicOverpostLp.NumLabelsOption = esriBasicNumLabelsOption.esriOneLabelPerName;
basicOverpostLp.LineLabelPosition = labelPositon;
labelPro.FeatureLayer = feaLy;//這步不可缺少,把featurelayer設定到標註屬性裡
annoLyProCol.Add(labelPro);//最後一步,把標註屬性放到幾何圖層標註屬性設定裡