2016-07-07 99 views
0

我正在用C編寫一個WPF應用程序,使用ArcObjects。如何以編程方式將活動圖形圖層添加到地圖?

我在窗體上有一個ESRI.ArcGIS.Controls.AxMapControl,我試圖在它上面繪製一些圖形元素。

我正在開發的地圖是喬治亞州客戶提供的mdf。

我想我在這裏找到一個例子:How to interact with map elements

public void AddTextElement(IMap map, double x, double y) 
{ 
    IGraphicsContainer graphicsContainer = map as IGraphicsContainer; 
    IElement element = new TextElementClass(); 
    ITextElement textElement = element as ITextElement; 

    //Create a point as the shape of the element. 
    IPoint point = new PointClass(); 
    point.X = x; 
    point.Y = y; 
    element.Geometry = point; 
    textElement.Text = "Hello World"; 
    graphicsContainer.AddElement(element, 0); 

    //Flag the new text to invalidate. 
    IActiveView activeView = map as IActiveView; 
    activeView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); 
} 

花了一段時間才能找出如何投影經/緯亞特蘭大到地圖的座標系,但我敢肯定,我已經得到了它的權利。根據我在地圖上使用識別工具時看到的位置數據,我傳入AddTextElement()的x/y值顯然在亞特蘭大地區內。

但我沒有看到文字。一切似乎都正常,但我沒有看到文字。

我可以看到一些可能性:

  • 層我加入的TextElement到是不可見的,或者不存在。
  • 我需要應用一個空間參考系統作爲TextElement的幾何體設置的點
  • 文本繪製得很好,但是字體有點問題 - 它看起來很小,或者以透明的顏色等等

有沒有線索,哪個。

我希望有一些明顯的我失蹤。

===

正如我繼續玩這個,因爲我原來的帖子,我發現這個問題是縮放 - 文本顯示出來,它應該只unreadably小。

這就是Rich Wawrzonek所建議的。

如果我設置了一個帶有指定大小的TextSymbol類,大小確實適用,並且我看到文本大小不一。不幸的是,文本仍然會隨着地圖放大和縮小而調整大小,而我試圖設置ScaleText = false並不能解決這個問題。

我的最新嘗試:

public void AddTextElement(IMap map, double x, double y, string text) 
{ 
    var textElement = new TextElementClass 
    { 
     Geometry = new PointClass() { X = x, Y = y }, 
     Text = text, 
     ScaleText = false, 
     Symbol = new TextSymbolClass {Size = 25000} 
    }; 

    (map as IGraphicsContainer)?.AddElement(textElement, 0); 

    (map as IActiveView)?.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); 
} 

我認識到,上述組織非常不同於方式通常是與ESRI示例代碼來完成。我發現ESRI的方式難以閱讀,但從一個切換到另一個很機械。

這是相同的功能,以更傳統的方式組織。行爲應該是相同的,而且我看到完全相同的行爲 - 文本被繪製爲指定大小,但隨着地圖縮放而縮放。

public void AddTextElement(IMap map, double x, double y, string text) 
{ 
    IPoint point = new PointClass(); 
    point.X = x; 
    point.Y = y; 

    ITextSymbol textSymbol = new TextSymbolClass(); 
    textSymbol.Size = 25000; 

    var textElement = new TextElementClass(); 
    textElement.Geometry = point; 
    textElement.Text = text; 
    textElement.ScaleText = false; 
    textElement.Symbol = textSymbol; 

    var iGraphicsContainer = map as IGraphicsContainer; 
    Debug.Assert(iGraphicsContainer != null, "iGraphicsContainer != null"); 
    iGraphicsContainer.AddElement(textElement, 0); 

    var iActiveView = (map as IActiveView); 
    Debug.Assert(iActiveView != null, "iActiveView != null"); 
    iActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); 
} 

關於爲什麼ScaleText被忽略的任何想法?

+0

交叉發佈爲http://gis.stackexchange.com/q/201319/115 – PolyGeo

回答

1

您只設置文本元素的幾何和文本。您還需要設置Symbol和ScaleText屬性。 ScaleText屬性布爾值將決定它是否與地圖一起縮放。 Symbol屬性需要通過ITextSymbol接口創建和設置。

查看here作爲Esri的一個例子。

相關問題