Tôi đã gặp phải một vấn đề lạ khi cố gắng tạo một lớp tính năng chú thích theo chương trình (ArcObjects, C #). Như bạn có thể thấy trong hình ảnh bên dưới, các ký tự trong mỗi chuỗi văn bản dường như được xếp chồng lên nhau, thay vì bố trí theo chiều ngang như tôi mong đợi.
Tôi đang lấy một số giá trị từ MySQL (được tạo bởi một ứng dụng khác) và chúng có vẻ tốt trong trình gỡ lỗi. Tôi đã thử sử dụng hỗn hợp hệ tọa độ không xác định / dự kiến, cũng như một vài giao diện Element khác nhau. Nếu bất cứ ai đã nhìn thấy và xác định vấn đề này trước khi tôi chắc chắn sẽ đánh giá cao một cú hích đúng hướng.
Đây là phần có liên quan trong C # của tôi:
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();
Và như đã hứa, đây là cái nhìn về kết quả mà tôi nhận được:
[Cập nhật]
Theo lời khuyên của Per @ Radar, tôi đã thử sửa đổi sau, nhưng nó vẫn hiển thị văn bản chú thích xếp chồng / chồng chéo:
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;
Bất cứ ai có bất kỳ hiểu biết bổ sung?
[Cập nhật lần thứ hai]
Về cơ bản, tôi đang cố gắng thực hiện những gì @murdoch đã làm trong bài đăng ArcScripts "cũ" này (xem mục thứ hai của anh ấy). Tôi đã xem lại cách tiếp cận của anh ấy một lần nữa và nhận thấy anh ấy đang sử dụng giao diện IFormattedTextSymbol, vì vậy tôi đã thử điều đó, nhưng tôi vẫn tiếp tục gặp vấn đề tương tự với văn bản xếp chồng / chồng chéo trong các chú thích được đặt. Đây là lực đẩy mới nhất của tôi về 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();
Bất cứ ai có vấn đề với điều này? hoặc có một thực hiện ủng hộ? Đây là những gì nó trông giống như bây giờ; như bạn có thể thấy, cách tiếp cận đã thay đổi phần nào, nhưng kết quả là như nhau:
[Cập nhật thứ ba]
Về phân tích cuối cùng, vấn đề không phải là mã tôi đã sử dụng để tạo các chú thích riêng lẻ mà như @Kirk Kuykendall tiết lộ, vấn đề là ban đầu tôi đã tạo AnnotationLayer như thế nào IAnnotationLayerFactory.CreateAnnotationLayer()
. Tôi đã đệ trình null
cho IGraphicsLayerScale
đối số, giả sử nó sẽ giải quyết các chức năng, nếu không xấu, các giá trị mặc định. Rõ ràng là không. Tôi đã tạo đối tượng đó như sau và nó đã khắc phục vấn đề của tôi:
// 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!