Saya mengalami masalah aneh ketika mencoba mengisi kelas fitur anotasi secara terprogram (ArcObjects, C #). Seperti yang dapat Anda lihat pada gambar di bawah ini, karakter dalam setiap string teks tampaknya saling menumpuk, daripada meletakkan secara horizontal seperti yang saya harapkan.
Saya menarik beberapa nilai dari MySQL (dibuat oleh aplikasi yang berbeda), dan itu terlihat bagus di debugger. Saya sudah mencoba menggunakan campuran sistem koordinat yang tidak diketahui / diproyeksikan, serta beberapa antarmuka Elemen yang berbeda. Jika ada yang melihat dan mengatasi masalah ini sebelumnya saya pasti akan menghargai dorongan ke arah yang benar.
Inilah bagian yang relevan dari C # saya:
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();
Dan seperti yang dijanjikan, inilah hasil yang saya dapatkan:
[Memperbarui]
Per @ Radar's saran saya mencoba revisi berikut, tetapi masih membuat teks penjelasan ditumpuk / tumpang tindih:
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;
Adakah yang memiliki wawasan tambahan?
[Pembaruan Kedua]
Pada dasarnya saya mencoba untuk menyelesaikan apa yang @murdoch lakukan di posting ArcScripts "lama" ini (lihat entri keduanya). Saya meninjau pendekatannya lagi dan memperhatikan bahwa dia menggunakan antarmuka IFormattedTextSymbol, jadi saya mencobanya, namun saya terus mengalami masalah yang sama dengan teks bertumpuk / tumpang tindih dalam anotasi yang ditempatkan. Inilah dorongan terakhir saya dari 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();
Adakah yang mempertanyakan hal ini? atau memiliki implementasi yang disukai? Begini tampilannya sekarang; seperti yang Anda lihat, pendekatannya agak berubah, tetapi hasilnya sama:
[Pembaruan Ketiga]
Pada analisis akhir, masalahnya bukan kode yang saya gunakan untuk membuat anotasi individu tetapi seperti yang diungkapkan oleh @Kirk Kuykendall, masalahnya adalah bagaimana saya membuat AnnotationLayer dengan saya IAnnotationLayerFactory.CreateAnnotationLayer()
. Saya mengirimkan null
untuk IGraphicsLayerScale
argumen, asumsi itu akan memutuskan untuk fungsional, jika tidak jelek, nilai-nilai default. Ternyata tidak. Saya membuat objek itu sebagai berikut, dan itu memperbaiki masalah saya:
// 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!