摘要:在ArcMap中,能够很方面地进行MapView和Layout View两种视图的切换,而且二者之间的数据是同步显示的。关于两种视图同步的实现方法有多种,可以使用ObjectCopy对象进行数据硬拷贝,而比较简单的方法莫过于二者共享一份地图了,这也是最常用的方法。
2、新建Maps类
在同步类中,要用到Maps类,用于管理地图对象。与新建同步类ControlsSynchronizer类似,我们新建一Maps类,其所有代码如下所示:
using System; using System.Collections; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices;
using ESRI.ArcGIS.Carto;
namespace _sdnMap { [Guid("f27d8789-fbbc-4801-be78-0e3cd8fff9d5")] [ClassInterface(ClassInterfaceType.None)] [ProgId("_sdnMap.Maps")] public class Maps : IMaps, IDisposable { //class member - using internally an ArrayList to manage the Maps collection private ArrayList m_array = null;
#region class constructor public Maps() { m_array = new ArrayList(); } #endregion
#region IDisposable Members
/// <summary> /// Dispose the collection /// </summary> public void Dispose() { if (m_array != null) { m_array.Clear(); m_array = null; } }
#endregion
#region IMaps Members
/// <summary> /// Remove the Map at the given index /// </summary> /// <param name="Index"></param> public void RemoveAt(int Index) { if (Index > m_array.Count || Index < 0) throw new Exception("Maps::RemoveAt:\r\nIndex is out of range!");
m_array.RemoveAt(Index); }
/// <summary> /// Reset the Maps array /// </summary> public void Reset() { m_array.Clear(); }
/// <summary> /// Get the number of Maps in the collection /// </summary> public int Count { get { return m_array.Count; } }
/// <summary> /// Return the Map at the given index /// </summary> /// <param name="Index"></param> /// <returns></returns> public IMap get_Item(int Index) { if (Index > m_array.Count || Index < 0) throw new Exception("Maps::get_Item:\r\nIndex is out of range!");
return m_array[Index] as IMap; }
/// <summary> /// Remove the instance of the given Map /// </summary> /// <param name="Map"></param> public void Remove(IMap Map) { m_array.Remove(Map); }
/// <summary> /// Create a new Map, add it to the collection and return it to the caller /// </summary> /// <returns></returns> public IMap Create() { IMap newMap = new MapClass(); m_array.Add(newMap);
return newMap; }
/// <summary> /// Add the given Map to the collection /// </summary> /// <param name="Map"></param> public void Add(IMap Map) { if (Map == null) throw new Exception("Maps::Add:\r\nNew Map is mot initialized!");
m_array.Add(Map); }
#endregion } }
|
3、新建打开文档类OpenNewMapDocument
由于从工具栏自带的打开按钮打开地图文档的时候,不会自动进行两种视图之间的同步,所以我们要自己派生一个OpenNewMapDocument类,用于打开地图文档。
右击项目名,选择“添加|类”,再选择ArcGIS类别中的BaseCommand模板,输入类名为“OpenNewMapDocument.cs”。
首先添加引用:
using System.Windows.Forms; using ESRI.ArcGIS.Carto; |
再添加如下成员变量:
private ControlsSynchronizer m_controlsSynchronizer = null; |
修改默认的构造函数如下所示:
//添加参数 public OpenNewMapDocument(ControlsSynchronizer controlsSynchronizer) { // // TODO: Define values for the public properties // //设定相关属性值 base.m_category = "Generic"; //localizable text base.m_caption = "Open"; //localizable text base.m_message = "This should work in ArcMap/MapControl/PageLayoutControl"; //localizable text base.m_toolTip = "Open"; //localizable text base.m_name = "Generic_Open"; //unique id, non-localizable (e.g. "MyCategory_MyCommand") //初始化m_controlsSynchronizer m_controlsSynchronizer = controlsSynchronizer;
try { // // TODO: change bitmap name if necessary // string bitmapResourceName = GetType().Name + ".bmp"; base.m_bitmap = new Bitmap(GetType(), bitmapResourceName); } catch (Exception ex) { System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap"); } } |
再在OnClick函数中添加如下代码:
public override void OnClick() { // TODO: Add OpenNewMapDocument.OnClick implementation OpenFileDialog dlg = new OpenFileDialog(); dlg.Filter = "Map Documents (*.mxd)|*.mxd"; dlg.Multiselect = false; dlg.Title = "Open Map Document"; if (dlg.ShowDialog() == DialogResult.OK) { string docName = dlg.FileName;
IMapDocument mapDoc = new MapDocumentClass(); if (mapDoc.get_IsPresent(docName) && !mapDoc.get_IsPasswordProtected(docName)) { mapDoc.Open(docName, string.Empty); IMap map = mapDoc.get_Map(0); m_controlsSynchronizer.ReplaceMap(map);
mapDoc.Close(); } } } |
在添加类时,模板会自动添加一个名为“OpenNewMapDocument.bmp”的图标,你可以自己修改或者替换为打开的文件夹的图标。
上一页 [1] [2] [3] 下一页