Mehr

Wie kann man den gerenderten Wert pro Feature abrufen, wenn IGeoFeatureLayer.DisplayAnnotation wahr ist (ArcObjects mit C#)?

Wie kann man den gerenderten Wert pro Feature abrufen, wenn IGeoFeatureLayer.DisplayAnnotation wahr ist (ArcObjects mit C#)?


In einem anderen Bereich meiner Anwendung möchte ich den Beschriftungswert pro Feature anzeigen, der gerendert wird, wenn die Beschriftung in ArcMap aktiviert ist, d. h. wenn IGeoFeatureLayer.DisplayAnnotation wahr wird.

Ich habe eine Liste von Elementen vom Typ IFeature von sagen wir myFeatLayer. Ich kann die Beschriftungseigenschaften auf Layer-Ebene, einschließlich der Textformatierung, abrufen mit:

IGeoFeatureLayer geoLayer = (IGeoFeatureLayer)myFeatLayer; IAnnotateLayerPropertiesCollection anno = pGeoFeatureLayer.AnnotationProperties; IElementCollection iecp; IElementCollection iecup; IAnnotateLayerProperties-Requisiten; anno.QueryItem(0, aus Requisiten, aus iecp, aus iecup); ILabelEngineLayerProperties leprops = props as ILabelEngineLayerProperties; ITextSymboltext = leprops.Symbol;

Was ich nicht unbedingt weiß, ist, wie man ein IFeature abfragt und womit (leprops.Expression?) Wert von dem, was in der Nähe jedes Features von der Labeling-Engine gerendert wird.

Danke im Voraus.


Der grundlegende Arbeitsablauf dafür ist:

  1. Holen Sie sich die AnnotationExpressionEngine von ILabelEngineLayerProperties über get_ExpressionParser
  2. Setzen Sie den Label-Ausdruck über SetExpression für einfache Ausdrücke von SetCode für komplexe Ausdrücke auf dem Parser. Dadurch wird der eigentliche Parser zurückgegeben. Die Einfachheit des Ausdrucks wird durch ILabelEngineLayerProperties::get_IsExpressionSimple bestimmt.
  3. Verwenden Sie die FindLabel-Methode im Parser, um den Beschriftungstext abzurufen.

Dieser Code ist eine Fortsetzung von Craigs Beitrag. Mir ist nicht ganz klar, woher der PreCode kommt. Dies sollte wahrscheinlich ein Kommentar sein, aber wir können keinen Code in einen Kommentar einfügen.

public static void ListLabels(IGeoFeatureLayer gfLayer) { var parsers = GetParsers(gfLayer); IFeature feat; var fCur = gfLayer.FeatureClass.Search(null, false); while ((feat = fCur.NextFeature()) != null) { foreach (KeyValuePair kvp in Parsern) { string label = kvp.Value.FindLabel(feat); Debug.Print("class: {0} oid: {1} label: {2}",kvp.Key, feat.OID, label); } } System.Runtime.InteropServices.Marshal.FinalReleaseComObject(fCur); } öffentliches statisches Wörterbuch GetParsers(IGeoFeatureLayer gfLayer) { var Parser = neues Wörterbuch(); for (int i = 0; i < gfLayer.AnnotationProperties.Count; i++) { IElementCollectionplacedElements; IElementCollection unplacedElements; IAnnotateLayerProperties alProps; gfLayer.AnnotationProperties.QueryItem( i, out alProps, out platziertElements, out unplacedElements); var leProps = alProps as ILabelEngineLayerProperties2; Zeichenfolge preCode = ""; // wo bekommt man das? var aeParser = leProps.ExpressionParser.SetExpression(preCode, leProps.Expression); parsers.Add(alProps.Class, aeParser); } Parser zurückgeben; }