Beim Versuch, eine Annotation-Feature-Class programmgesteuert zu füllen (ArcObjects, C #), ist ein seltsames Problem aufgetreten. Wie Sie im Bild unten sehen können, scheinen sich die Zeichen in jeder Textzeichenfolge zu stapeln, anstatt horizontal zu liegen, wie ich es erwartet hätte.
Ich ziehe mehrere Werte aus MySQL (erstellt von einer anderen Anwendung) ein, und diese sehen im Debugger gut aus. Ich habe versucht, eine Mischung aus unbekanntem / projiziertem Koordinatensystem sowie einige verschiedene Elementschnittstellen zu verwenden. Wenn jemand dieses Problem schon einmal gesehen und gelöst hat, würde ich mich über einen Vorstoß in die richtige Richtung freuen.
Hier ist der relevante Teil meines C #:
IFeature feature = featureClass.CreateFeature();
ITextElement textElement = new TextElementClass();
textElement.Text = textString; // value like: '183
IElement element = textElement as IElement;
element.Geometry = pointGeom; // Point: x=2986785, y=629058
(feature as IAnnotationFeature2).Annotation = element;
(feature as IAnnotationFeature2).AnnotationClassID = 0;
(feature as IAnnotationFeature2).Status = annoStatus; // ESRI constant for 0, "placed"
feature.Store();
Und wie versprochen, hier ein Blick auf die Ergebnisse, die ich bekomme:
[Aktualisieren]
Per @ Radars Rat habe ich die folgende Überarbeitung versucht, aber es wird immer noch gestapelter / überlappender Anmerkungstext wiedergegeben:
ISymbolCollectionElement scElement = new TextElementClass();
scElement.CharacterSpacing = 5;
scElement.Geometry = pointGeom;
scElement.Text = textString;
(feature as IAnnotationFeature2).Annotation = scElement as IElement;
(feat as IAnnotationFeature2).AnnotationClassID = 0;
(feat as IAnnotationFeature2).Status = annoStatus;
Hat jemand zusätzliche Einblicke?
[Zweites Update]
Grundsätzlich versuche ich zu erreichen, was @murdoch in diesem "alten" ArcScripts-Beitrag getan hat (siehe seinen zweiten Eintrag). Ich habe seinen Ansatz erneut überprüft und festgestellt, dass er die IFormattedTextSymbol-Schnittstelle verwendet. Daher habe ich dies versucht, habe jedoch weiterhin das gleiche Problem mit gestapeltem / überlappendem Text in den platzierten Anmerkungen. Hier ist mein letzter Schub von C #:
IFeature feature = featureClass.CreateFeature();
IFontDisp font = new StdFontClass() as IFontDisp;
font.Name = "Arial";
font.Bold = true;
// font.Size = 30;
// load in some reasonable default values..
IFormattedTextSymbol fmtTextSymb = new TextSymbolClass();
fmtTextSymb.Font = font;
fmtTextSymb.Size = 30;
fmtTextSymb.VerticalAlignment = esriTextVerticalAlignment.esriTVABottom;
fmtTextSymb.HorizontalAlignment = esriTextHorizontalAlignment.esriTHALeft;
fmtTextSymb.Angle = 0;
fmtTextSymb.CharacterSpacing = 100;
fmtTextSymb.CharacterWidth = 100;
fmtTextSymb.FlipAngle = 90;
fmtTextSymb.Leading = 0;
fmtTextSymb.WordSpacing = 100;
fmtTextSymb.Text = textString; // my special text value..
ITextElement textElement = new TextElementClass();
textElement.Symbol = fmtTextSymb;
textElement.Text = textString;
IElement element = textElement as IElement;
element.Geometry = pt;
(feature as IAnnotationFeature2).Annotation = element;
feature.Store();
Hat jemand Probleme damit? oder eine bevorzugte Umsetzung haben? So sieht es jetzt aus; Wie Sie sehen, hat sich der Ansatz etwas geändert, aber die Ergebnisse sind dieselben:
[Drittes Update]
Letztendlich war das Problem nicht der Code, mit dem ich die einzelnen Anmerkungen erstellt habe, aber wie @Kirk Kuykendall enthüllte, bestand das Problem darin, wie ich meinen AnnotationLayer ursprünglich erstellt habe IAnnotationLayerFactory.CreateAnnotationLayer()
. Ich reichte null
das IGraphicsLayerScale
Argument ein und ging davon aus, dass es sich in funktionale, wenn nicht hässliche Standardwerte auflösen würde. Anscheinend nicht. Ich habe dieses Objekt wie folgt erstellt und mein Problem behoben:
// Set the map scale and units the annos should be "cooked for".
// To get ReferenceScale, open ArcMap and zoom to an appropriate level.
// In the Standard toolbar, click the 1:N button (tip says "MapScale").
// It'll output something like 1:1,200. Drop the 1: and the comma
// and that's the value you want for ReferenceScale.
IGraphicsLayerScale graphicsLayerScale = new GraphicsLayerScaleClass();
graphicsLayerScale.ReferenceScale = 1200;
graphicsLayerScale.Units = esriUnits.esriFeet; // this should agree with your proj
Voila!