C# + MapX 鹰眼功能的实现

刚刚接触GIS方面的东西,学习的是mapx的东西,经理叫写一下鹰眼,算是检查学习的情况,网上看来看去,用C#+Mapx开发的好像真的不多,只能找到VB的代码,然后看完再写,大的思路没有问题,可是小地方的问题真的很多啊,把自己的代码贴一下,思路是别人,不好意思,还有一些其他的小功能,还希望各位高手们能指点一二。

首先要加几个类属性:


        private double m_distance = 0.0;  
        private double m_totalDis = 0.0;
        private bool m_toolBarFlag = true;
        MapXLib.Layer m_lyrEngle;
        MapXLib.Feature m_feaEagle;
        bool m_bLeftButtonControl = false;

 

代码如下:思路应该很容易看清了。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using MapXLib;
  10. namespace firstMapX
  11. {
  12.     public partial class Form1 : Form
  13.     {
  14.         public Form1()
  15.         {
  16.             InitializeComponent();
  17.         }
  18.         // ToolStrip上各个button的鼠标响应事件
  19.         private void toolStripBtnZoomIn_Click(object sender, EventArgs e)
  20.         {
  21.             axMapControl.CurrentTool = MapXLib.ToolConstants.miZoomInTool;
  22.         }
  23.         private void toolStripBtnZoomOut_Click(object sender, EventArgs e)
  24.         {
  25.             axMapControl.CurrentTool = MapXLib.ToolConstants.miZoomOutTool;
  26.         }
  27.         private void toolStripBtnPan_Click(object sender, EventArgs e)
  28.         {
  29.             axMapControl.CurrentTool = MapXLib.ToolConstants.miPanTool;
  30.         }
  31.         private void toolStripBtnDistance_Click(object sender, EventArgs e)
  32.         {
  33.             axMapControl.CreateCustomTool(100, MapXLib.ToolTypeConstants.miToolTypePoly,
  34.                 MapXLib.CursorConstants.miCrossCursor, nullnullnull);
  35.             axMapControl.CurrentTool = (MapXLib.ToolConstants)100;
  36.         }
  37.         private void toolStripBtnCenter_Click(object sender, EventArgs e)
  38.         {
  39.             axMapControl.CurrentTool = MapXLib.ToolConstants.miCenterTool;
  40.         }
  41.         // 测距的方法
  42.         private void axMapControl_PolyToolUsed(object sender, AxMapXLib.CMapXEvents_PolyToolUsedEvent e)
  43.         {
  44.             MapXLib.Points pts = new MapXLib.PointsClass();
  45.             switch (e.flags)
  46.             {
  47.                 case (int) MapXLib.ToolFlagConstants.miToolInProgress :
  48.                     pts = (MapXLib.Points)e.points;
  49.                     m_distance = axMapControl.Distance(pts._Item(pts.Count - 1).X,
  50.                         pts._Item(pts.Count - 1).Y,
  51.                         pts._Item(pts.Count).X,
  52.                         pts._Item(pts.Count).Y);
  53.                     m_totalDis += m_distance;
  54.                     break;
  55.                 default:
  56.                     m_distance = 0;
  57.                     m_totalDis = 0;
  58.                     break;
  59.             }
  60.             labelDis.Text = "Distance:"
  61.                 + m_distance.ToString("#.00 kilometer");
  62.             labelTotalDis.Text = "TotalDistance:"
  63.                 + m_totalDis.ToString("#.00kilometer");
  64.         }
  65.         // open GeoSet file
  66.         private void openGSTToolStripMenuItem_Click(object sender, EventArgs e)
  67.         {
  68.             openFileDialog1.InitialDirectory = "C://Program Files//MapInfo//MapX 5.0//Maps";
  69.             openFileDialog1.Filter = "gst files (*.gst)|*.gst|All files (*.*)|*.*";
  70.             openFileDialog1.FilterIndex = 0;
  71.             openFileDialog1.RestoreDirectory = true;
  72.             if (openFileDialog1.ShowDialog() == DialogResult.OK)
  73.                 if ((openFileDialog1.OpenFile()) != null)
  74.                 {
  75.                     axMapControl.GeoSet = openFileDialog1.FileName;
  76.                     axMapEagle.GeoSet = openFileDialog1.FileName;
  77.                     axMapControl.Title.Visible = false;
  78.                     axMapEagle.Title.Visible = false;
  79.                     axMapEagle.Zoom = 150;
  80.                 }
  81.             axMapEagle_CreateTempLayer();
  82.         }
  83.         // close GeoSet file
  84.         private void closeGSTToolStripMenuItem_Click(object sender, EventArgs e)
  85.         {
  86.             axMapControl.Layers.RemoveAll();
  87.             axMapEagle.Layers.RemoveAll();
  88.         }
  89.         // exit
  90.         private void exitToolStripMenuItem_Click(object sender, EventArgs e)
  91.         {
  92.             Dispose();
  93.         }
  94.         // Zoom In
  95.         private void zoomInToolStripMenuItem_Click(object sender, EventArgs e)
  96.         {
  97.             axMapControl.CurrentTool = MapXLib.ToolConstants.miZoomInTool;
  98.         }
  99.         // Zoom Out
  100.         private void zoomOutToolStripMenuItem_Click(object sender, EventArgs e)
  101.         {
  102.             axMapControl.CurrentTool = MapXLib.ToolConstants.miZoomOutTool;
  103.         }
  104.         // Pan
  105.         private void panToolStripMenuItem_Click(object sender, EventArgs e)
  106.         {
  107.             axMapControl.CurrentTool = MapXLib.ToolConstants.miPanTool;
  108.         }
  109.         // Center
  110.         private void centerToolStripMenuItem_Click(object sender, EventArgs e)
  111.         {
  112.             axMapControl.CurrentTool = MapXLib.ToolConstants.miCenterTool;
  113.         }
  114.         // toolBar View
  115.         private void toolBarToolStripMenuItem_Click(object sender, EventArgs e)
  116.         {
  117.             if (m_toolBarFlag)
  118.             {
  119.                 toolStrip1.Visible = false;
  120.                 m_toolBarFlag = false;
  121.                 toolBarToolStripMenuItem.Checked = false;
  122.             } 
  123.             else
  124.             {
  125.                 toolStrip1.Visible = true;
  126.                 m_toolBarFlag = true;
  127.                 toolBarToolStripMenuItem.Checked = true;
  128.             }
  129.         }
  130.         // Layer Control
  131.         private void layerControlToolStripMenuItem_Click(object sender, EventArgs e)
  132.         {
  133.             axMapControl.Layers.LayersDlg("""");
  134.         }
  135.         // Create the temp layer on eagle map
  136.         private void axMapEagle_CreateTempLayer()
  137.         {
  138.             try
  139.             {
  140.                 MapXLib.LayerInfo tempLayerInfo = new MapXLib.LayerInfoClass();
  141.                 MapXLib.Fields flds = new MapXLib.FieldsClass();
  142.                 flds.AddStringField("Name", 100, false);
  143.                 flds.AddStringField("Id", 20, false);
  144.                 tempLayerInfo.Type = MapXLib.LayerInfoTypeConstants.miLayerInfoTypeTemp;
  145.                 tempLayerInfo.AddParameter("Name""Eagle");
  146.                 tempLayerInfo.AddParameter("Fields", flds);
  147.                 m_lyrEngle = axMapEagle.Layers.Add(tempLayerInfo, 1);
  148.                 //axMapEagle.Layers.LayersDlg("", "");
  149.                 m_lyrEngle = null;
  150.             }
  151.             catch (System.Exception e)
  152.             {
  153.                 MessageBox.Show(e.ToString());
  154.             }
  155.         }
  156.         
  157.         // Handle Eagle Map MouseMove Event
  158.         private void axMapEagle_MouseMoveEvent(object sender, AxMapXLib.CMapXEvents_MouseMoveEvent e)
  159.         {
  160.             double dbMapX = 0.0;
  161.             double dbMapY = 0.0;
  162.             Single sngScreenX = 0;
  163.             Single sngScreenY = 0;
  164.             if (m_bLeftButtonControl)
  165.             {
  166.                 sngScreenX = e.x;
  167.                 sngScreenY = e.y;
  168.                 axMapEagle.ConvertCoord(ref sngScreenX, ref sngScreenY,
  169.                     ref dbMapX, ref dbMapY, MapXLib.ConversionConstants.miScreenToMap);
  170.                 axMapControl.CenterX = dbMapX;
  171.                 axMapControl.CenterY = dbMapY;
  172.             }
  173.         }
  174.         // Handle Eagle Map MouseUp Event
  175.         private void axMapEagle_MouseUpEvent(object sender, AxMapXLib.CMapXEvents_MouseUpEvent e)
  176.         {
  177.             m_bLeftButtonControl = false;
  178.         }
  179.         // Handle Eagle Map MouseDown Event
  180.         private void axMapEagle_MouseDownEvent(object sender, AxMapXLib.CMapXEvents_MouseDownEvent e)
  181.         {
  182.             double dbMapX = 0.0;
  183.             double dbMapY = 0.0;
  184.             Single sngScreenX = 0;
  185.             Single sngScreenY = 0;
  186.             m_bLeftButtonControl = true;
  187.             sngScreenX = e.x;
  188.             sngScreenY = e.y;
  189.             axMapEagle.ConvertCoord(ref sngScreenX, ref sngScreenY, 
  190.                 ref dbMapX, ref dbMapY, MapXLib.ConversionConstants.miScreenToMap);
  191.             axMapControl.CenterX = dbMapX;
  192.             axMapControl.CenterY = dbMapY;
  193.         }
  194.         // Handle the Control Map's MapViewChanged Event
  195.         private void axMapControl_MapViewChanged(object sender, EventArgs e)
  196.         {
  197.             MapXLib.Feature tempFea = new MapXLib.FeatureClass();
  198.             MapXLib.Style tempStyle = new MapXLib.StyleClass();
  199.             MapXLib.Points tempPoints = new MapXLib.PointsClass();
  200.             MapXLib.Point ptRectMap1 = new MapXLib.PointClass();
  201.             MapXLib.Point ptRectMap2 = new MapXLib.PointClass();
  202.             MapXLib.Point ptRectMap3 = new MapXLib.PointClass();
  203.             MapXLib.Point ptRectMap4 = new MapXLib.PointClass();
  204.             // 设置矩形框的四角
  205.             ptRectMap1.Set(axMapControl.CtlBounds.XMin, axMapControl.CtlBounds.YMin);
  206.             ptRectMap2.Set(axMapControl.CtlBounds.XMax, axMapControl.CtlBounds.YMin);
  207.             ptRectMap3.Set(axMapControl.CtlBounds.XMax, axMapControl.CtlBounds.YMax);
  208.             ptRectMap4.Set(axMapControl.CtlBounds.XMin, axMapControl.CtlBounds.YMax);
  209.             tempPoints.Add(ptRectMap1, 1);
  210.             tempPoints.Add(ptRectMap2, 2);
  211.             tempPoints.Add(ptRectMap3, 3);
  212.             tempPoints.Add(ptRectMap4, 4);
  213.             try
  214.             {
  215.                 // 矩形边框不存在时
  216.                 if (axMapEagle.Layers._Item(1).AllFeatures.Count == 0)
  217.                 {
  218.                     // 设置边框样式
  219.                     tempStyle.RegionPattern = MapXLib.FillPatternConstants.miPatternNoFill;
  220.                     tempStyle.RegionBorderColor = (uint)MapXLib.ColorConstants.miColorBlue;
  221.                     tempStyle.RegionBorderWidth = 2;
  222.                     // 在临时图层添加大小为axMapxControl的边界的Rectangle对象
  223.                     try
  224.                     {
  225.                         tempFea = axMapEagle.FeatureFactory.CreateRegion(tempPoints, tempStyle);
  226.                         m_feaEagle = axMapEagle.Layers._Item("Eagle").AddFeature(tempFea, new MapXLib.RowValuesClass());
  227.                         tempStyle = null;
  228.                     }
  229.                     catch (System.Exception ex)
  230.                     {
  231.                         MessageBox.Show(ex.ToString());
  232.                     }
  233.                 }
  234.                 // 矩形框存在,根据axMapXControl的视野变化改变矩形边框的大小和位置
  235.                 else
  236.                 {
  237.                     try
  238.                     {
  239.                         m_feaEagle.Parts._Item(1).RemoveAll();
  240.                         m_feaEagle.Parts._Item(1).AddXY(axMapControl.CtlBounds.XMin, axMapControl.CtlBounds.YMin, 1);
  241.                         m_feaEagle.Parts._Item(1).AddXY(axMapControl.CtlBounds.XMax, axMapControl.CtlBounds.YMin, 2);
  242.                         m_feaEagle.Parts._Item(1).AddXY(axMapControl.CtlBounds.XMax, axMapControl.CtlBounds.YMax, 3);
  243.                         m_feaEagle.Parts._Item(1).AddXY(axMapControl.CtlBounds.XMin, axMapControl.CtlBounds.YMax, 4);
  244.                         m_feaEagle.Update(m_feaEagle, new MapXLib.RowValuesClass());
  245.                     }
  246.                     catch (System.Exception ex)
  247.                     {
  248.                         MessageBox.Show(ex.ToString());
  249.                     }
  250.                 }
  251.             }
  252.             catch (System.Exception exx)
  253.             {
  254.                 MessageBox.Show(exx.ToString());
  255.             }
  256.         }
  257.     }
  258. }   
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值