天天看點

C#進行MapX二次開發之控件基本操作

上篇介紹了MapX的部分基本使用代碼,包括放大、縮小、縮放到初始大小(全圖)、平移、矩形選擇、圓形選擇、箭頭、打開圖層對話框 、打開ActiveX屬性對話框 、添加符号等基本操作代碼,本篇繼續探讨一些控件的基本操作。

MapX提供的标準工具,不同的工具将會使滑鼠能夠完成多種任務。例如,如果目前的工具設成 miLabelTool,那麼當單擊滑鼠時,會在此特指的地圖對象上放置标簽。滑鼠光标将根據正使用的工具更改形狀。MapX 可用的标準工具清單如下所示:

 工具

常量

描述

 Add Line

MiAddLineTool

向插入圖層添加線圖元

 Add Point

MiAddPointTool

單擊進而向插入圖層添加點圖元。

 Add Polyline

MiAddPolyLineTool

添加折線圖元到插入圖層。

 Add Region

MiAddRegionTool

添加區域圖元到插入圖層。

 Arrow

MiArrowTool

單擊标題或注釋。并且,它也可用在可編輯的圖層中移動選中的圖元或者改變其大小。

 Center

MiCenterTool

單擊滑鼠使地圖居中顯示。

 Label

miLabelTool

單擊圖元進行标注。

 Pan

MiPanTool

拖動地圖并重定位地圖的中心。

 Polygon Select

MiPolygonSelectTool

單擊滑鼠畫多邊形;在多邊形内的對象被選中。

 Radius Select

MiRadiusSelectTool

拖動滑鼠并選中在拖動半徑内的圖元。

 Rect Select

MiRectSelectTool

拖動滑鼠選中在矩形内的圖元。

 Select Tool

miSelectTool

單擊選擇圖元。

 Symbol

miSymbolTool

放置符号注釋。

 Text

miTextTool

放置文本注釋。

 Zoom In

miZoomInTool

放大。

 Zoom Out

miZoomOutTool

縮小。

導出地圖為圖檔的操作代碼:

            if (axMap1.GeoSet.Length < 1)

            {

                MessageBox.Show("未加載地圖,不能導出!");

                return;

            }

            SaveFileDialog exportFD = new SaveFileDialog();

            exportFD.Title = "導出目前地圖";

            exportFD.Filter = "windows bitmap(*.bmp)|*.bmp|GIF (*.GIF)|*.gif|JPEG (*.JPG;JPEG;JPE)|*.JPG|PNG (*.PNG)|*.PNG|PSD (*.PSD)|*.PSD|TIFF (*.TIF)|*.TIF";

            if (exportFD.ShowDialog() == DialogResult.OK && (exportFD.FileName) != null)

                try

                {

                    axMap1.ExportSelection = true;

                    switch (exportFD.FilterIndex)

                    {

                        case 1:

                            axMap1.ExportMap(exportFD.FileName, MapXLib.ExportFormatConstants.miFormatBMP, axMap1.MapPaperWidth, axMap1.MapPaperHeight);

                            break;

                        case 2:

                            axMap1.ExportMap(exportFD.FileName, MapXLib.ExportFormatConstants.miFormatGIF, axMap1.MapPaperWidth, axMap1.MapPaperHeight);

                        case 3:

                            axMap1.ExportMap(exportFD.FileName, MapXLib.ExportFormatConstants.miFormatJPEG, axMap1.MapPaperWidth, axMap1.MapPaperHeight);

                        case 4:

                            axMap1.ExportMap(exportFD.FileName, MapXLib.ExportFormatConstants.miFormatPNG, axMap1.MapPaperWidth, axMap1.MapPaperHeight);

                        case 5:

                            axMap1.ExportMap(exportFD.FileName, MapXLib.ExportFormatConstants.miFormatPSD, axMap1.MapPaperWidth, axMap1.MapPaperHeight);

                        case 6:

                            axMap1.ExportMap(exportFD.FileName, MapXLib.ExportFormatConstants.miFormatTIF, axMap1.MapPaperWidth, axMap1.MapPaperHeight);

                        case 7:

                            axMap1.ExportMap(exportFD.FileName, MapXLib.ExportFormatConstants.miFormatWMF, axMap1.MapPaperWidth, axMap1.MapPaperHeight);

                    }

                }

                catch (Exception ex)

                    MessageBox.Show(ex.Message);

添加圖層的操作代碼 

            OpenFileDialog openFile = new OpenFileDialog();

            if (openFile.ShowDialog() == DialogResult.OK)

                axMap1.Layers.Add(openFile.FileName, 0);//預設值為0,C#調用不能省略預設值,圖層的位置

                MapXLib.LayerInfo liinfo;

                liinfo = new MapXLib.LayerInfoClass();

                liinfo.Type = MapXLib.LayerInfoTypeConstants.miLayerInfoTypeTab;

                liinfo.AddParameter("AutoCreateDataset", true);

