3sdnMap.cs
Upload User: whsxdl
Upload Date: 2022-02-16
Package Size: 151k
Code Size: 19k
Category:

GIS program

Development Platform:

Visual C++

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using ESRI.ArcGIS.Carto;
  9. using ESRI.ArcGIS.Controls;
  10. using ESRI.ArcGIS.esriSystem;
  11. using ESRI.ArcGIS.Display;
  12. using ESRI.ArcGIS.Geometry;
  13. using ESRI.ArcGIS.SystemUI;
  14. namespace _sdnMap
  15. {
  16.     public partial class Form1 : Form
  17.     {
  18.         private ESRI.ArcGIS.Controls.IMapControl3 m_mapControl = null;
  19.         private ESRI.ArcGIS.Controls.IPageLayoutControl2 m_pageLayoutControl = null;
  20.         private IMapDocument pMapDocument;
  21.         private ControlsSynchronizer m_controlsSynchronizer = null;
  22.         //private string sMapUnits;
  23.              
  24.         private ITOCControl2 m_tocControl = null; 
  25.         private IToolbarMenu m_menuMap = null; 
  26.         private IToolbarMenu m_menuLayer = null; 
  27.         public Form1()
  28.         {
  29.             InitializeComponent();
  30.         }
  31.         private void Form1_Load(object sender, EventArgs e)
  32.         {
  33.             //取得MapControl和PageLayoutControl的引用
  34.             m_mapControl = (IMapControl3)this.axMapControl1.Object;
  35.             m_pageLayoutControl = (IPageLayoutControl2)this.axPageLayoutControl1.Object;
  36.             m_menuMap = new ToolbarMenuClass(); 
  37.             m_menuLayer = new ToolbarMenuClass(); 
  38.   
  39.             //初始化controls synchronization calss
  40.             m_controlsSynchronizer = new ControlsSynchronizer(m_mapControl, m_pageLayoutControl);
  41.             //把MapControl和PageLayoutControl绑定起来(两个都指向同一个Map),然后设置MapControl为活动的Control
  42.             m_controlsSynchronizer.BindControls(true);
  43.             //为了在切换MapControl和PageLayoutControl视图同步,要添加Framework Control
  44.             m_controlsSynchronizer.AddFrameworkControl(axToolbarControl1.Object);
  45.             m_controlsSynchronizer.AddFrameworkControl(this.axTOCControl1.Object);
  46.             // 添加打开命令按钮到工具条
  47.              OpenNewMapDocument openMapDoc = new OpenNewMapDocument(m_controlsSynchronizer);
  48.              axToolbarControl1.AddItem(openMapDoc, -1, 0, false, -1, esriCommandStyles.esriCommandStyleIconOnly);
  49.             // sMapUnits = "Unknown";
  50.              m_tocControl = (ITOCControl2)this.axTOCControl1.Object; 
  51.              
  52. //添加自定义菜单项到TOCCOntrol的Map菜单中  
  53. //打开文档菜单 
  54.  
  55. m_menuMap.AddItem(new OpenNewMapDocument(m_controlsSynchronizer), -1, 0, false, esriCommandStyles.esriCommandStyleIconAndText); 
  56.  
  57. //添加数据菜单 
  58.              m_menuMap.AddItem(new ControlsAddDataCommandClass(), -1, 1, false, esriCommandStyles.esriCommandStyleIconAndText); 
  59.  //打开全部图层菜单 
  60.  m_menuMap.AddItem(new LayerVisibility(), 1, 2, false, esriCommandStyles.esriCommandStyleTextOnly); 
  61. //关闭全部图层菜单 
  62.  m_menuMap.AddItem(new LayerVisibility(), 2, 3, false, esriCommandStyles.esriCommandStyleTextOnly); 
  63.  //以二级菜单的形式添加内置的“选择”菜单 
  64.  m_menuMap.AddSubMenu("esriControls.ControlsFeatureSelectionMenu", 4, true); 
  65. //以二级菜单的形式添加内置的“地图浏览”菜单 
  66.  m_menuMap.AddSubMenu("esriControls.ControlsMapViewMenu",5, true); 
  67.  
  68.  
  69. //添加自定义菜单项到TOCCOntrol的图层菜单中 
  70.  m_menuLayer = new ToolbarMenuClass(); 
  71. //添加“移除图层”菜单项 
  72. m_menuLayer.AddItem(new RemoveLayer(), -1, 0, false, esriCommandStyles.esriCommandStyleTextOnly); 
  73. //添加“放大到整个图层”菜单项 
  74.   m_menuLayer.AddItem(new ZoomToLayer(), -1, 1, true, esriCommandStyles.esriCommandStyleTextOnly); 
  75.  
  76.  
  77.  //设置菜单的Hook 
  78.  m_menuLayer.SetHook(m_mapControl); 
  79.  m_menuMap.SetHook(m_mapControl); 
  80.  
  81.         }
  82.         /// <summary>
  83.         /// 新建地图命令
  84.         /// </summary>
  85.         /// <param name="sender"></param>
  86.         /// <param name="e"></param>
  87.         private void New_Click(object sender, EventArgs e)
  88.         {
  89.             //询问是否保存当前地图
  90.             DialogResult res = MessageBox.Show("是否保存当前地图?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
  91.             if (res == DialogResult.Yes)
  92.             {
  93.                 //如果要保存,调用另存为对话框
  94.                 ICommand command = new ControlsSaveAsDocCommandClass();
  95.                 if (m_mapControl != null)
  96.                     command.OnCreate(m_controlsSynchronizer.MapControl.Object);
  97.                 else
  98.                     command.OnCreate(m_controlsSynchronizer.PageLayoutControl.Object);
  99.                 command.OnClick();
  100.             }
  101.             //创建新的地图实例
  102.             IMap map = new MapClass();
  103.             map.Name = "Map";
  104.             m_controlsSynchronizer.MapControl.DocumentFilename = string.Empty;
  105.             //更新新建地图实例的共享地图文档
  106.             m_controlsSynchronizer.ReplaceMap(map);
  107.         }
  108.         /// <summary>
  109.         /// 保存地图文档命令
  110.         /// </summary>
  111.         /// <param name="sender"></param>
  112.         /// <param name="e"></param>
  113.         private void Save_Click(object sender, EventArgs e)
  114.         {
  115.             //首先确认当前地图文档是否有效
  116.             if (null != m_pageLayoutControl.DocumentFilename && m_mapControl.CheckMxFile(m_pageLayoutControl.DocumentFilename))
  117.             {
  118.                 //创建一个新的地图文档实例
  119.                 IMapDocument mapDoc = new MapDocumentClass();
  120.                 //打开当前地图文档
  121.                 mapDoc.Open(m_pageLayoutControl.DocumentFilename, string.Empty);
  122.                 //用PageLayout中的文档替换当前文档中的PageLayout部分
  123.                 mapDoc.ReplaceContents((IMxdContents)m_pageLayoutControl.PageLayout);
  124.                 //保存地图文档
  125.                 mapDoc.Save(mapDoc.UsesRelativePaths, false);
  126.                 mapDoc.Close();
  127.             }
  128.         }
  129.         /// <summary>
  130.         /// 打开地图文档Mxd命令
  131.         /// </summary>
  132.         /// <param name="sender"></param>
  133.         /// <param name="e"></param>
  134.         private void Open_Click(object sender, EventArgs e)
  135.         {
  136.             if (this.axMapControl1.LayerCount > 0)
  137.             {
  138.                 DialogResult result = MessageBox.Show("是否保存当前地图?", "警告", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
  139.                 if (result == DialogResult.Cancel) return;
  140.                 if (result == DialogResult.Yes) this.Save_Click(null, null);
  141.             }
  142.             OpenNewMapDocument openMapDoc = new OpenNewMapDocument(m_controlsSynchronizer);
  143.             openMapDoc.OnCreate(m_controlsSynchronizer.MapControl.Object);
  144.             openMapDoc.OnClick();
  145.              
  146.         }
  147.         /// <summary>
  148.         /// 添加数据命令
  149.         /// </summary>
  150.         /// <param name="sender"></param>
  151.         /// <param name="e"></param>
  152.         private void AddData_Click(object sender, EventArgs e)
  153.         {
  154.             int currentLayerCount = this.axMapControl1.LayerCount;
  155.             ICommand pCommand = new ControlsAddDataCommandClass();
  156.             pCommand.OnCreate(this.axMapControl1.Object);
  157.             pCommand.OnClick();
  158.             IMap pMap = this.axMapControl1.Map;
  159.             this.m_controlsSynchronizer.ReplaceMap(pMap);
  160.            /* if (this.axMapControl1.LayerCount > currentLayerCount)
  161.             {
  162.                 this.axMapControl2.AddLayer(this.axMapControl1.get_Layer(0));
  163.                 this.axMapControl2.Extent = this.axMapControl2.FullExtent;
  164.                 this.axMapControl2.Refresh();
  165.             }
  166.             */
  167.         }
  168.         /// <summary>
  169.         /// 另存为地图文档命令
  170.         /// </summary>
  171.         /// <param name="sender"></param>
  172.         /// <param name="e"></param>
  173.         private void SaveAs_Click(object sender, EventArgs e)
  174.         {
  175.             //如果当前视图为MapControl时,提示用户另存为操作将丢失PageLayoutControl中的设置
  176.             if (m_controlsSynchronizer.ActiveControl is IMapControl3)
  177.             {
  178.                 if (MessageBox.Show("另存为地图文档将丢失制版视图的设置rn您要继续吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
  179.                     return;
  180.             }
  181.             //调用另存为命令
  182.             ICommand command = new ControlsSaveAsDocCommandClass();
  183.             command.OnCreate(m_controlsSynchronizer.ActiveControl);
  184.             command.OnClick();
  185.         }
  186.         /// <summary>
  187.         /// 退出程序
  188.         /// </summary>
  189.         /// <param name="sender"></param>
  190.         /// <param name="e"></param>
  191.         private void Exit_Click(object sender, EventArgs e)
  192.         {
  193.             Application.Exit();
  194.         }
  195.         /// <summary>
  196.         /// 切换地图和制版视图
  197.         /// </summary>
  198.         /// <param name="sender"></param>
  199.         /// <param name="e"></param>
  200.         private void tabControl2_SelectedIndexChanged(object sender, EventArgs e)
  201.         {
  202.             if (this.tabControl2.SelectedIndex == 0)
  203.             {
  204.                 //激活MapControl
  205.                 m_controlsSynchronizer.ActivateMap();
  206.             }
  207.             else
  208.             {
  209.                 //激活PageLayoutControl
  210.                 m_controlsSynchronizer.ActivatePageLayout();
  211.             }
  212.         }
  213.         /// <summary>
  214.         /// 主地图控件鼠标移动事件
  215.         /// </summary>
  216.         /// <param name="sender"></param>
  217.         /// <param name="e"></param>
  218.         private void axMapControl1_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
  219.         {
  220.             //显示当前坐标
  221.             CoordinateLabel.Text = "当前坐标 X = " + e.mapX.ToString() + " Y = " + e.mapY.ToString() + " " + this.axMapControl1.MapUnits.ToString().Substring(4);//去除esri四个字母 // + sMapUnits;
  222.             //显示当前比例尺
  223.             ScaleLabel.Text = "比例尺 1:" + ((long)this.axMapControl1.MapScale).ToString();  
  224.            
  225.         }
  226.         /// <summary>
  227.         /// 工具栏鼠标移动事件
  228.         /// </summary>
  229.         /// <param name="sender"></param>
  230.         /// <param name="e"></param>
  231.         private void axToolbarControl1_OnMouseMove(object sender, IToolbarControlEvents_OnMouseMoveEvent e)
  232.         {
  233.             //取得鼠标所在工具的索引号
  234.             int index = axToolbarControl1.HitTest(e.x, e.y, false);
  235.             if (index != -1)
  236.             {
  237.                 //取得鼠标所在工具的ToolbarItem
  238.                 IToolbarItem toolbarItem = axToolbarControl1.GetItem(index);
  239.                 //设置状态栏信息
  240.                 MessageLabel.Text = toolbarItem.Command.Message;
  241.             }
  242.             else
  243.             {
  244.                 MessageLabel.Text = "就绪";
  245.             }
  246.         }
  247.         /// <summary>
  248.         /// 主地图控件地图加载时的事件
  249.         /// </summary>
  250.         /// <param name="sender"></param>
  251.         /// <param name="e"></param>
  252.         private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e)
  253.         {
  254.            /* esriUnits mapUnits = axMapControl1.MapUnits;
  255.             switch (mapUnits)
  256.             {
  257.                 case esriUnits.esriCentimeters:
  258.                     sMapUnits = "Centimeters";
  259.                     break;
  260.                 case esriUnits.esriDecimalDegrees:
  261.                     sMapUnits = "Decimal Degrees";
  262.                     break;
  263.                 case esriUnits.esriDecimeters:
  264.                     sMapUnits = "Decimeters";
  265.                     break;
  266.                 case esriUnits.esriFeet:
  267.                     sMapUnits = "Feet";
  268.                     break;
  269.                 case esriUnits.esriInches:
  270.                     sMapUnits = "Inches";
  271.                     break;
  272.                 case esriUnits.esriKilometers:
  273.                     sMapUnits = "Kilometers";
  274.                     break;
  275.                 case esriUnits.esriMeters:
  276.                     sMapUnits = "Meters";
  277.                     break;
  278.                 case esriUnits.esriMiles:
  279.                     sMapUnits = "Miles";
  280.                     break;
  281.                 case esriUnits.esriMillimeters:
  282.                     sMapUnits = "Millimeters";
  283.                     break;
  284.                 case esriUnits.esriNauticalMiles:
  285.                     sMapUnits = "NauticalMiles";
  286.                     break;
  287.                 case esriUnits.esriPoints:
  288.                     sMapUnits = "Points";
  289.                     break;
  290.                 case esriUnits.esriUnknownUnits:
  291.                     sMapUnits = "Unknown";
  292.                     break;
  293.                 case esriUnits.esriYards:
  294.                     sMapUnits = "Yards";
  295.                     break;
  296.             }
  297.             */
  298.             //当主地图显示控件的地图更换时,鹰眼中的地图也跟随更换
  299.             this.axMapControl2.Map = new MapClass();
  300.             //添加主地图控件中的所有图层到鹰眼控件中
  301.             for (int i = 1; i <= this.axMapControl1.LayerCount; i++)
  302.             {
  303.                 this.axMapControl2.AddLayer(this.axMapControl1.get_Layer(this.axMapControl1.LayerCount - i));
  304.             }
  305.             //设置MapControl显示范围至数据的全局范围
  306.             this.axMapControl2.Extent = this.axMapControl1.FullExtent;
  307.             //刷新鹰眼控件地图
  308.             this.axMapControl2.Refresh();
  309.             
  310.         }
  311.         /// <summary>
  312.         /// 鹰眼控件鼠标按下事件
  313.         /// </summary>
  314.         /// <param name="sender"></param>
  315.         /// <param name="e"></param>
  316.         private void axMapControl2_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
  317.         {
  318.             if (this.axMapControl2.Map.LayerCount != 0)
  319.             {
  320.                 if (e.button == 1)
  321.                 {
  322.                     IPoint pPoint = new PointClass();
  323.                     pPoint.PutCoords(e.mapX, e.mapY);
  324.                     IEnvelope pEnvelope = this.axMapControl1.Extent;
  325.                     pEnvelope.CenterAt(pPoint);
  326.                     this.axMapControl1.Extent = pEnvelope;
  327.                     this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
  328.                 }
  329.                 else if (e.button == 2)
  330.                 {
  331.                     IEnvelope pEnvelop = this.axMapControl2.TrackRectangle();
  332.                     this.axMapControl1.Extent = pEnvelop;
  333.                     this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
  334.                 }
  335.             }
  336.         }
  337.         /// <summary>
  338.         /// 鹰眼控件鼠标移动事件
  339.         /// </summary>
  340.         /// <param name="sender"></param>
  341.         /// <param name="e"></param>
  342.         private void axMapControl2_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
  343.         {
  344.             if (e.button != 1) return;
  345.             IPoint pPoint = new PointClass();
  346.             pPoint.PutCoords(e.mapX, e.mapY);
  347.             this.axMapControl1.CenterAt(pPoint);
  348.             this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
  349.         }
  350.         /// <summary>
  351.         /// 主地图控件显示范围更新事件
  352.         /// </summary>
  353.         /// <param name="sender"></param>
  354.         /// <param name="e"></param>
  355.         private void axMapControl1_OnExtentUpdated(object sender, IMapControlEvents2_OnExtentUpdatedEvent e)
  356.         {
  357.             // 得到新范围
  358.             IEnvelope pEnv = (IEnvelope)e.newEnvelope;
  359.             IGraphicsContainer pGra = axMapControl2.Map as IGraphicsContainer;
  360.             IActiveView pAv = pGra as IActiveView;
  361.             //在绘制前,清除axMapControl2中的任何图形元素
  362.             pGra.DeleteAllElements();
  363.             IRectangleElement pRectangleEle = new RectangleElementClass();
  364.             IElement pEle = pRectangleEle as IElement;
  365.             pEle.Geometry = pEnv;
  366.             //设置鹰眼图中的红线框
  367.             IRgbColor pColor = new RgbColorClass();
  368.             pColor.Red = 255;
  369.             pColor.Green = 0;
  370.             pColor.Blue = 0;
  371.             pColor.Transparency = 255;
  372.             //产生一个线符号对象
  373.             ILineSymbol pOutline = new SimpleLineSymbolClass();
  374.             pOutline.Width = 2;
  375.             pOutline.Color = pColor;
  376.             //设置颜色属性
  377.             pColor = new RgbColorClass();
  378.             pColor.Red = 255;
  379.             pColor.Green = 0;
  380.             pColor.Blue = 0;
  381.             pColor.Transparency = 0;
  382.             //设置填充符号的属性
  383.             IFillSymbol pFillSymbol = new SimpleFillSymbolClass();
  384.             pFillSymbol.Color = pColor;
  385.             pFillSymbol.Outline = pOutline;
  386.             IFillShapeElement pFillShapeEle = pEle as IFillShapeElement;
  387.             pFillShapeEle.Symbol = pFillSymbol;
  388.             pGra.AddElement((IElement)pFillShapeEle, 0);
  389.             //刷新
  390.             pAv.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
  391.         }
  392.         private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
  393.         {
  394.         }
  395.         private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e)
  396.         {
  397.  
  398.        //如果不是右键按下直接返回 
  399.        if (e.button != 2) return; 
  400.  
  401.        esriTOCControlItem item = esriTOCControlItem.esriTOCControlItemNone; 
  402.        IBasicMap map = null;  
  403.        ILayer layer = null; 
  404.        object other = null;  
  405.        object index = null; 
  406.  
  407.        //判断所选菜单的类型 
  408.               m_tocControl.HitTest(e.x, e.y, ref item, ref map, ref layer, ref other, ref index); 
  409.  
  410.        //确定选定的菜单类型,Map或是图层菜单 
  411.        if (item == esriTOCControlItem.esriTOCControlItemMap) 
  412.               m_tocControl.SelectItem(map, null); 
  413.        else 
  414.               m_tocControl.SelectItem(layer, null); 
  415.  
  416.        //设置CustomProperty 为layer (用于自定义的Layer命令)                    
  417.        m_mapControl.CustomProperty = layer; 
  418.  
  419.        //弹出右键菜单 
  420.        if (item == esriTOCControlItem.esriTOCControlItemMap)  
  421.               m_menuMap.PopupMenu(e.x, e.y, m_tocControl.hWnd); 
  422.        if (item == esriTOCControlItem.esriTOCControlItemLayer)  
  423.               m_menuLayer.PopupMenu(e.x, e.y, m_tocControl.hWnd); 
  424.         }
  425. /// <summary>   
  426. /// 双击TOCControl控件时触发的事件 
  427. /// </summary> 
  428. /// <param name="sender"></param> 
  429. /// <param name="e"></param> 
  430.  
  431. private void axTOCControl1_OnDoubleClick(object sender, ITOCControlEvents_OnDoubleClickEvent e) 
  432.     esriTOCControlItem itemType = esriTOCControlItem.esriTOCControlItemNone; 
  433.     IBasicMap basicMap = null; 
  434.     ILayer layer = null; 
  435.     object unk = null; 
  436.     object data = null;  
  437.  
  438.     axTOCControl1.HitTest(e.x, e.y, ref itemType, ref basicMap, ref layer, ref unk, ref data);   
  439.     if (e.button == 1) 
  440.             { 
  441.         if(itemType==esriTOCControlItem.esriTOCControlItemLegendClass) 
  442.         {              
  443.                 //取得图例 
  444.                 ILegendClass pLegendClass = ((ILegendGroup)unk).get_Class((int)data); 
  445.                 //创建符号选择器SymbolSelector实例 
  446.                 SymbolSelectorFrm SymbolSelectorFrm = new SymbolSelectorFrm(pLegendClass, layer); 
  447.                 if (SymbolSelectorFrm.ShowDialog() == DialogResult.OK) 
  448.                 { 
  449.                     //局部更新主Map控件 
  450.                     m_mapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); 
  451.                     //设置新的符号 
  452.                     pLegendClass.Symbol = SymbolSelectorFrm.pSymbol; 
  453.                     //更新主Map控件和图层控件 
  454.                     this.axMapControl1.ActiveView.Refresh(); 
  455.  
  456.                     this.axTOCControl1.Refresh(); 
  457.                 } 
  458.         } 
  459. }
  460.     
  461.     }
  462. }
  463. }