ArcObjects SDK開發 013 MapFrame

1、如何獲取MapFrame

打開一個Mxd文件,可能包含一個或多個Map,每個Map都會放到一個MapFrame中,加載到PageLayout上。我們可以通過PageLayout繼承的IGraphicsContainer循環判斷獲取各MapFrame對象。也可以調用IGraphicsContainer的FindFrame函數,傳入對應的Map獲取MapFrame對象。

2、MapFrame與Map如何匹配

MapFrame除了地圖格網外,可設置的內容並不多。我們平常經常會設置的主要有邊框、大小以及其要顯示的座標範圍。設置的幾種模式,我們可以在ArcMap的MapFrame屬性界面中看到。

image1.png

自動、固定比例尺以及固定範圍,分別對應SDK中IMapFrame接口ExtentType屬性的ExtentDefault、ExtentScale和ExtentBounds。

第一種模式是ArcMap默認的模式, MapFrame顯示的地圖範圍、地圖的顯示比例尺以及MapFrame的大小都是可以隨意調的。

第二種模式就是固定比例尺,固定後MapFrame的大小可以調節、顯示的地圖範圍可以調節,但地圖的比例尺是固定不變的。

第三種模式是固定地圖顯示範圍,但MapFrame的大小是可以調節的,但只能等比例調節。調節MapFrame的大小調節後,因爲顯示的地圖範圍固定,所以比例尺會做對應的變化。

以上三種模式均可以在ArcMap上測試,看設置後,ArcMap有什麼變化。例如第二種模式設置後,工具欄上的比例尺顯示框以及和放大縮小相關的按鈕都變成了不可用的灰色,,地圖只能平移,不能放大縮小。第三種模式下,地圖就被固定住了,只能顯示指定範圍,地圖既不能放大縮小,也不能平移,大小也只能按照比例調整。

一般在用代碼精確出圖的時候,我習慣使用第三種模式,即在固定比例尺的情況下,設置要出圖的地理範圍,然後用範圍乘以比例尺,計算出MapFrame需要呈現的大小,設置給MapFrame。這樣就可以得到最合適大小的MapFrame,還可以精確的把出圖範圍固定住,並防止用戶誤操作,把地圖放大縮小或平移。

很多時候,我們會先計算出主MapFrame的大小,然後四個方向擴2-5cm,得到Page的大小。例如我們計算出MapFrame,高爲15cm,寬爲20cm,上部留5cm放標題和指北針,下方留5cm放比例尺和圖例等,左右各留3cm的空白。那麼Page的大小可設置爲高爲25cm,寬爲26cm,而MapFrame的位置設置爲3,5。這樣MapFrame就位於了Page的正中間,且距上下左右的距離分別位5cm、5cm、3cm和3cm。如下圖所示。

image2.png

由於本圖,我們設置的Page的單位是mm,所以設置值的時候,設置的是30和50。我們修改的Page的邊界樣式爲藍色虛線,默認位黑色實線。

3、MapGrid

MapFrame繼承了IMapGrids接口,該接口爲IMapGrid集合,管理在MapFrame上的繪製的格網,包括經緯網、公里網等。MapFrame可以同時顯示多個地圖網格。

IMapGrid包含的可設置信息比較多,但一般設置的時候,我們主要關心格網周邊的標註、網格線以及網格間隔值。我們在ArcMap中爲一個MapFrame設置網格,並打開其屬性信息,如下圖所示。

image3.png

平常我們使用,並且關心的包括Axex、Labels、Lines以及Intervals四個標籤,分別是軸信息、文字標註信息、網格線信息以及間隔信息。

回到SDK,和網格相關的幾個比較重要的接口包括IMapGrid和IMeasuredGrid。IMapGrid定義如下。

image4.png

基本上IMapGrid涵蓋了Axex、Labels、Lines三個標籤的信息。IMapGrid接口定義的屬性基本上能和三個標籤頁中的設置框對應的上。IMeasuredGrid接口主要用來設置起始計算座標以及網格間隔。該接口定義如下。

image5.png

該接口和Intervals標籤頁中設置的內容是對應着的。添加經緯網的代碼如下。

IGraphicsContainer myGraphicsContainer = pPageLayout as IGraphicsContainer;
IActiveView myActiveView = pPageLayout as IActiveView;
IMap myMap = myActiveView.FocusMap;
IMapFrame myMapFrame = myGraphicsContainer.FindFrame(myMap) as IMapFrame;
IMapGrids myMapGrids = myMapFrame as IMapGrids;
myMapGrids.ClearMapGrids();

if (this._MapGrid is IMgrsGrid == false && this.GridType == 0)
{
    this._MapGrid = new GraticuleClass();
}
else if (this._MapGrid is IProjectedGrid == false)
{
    this._MapGrid = new MeasuredGridClass();
    (this._MapGrid as IProjectedGrid).SpatialReference = this.BToLayoutDesign.MapFrameItem.SpatialReference;
}

this._MapGrid.Name = "MapGrid";
this._MapGrid.Visible = this.IsVisible;

this._MapGrid.SetTickVisibility(this.IsShowTick, this.IsShowTick, this.IsShowTick, this.IsShowTick);
if (this.IsShowTick == true)
{
    this._MapGrid.TickLength = this.TickLength;
    ICartographicLineSymbol myTickLineSymbol = new CartographicLineSymbolClass();
    myTickLineSymbol.Cap = esriLineCapStyle.esriLCSButt;
    myTickLineSymbol.Width = this.TickWidth;
    myTickLineSymbol.Color = ColorHelper.ConvertWPFToEngine(this.TickColor);
    this._MapGrid.TickLineSymbol = myTickLineSymbol;
}

ICartographicLineSymbol myGridLineSymbol = new CartographicLineSymbolClass();
myGridLineSymbol.Cap = esriLineCapStyle.esriLCSButt;
myGridLineSymbol.Width = this.GridLineWidth;
myGridLineSymbol.Color = ColorHelper.ConvertWPFToEngine(this.GridLineColor);
this._MapGrid.LineSymbol = myGridLineSymbol;

IMeasuredGrid myMeasuredGrid = this._MapGrid as IMeasuredGrid;
myMeasuredGrid.FixedOrigin = true;
myMeasuredGrid.XOrigin = this.XOrigin;
myMeasuredGrid.YOrigin = this.YOrigin;
myMeasuredGrid.XIntervalSize = this.XInterval;
myMeasuredGrid.YIntervalSize = this.YInterval;

IGridLabel myGridLabel = this._MapGrid.LabelFormat;
IFontDisp myFontDisp = myGridLabel.Font;
myFontDisp.Size = (decimal)this.LabelFontSize;
myGridLabel.Font = myFontDisp;
myGridLabel.Color = ColorHelper.ConvertWPFToEngine(this.LabelFontColor);
myGridLabel.LabelOffset = this.LabelOffset;
myGridLabel.LabelAlignment[esriGridAxisEnum.esriGridAxisLeft] = !this.IsLRLabelVertical;
myGridLabel.LabelAlignment[esriGridAxisEnum.esriGridAxisRight] = !this.IsLRLabelVertical;
this.UpdateLabelFormat(myGridLabel);
this._MapGrid.LabelFormat = myGridLabel;
myMapGrids.AddMapGrid(this._MapGrid);

添加後的效果如下。

image6.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章