プログラムでアノテーションフィーチャクラスを設定しようとしたときに奇妙な問題が発生しました(ArcObjects、C#)。下の画像を見るとわかるように、各テキスト文字列の文字は、予想したとおりに水平にレイアウトされているのではなく、互いに重なり合っているように見えます。
MySQL(別のアプリケーションで作成された)からいくつかの値を取得していますが、それらはデバッガーで正常に表示されます。未知の/投影された座標系といくつかの異なるElementインターフェースの混合を使用してみました。誰かがこの問題を以前に見、解決したことがあるなら、私は正しい方向へのプッシュに感謝します。
これが私の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();
そして約束通り、私が得ている結果を見てみましょう:
[更新]
@Radarのアドバイスに従って、次のリビジョンを試してみましたが、スタックされた/重複した注釈テキストがレンダリングされます。
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;
誰か他の洞察がありますか?
【2次更新】
基本的に私は、@ murdochがこの「古い」ArcScripts投稿で行ったことを達成しようとしています(2番目のエントリを参照)。私は彼のアプローチを再度確認し、彼がIFormattedTextSymbolインターフェースを使用していることに気付いたので、それを試しましたが、配置された注釈のスタック/オーバーラップテキストで同じ問題が引き続き発生します。これが私の最新の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();
誰かこれに問題がありますか?または支持された実装がありますか?これが今の様子です。ご覧のとおり、アプローチは多少変更されましたが、結果は同じです。
【3回目の更新】
最終的な分析では、問題は個々の注釈を作成するために使用したコードではありませんでしたが、@ Kirk Kuykendallが明らかにしたように、最初にでAnnotationLayerを作成した方法に問題がありましたIAnnotationLayerFactory.CreateAnnotationLayer()
。私は、それが機能的で醜くないとしても、デフォルト値に解決されると仮定してnull
、IGraphicsLayerScale
引数を提出しました。どうやらそうではない。私は次のようにそのオブジェクトを作成し、それが私の問題を修正しました:
// 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
出来上がり!