Tại sao các chú thích này xuất hiện xếp chồng / chồng chéo?


8

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:

nhập mô tả hình ảnh ở đây

[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:

nhập mô tả hình ảnh ở đây

[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 nullcho 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!

nhập mô tả hình ảnh ở đây

Câu trả lời:


4

Sử dụng arccatalog 10 sp2, tôi đã tạo ra một featureclass chú thích mới (không phải là featurelinked) với phép chiếu trang web, dung sai xy 0,001, tỷ lệ tham chiếu 1: 100.000, đơn vị đo bản đồ.

Tôi không kiểm tra "biểu tượng yêu cầu được chọn từ bảng biểu tượng". Chấp nhận tất cả các mặc định cho phần còn lại.

Sau đó tôi đã đi vào arcmap và có thể thêm thủ công, sau đó chạy mã này mà không có bất kỳ vấn đề chồng chéo nào.

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

Xin chào Kirk, tôi đánh giá cao những hiểu biết của bạn ở đây. Vì tò mò, liệu annoClass có làm gì đáng kể ở đầu AddAnno () không? Tuy nhiên, bạn vẫn đang thực hiện một số "thiết lập mọi thứ" khác với tôi. Tôi sẽ cung cấp cho đề xuất này một spin và báo cáo lại. Cảm ơn.
elrobis

Rất tiếc, không có gì có thể bỏ qua. Đó là phần còn lại từ một bài kiểm tra tôi đã làm với một biểu tượng, mà tôi đã nhận được từ IAnnoClass.
Kirk Kuykendall

1
Cảm ơn @Kirk Kuykendall, bạn đã phơi bày vấn đề thực sự ở đây (xem bản cập nhật thứ ba của tôi trong phần câu hỏi). Cảm ơn rất nhiều!
elrobis

2

Sử dụng ISymbolCollectionEuity sẽ cho phép bạn đặt các thuộc tính như khoảng cách ký tự.

Bài viết này giải thích cách bạn nên tiếp cận bằng cách sử dụng một yếu tố văn bản để ngăn chặn vấn đề bạn mô tả.

"Nếu TextE bổ sung được sử dụng, bạn có thể tham chiếu một TextSymbol đang lưu trữ được lưu trữ trong SymbolCollection của AnnotationFeatureClassExtension bằng cách sử dụng giao diện ISymbolCollectionEuity . ISymbolCollectionEuity để biết thêm chi tiết về hệ thống lưu trữ này. "

"ISymbolCollectionEuity cung cấp quyền truy cập vào các thuộc tính của TextElements tham chiếu TextSymbols được lưu trữ trong SymbolCollection như một phần của các lớp tính năng chú thích của Geodatabase. Khi chỉnh sửa TextElements của các tính năng chú thích, điều quan trọng là giao diện này được sử dụng để duy trì liên kết. Truy cập và cập nhật các thuộc tính ký hiệu thông qua ITextEuity :: Symbol sẽ khiến TextEuity bị ngắt kết nối khỏi biểu tượng SymbolCollection và biểu tượng sẽ được lưu trữ nội tuyến với tính năng trong lớp tính năng. Điều này là không mong muốn vì TextSymbols có thể có kích thước lớn. "

Giải quyết các chỉnh sửa của bạn. Thử:

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;

Tôi đánh giá cao sự quan tâm của bạn, @Radar, thực sự. Tuy nhiên, tôi tin rằng trường hợp bạn trình bày là một trong những hiệu quả lưu trữ được cải thiện, trong đó vấn đề tôi gặp phải liên quan đến bố cục của các ký tự văn bản trong phần tử chú thích. Tôi tin điều này bởi vì tôi đã thử ISymbolCollectionEuity và nó cũng cho kết quả tương tự.
elrobis

Để chắc chắn, tôi chỉ thử lại bằng cách sử dụng phương pháp mà bạn đề xuất và tôi thực sự nhận được kết quả tương tự. Tôi sẽ cập nhật câu hỏi để bao gồm nỗ lực sửa đổi của tôi.
elrobis

Đoạn thứ hai trong câu trả lời của tôi đề cập đến trường hợp ITextEuity :: Liên kết biểu tượng bị hỏng, dẫn đến biểu tượng văn bản bị lệch. Đây không phải là một vấn đề hiệu quả lưu trữ, nó có liên quan nhiều hơn đến bảo trì tài sản. Chơi xung quanh với một số thuộc tính ISymbolCollectionEuity và xem bạn có thể sửa đổi văn bản của mình không. Ví dụ: cố gắng thay đổi khoảng cách hoặc làm cho nó đậm.
Radar

Tôi đã cập nhật câu hỏi để phản ánh nỗ lực kết hợp đề xuất của bạn. Ngoài ra, tôi vừa thử thêm scEuity.Bold = true; (một ý tưởng gây tò mò) và trong khi nó làm cho văn bản được in đậm, ngay cả với Bộ ký tự được đặt thành 5, văn bản vẫn hiển thị được xếp chồng lên nhau. Còn suy nghĩ nào khác không?
elrobis

Tôi tự hỏi nếu việc chuyển sang IEuity (scEuity as IEuity) có gây ra sự cố cho IAnnotationFeature hay không. Bạn có thể truyền trực tiếp tới ISymbolCollectionEuity không? (ví dụ: (tính năng như IAnnotationFeature2) .Annotation = scEuity;)
Radar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.