これらの注釈がスタック/オーバーラップして表示されるのはなぜですか?


8

プログラムでアノテーションフィーチャクラスを設定しようとしたときに奇妙な問題が発生しました(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()。私は、それが機能的で醜くないとしても、デフォルト値に解決されると仮定してnullIGraphicsLayerScale引数を提出しました。どうやらそうではない。私は次のようにそのオブジェクトを作成し、それが私の問題を修正しました:

// 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

出来上がり!

ここに画像の説明を入力してください

回答:


4

arccatalog 10 sp2を使用して、Webメルカトル図法、xy許容値0.001、基準縮尺1:100,000、マップ単位メートルを使用して、新しい(フィーチャリンクされていない)アノテーションフィーチャクラスを作成しました。

「シンボルテーブルから選択するシンボルが必要」はチェックしませんでした。残りのすべてのデフォルトを受け入れました。

次に、私はアークマップに入り、手動で追加することができた後、重複する問題なしにこのコードを実行しました。

public class TestButton : ESRI.ArcGIS.Desktop.AddIns.Button
{
    public TestButton()
    {
    }

    protected override void OnClick()
    {
        try
        {
            Test();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    protected override void OnUpdate()
    {
    }
    public void Test()
    {
        var editor = ArcMap.Application.FindExtensionByName("ESRI Object Editor") as IEditor;
        if (editor.EditState != esriEditState.esriStateEditing)
        {
            MessageBox.Show("start editing first");
            return;
        }
        var fLayer = ((IEditLayers)editor).CurrentLayer;
        if(!(fLayer is IAnnotationLayer))
        {
            MessageBox.Show("not an anno layer");
            return;
        }
        var pnt = ((IArea)ArcMap.Document.ActiveView.Extent).Centroid;
        string s = Environment.TickCount.ToString();
        try
        {
            editor.StartOperation();
            AddAnno(fLayer.FeatureClass,pnt,s);
            editor.StopOperation("add anno at center of screen");
            ArcMap.Document.ActiveView.Refresh();
        }
        catch
        {
            editor.AbortOperation();
            throw;
        }
    }

    private void AddAnno(IFeatureClass featClass, IPoint pt, string textString)
    {
        IFeature feature = featClass.CreateFeature();
        var annoClass = featClass.Extension as IAnnoClass;

        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();
    }
}

こんにちはカーク、私はここであなたの洞察に感謝します。好奇心から、そのannoClassはAddAnno()の上部で重要なことをしていますか?それにもかかわらず、私とは異なる方法でいくつかの「設定」を行っています。この推奨事項を少し試して、報告します。ありがとう。
elrobis 2011

おっと、それは無視できます。IAnnoClassから取得した、symbolcollectionで行ったテストの残りです。
カークカイケンダル

1
@Kirk Kuykendallに感謝します。ここで実際の問題を明らかにしました(質問セクションの3番目の更新を参照)。トンありがとう!
elrobis 2011

2

使用ISymbolCollectionElementは、このような文字間隔などのセットの特性にあなたをできるようになります。

この記事では、説明した問題を回避するためにテキスト要素を使用する方法について説明します。

「TextElementを使用する場合、ISymbolCollectionElementインターフェイスを使用して、AnnotationFeatureClassExtensionのSymbolCollectionに格納されている既存のTextSymbol を参照できます。TextElementsをアノテーションフィーチャクラスに格納する場合は、SymbolCollection内のシンボルを参照することを強くお勧めします。ヘルプを参照してくださいこのストレージシステムの詳細については、ISymbolCollectionElement。」

「ISymbolCollectionElementは、ジオデータベースアノテーションフィーチャクラスの一部としてSymbolCollectionに格納されているTextSymbolsを参照するTextElementsのプロパティへのアクセスを提供します。アノテーションフィーチャ のTextElementsを編集する場合、SymbolCollectionシンボルへのリンクを維持するためにこのインターフェイスを使用することが重要です。 ITextElement :: Symbolを介してシンボルプロパティにアクセスして更新すると、TextElementがSymbolCollectionシンボルから切断され、シンボルはフィーチャクラスのフィーチャとインラインで保存されます 。TextSymbolのサイズが大きくなる可能性があるため、これは望ましくありません。

編集への対応。試してください:

ISymbolCollectionElement scElement = new TextElementClass(); 
scElement.CharacterSpacing = 5; 
scElement.Geometry = pointGeom; 
scElement.Text = textString; 

(feature as IAnnotationFeature2).Annotation = scElement; 
(feat as IAnnotationFeature2).AnnotationClassID = 0; 
(feat as IAnnotationFeature2).Status = annoStatus;

@Radar、本当にありがとうございました。しかし、あなたが提示しているケースは、改善されたストレージ効率の1つであると私は思います。私が抱えている問題は、アノテーション要素内のテキスト文字のレイアウトに関連しています。これは、ISymbolCollectionElementを既に試し、同じ結果が得られたためです。
elrobis 2011年

念のため、お勧めの方法でもう一度試したところ、同じ結果が得られました。質問を更新して、変更した試行を含めます。
elrobis 2011年

私の回答の2番目の段落は、ITextElement :: Symbolリンケージが壊れ、テキストシンボルが歪んでいる場合に対処します。これはストレージ効率の問題ではなく、プロパティのメンテナンスに関係しています。ISymbolCollectionElementプロパティのいくつかをいじって、テキストを変更できるかどうかを確認してください。たとえば、間隔を変更したり、太字にしたりします。
レーダー

質問を更新して、あなたの提案を取り入れようとする私の試みを反映しました。また、scElement.Bold = trueを追加してみました。(奇妙なアイデア)、そしてそれテキストを太字にしましたが、CharacterSpacingを5に設定しても、テキストはスタックされたままレンダリングされます。他に何か考えはありますか?
elrobis 2011年

IElement(scElement as IElement)へのキャストがIAnnotationFeatureの問題を引き起こしているのだろうか。ISymbolCollectionElementに直接キャストできますか?(例(feature as IAnnotationFeature2).Annotation = scElement;)
レーダー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.