查找圖元資訊:

            MapXLib.Features mX;

            mX = this.axMap1.Layers[1].AllFeatures;

            this.listView1.Items.Clear();

            foreach (MapXLib.Feature mY in mX)

                ListViewItem mZ = new ListViewItem(mY._FeatureID.ToString());

                mZ.SubItems.Add(mY.Name.ToString());

                this.listView1.Items.Add(mZ);

查找圖層資訊 

            MapXLib.Layers mX;

            mX = this.axMap1.Layers;

            foreach (MapXLib.Layer mY in mX)

                ListViewItem mZ = new ListViewItem(mY._Name);

擷取滑鼠移動的坐标

            double x = 0;

            double y = 0;

            axMap1.ConvertCoord(ref e.x, ref  e.y, ref x, ref y, MapXLib.ConversionConstants.miScreenToMap);

            toolStripStatusLabel1.Text = string.Format("X:{0} Y:{1}", x, y);

 放置點工具操作

            try

                MapXLib.Layer mX;

                mX = this.axMap1.Layers[1];

                mX.Editable = true;

                this.axMap1.Layers.InsertionLayer = mX;

                this.axMap1.CurrentTool = MapXLib.ToolConstants.miAddPointTool;

            catch (Exception ex)

                MessageBox.Show(ex.Message);

MapX自定義工具的使用:

如果需要一種 MapX 沒有提供的工具欄按鈕,可以使用 Map.CreateCustomTool 方法來建立自定義工具。建立自定義工具時,需要控制建立工具的“類型”,即:就是要選擇此工具是否允許使用者單擊,或是單擊并拖動來畫線,或是單擊并拖動來畫矩形等等。也可以選擇使用自定義工具時顯示的光标。 

下面是自定義測量距離和測量面積的操作代碼 

        private void Form1_Load(object sender, EventArgs e)

        {

            //記錄地圖的比例合中心點

            this.MapZoom = axMap1.Zoom;

            this.CenterX = axMap1.CenterX;

            this.CenterY = axMap1.CenterY;

            //建立測量距離的

            axMap1.CreateCustomTool(99, MapXLib.ToolTypeConstants.miToolTypePoly, MapXLib.CursorConstants.miCrossCursor,

                MapXLib.CursorConstants.miCrossCursor, MapXLib.CursorConstants.miCrossCursor, false);

            //建立測量面積的工具

            axMap1.CreateCustomTool(98, MapXLib.ToolTypeConstants.miToolTypePolygon, MapXLib.CursorConstants.miCrossCursor,

        }

        private void axMap1_PolyToolUsed(object sender, AxMapXLib.CMapXEvents_PolyToolUsedEvent e)

            if (e.toolNum == 99)//測量距離

                MapXLib.Points pts = (MapXLib.Points)e.points;

                MapXLib.Point pt1, pt2;

                double d = 0.0;

                //計算順序兩個點距離,累計得到總距離

                for (int i = 1; i < pts.Count; i++)

                    pt1 = pts[i];

                    pt2 = pts[i + 1];

                    d += axMap1.Distance(pt1.X, pt1.Y, pt2.X, pt2.Y);

                this.Text = "距離:" + d.ToString();

            else if (e.toolNum == 98)//面積

                //偷懶了但是很正确

                MapXLib.FeatureFactory dd = axMap1.FeatureFactory;

                MapXLib.Style style = axMap1.DefaultStyle;

                this.Text = "面積:" + dd.CreateRegion(pts, style).Area.ToString();

        private void btnGetDistance_Click(object sender, EventArgs e)

            //測量距離

            axMap1.CurrentTool = (MapXLib.ToolConstants)99;

        private void btnGetArea_Click(object sender, EventArgs e)

            //測量面積

            axMap1.CurrentTool = (MapXLib.ToolConstants)98;

以上代碼有一個是事件操作,如果沒有采用事件映射的操作,那麼要添加下面的代碼:

 this.axMap1.PolyToolUsed += new AxMapXLib.CMapXEvents_PolyToolUsedEventHandler(this.axMap1_PolyToolUsed);

自定義工具類型的ToolTypeConstants 描述當建立一個自定義工具時可使用的工具類型。它們描述工具的行為(例如,miToolTypeLine 使使用者可以畫線;miToolTypeCircle 使使用者可以畫圓等)。自定義工具建立以後,需要為該工具實際要做的編寫代碼。

 常量

行為

 miToolTypePoint

在指定位置顯示點。

 miToolTypeLine

畫線。

 miToolTypeCircle

畫圓。

 miToolTypeMarquee

畫選取框,并選在此框中選擇地圖對象。

 miToolTypePoly

畫折線。

 miToolTypePolygon

畫多邊形。