1. 程式人生 > >ArcGIS Engine 基礎功能(一)

ArcGIS Engine 基礎功能(一)

這裡放的程式碼都是目前感覺比較簡潔的,可能會有缺陷,但是還是效率優先吧,以後有問題再補充。

1. 開啟地圖文件(簡便、建議)

			//using ESRI.ArcGIS.Controls; 引用
            ICommand command = new ControlsOpenDocCommandClass();    
            command.OnCreate(mainMapControl.Object);
            command.OnClick();
            mainTOCControl.SetBuddyControl(mainMapControl);  // 手動繫結夥伴控制元件

1.2 開啟地圖文件(不建議)

// using ESRI.ArcGIS.Carto;
            OpenFileDialog open = new OpenFileDialog();
            //設定引數
            //檢查檔案是否存在
            open.CheckFileExists = true;
            open.Title = "開啟地圖文件";
            // 不允許多個檔案同時開啟
            open.Multiselect = false;
            // 儲存時開啟的檔案路徑
            open.RestoreDirectory = true;
            //開啟檔案格式
            open.Filter = @"地圖文件(*.mxd)|*.mxd;|ArcMap模板(*.mxt)|*.mxt;|所有地圖格式(*.mxd;*.mxt;*.pmf)|*.mxd;*.mxt;*.pmf";//檔案過濾條件
            open.Multiselect = false;//禁止多選
            open.RestoreDirectory = true;
            //開啟視窗
            open.ShowDialog();
            // 儲存開啟的檔案路徑
            string fileName = open.FileName;
            if (mainMapControl.CheckMxFile(fileName))
            {
                //將資料載入pMapDocument並與Map控制元件關聯
                IMapDocument pMapDocument = new MapDocument();   // using ESRI.ArcGIS.Carto;
                pMapDocument.Open(fileName, "");
                //獲取Map地圖中啟用的地圖文件
                mainMapControl.Map = pMapDocument.ActiveView.FocusMap;
                mainMapControl.ActiveView.Refresh();
            }

2. 開啟資料(資料庫,shp, 柵格等多種資料型別)

// 載入很多種資料
ICommand command = new ControlsAddDataCommandClass();
command.OnCreate(mainMapControl.Object);
command.OnClick();
mainMapControl.ActiveView.Refresh();

2.2 新增shp資料(為了效率不建議)

// using ESRI.ArcGIS.Geodatabase;
// using ESRI.ArcGIS.DataSourcesFile;
// using ESRI.ArcGIS.DataSourcesRaster;

 private void 新增ShapefileToolStripMenuItem_Click(object sender, EventArgs e)
        {

            try
            {
                //同樣例項化一個開啟檔案的類物件
                OpenFileDialog open = new OpenFileDialog();
                // 如果開啟正確
                if (open.ShowDialog() == DialogResult.OK)
                {
                    //首先定義一個空的路徑
                    string filePath = string.Empty;
                    // 然後定義一個空的檔名
                    string file = string.Empty;
                    // 獲取完整的檔案路徑
                    string filedir = open.FileName;
                    //如果路徑為空,嘛都不返回
                    if (fileDir == "") return;
                    // 對完整路徑進行擷取  獲取最後一個斜槓的索引
                    int pos = filedir.LastIndexOf('\\');
                    // 擷取字串  路徑
                    filePath =filedir.Substring(0, pos);
                    //檔名
                    file = filedir.Substring(pos+1);
                    // 需要兩個引數
                    axMapControl1.AddShapeFile(filePath, file);
                    //重新整理
                    axMapControl1.ActiveView.Refresh();
                }
            }
            catch (Exception)
            {
                MessageBox.Show("請開啟正確的文件!", "提醒",MessageBoxButtons.OK, MessageBoxIcon.Error );
            }
        }

3. 地圖瀏覽
3…1 全圖

    private void FullExtentTSButton_Click(object sender, EventArgs e)
        {
            mainMapControl.Extent = mainMapControl.FullExtent;
    
        }

3.2 等比例放大

        private void btnZoomInStep_Click(object sender, EventArgs e)
        {
            IEnvelope  pEnvelope = mainMapControl.Extent;
            pEnvelope.Expand(0.5, 0.5, true);   //放大2倍
            mainMapControl.Extent = pEnvelope;
            mainMapControl.ActiveView.Refresh();

        }

3.3 等比例縮小(與放大的區別在於多億過中心點的設定)

        private void btnZoomIOutStep_Click(object sender, EventArgs e)
        {
            IActiveView pActiveView = mainMapControl.ActiveView;
            IPoint centerPoint = new PointClass();
            centerPoint.PutCoords((pActiveView.Extent.XMin + pActiveView.Extent.XMax) / 2, (pActiveView.Extent.YMax + pActiveView.Extent.YMin) / 2);
            IEnvelope envlop = pActiveView.Extent;
            envlop.Expand(1.5, 1.5, true);    //與放大的區別在於Expand的引數不同
            pActiveView.Extent.CenterAt(centerPoint);
            pActiveView.Extent = envlop;
            pActiveView.Refresh();
        }   

3.4 上一檢視

// 定義全域性變數
        IExtentStack pExtentStack;
        private void PreViewTSButton_Click(object sender, EventArgs e)
        {
            pExtentStack = mainMapControl.ActiveView.ExtentStack;
            //判斷是否可以回到前一檢視,第一個檢視沒有前檢視
            if (pExtentStack.CanUndo())
            {
                pExtentStack.Undo();      //撤銷到上一檢視範圍
                NextViewTSButton.Enabled = true;   //後一檢視可以使用
                if (!pExtentStack.CanUndo())
                {
                    PreViewTSButton.Enabled = false;  //前一檢視不能使用
                }
            }
            mainMapControl.ActiveView.Refresh();

        }

3.5 下一檢視

        private void NextViewTSButton_Click(object sender, EventArgs e)
        {
            pExtentStack = mainMapControl.ActiveView.ExtentStack;
            //判斷是否可以回到後一檢視,最後一個檢視沒有後一檢視
            if (pExtentStack.CanRedo())  //如果可以重做下一檢視
            {
                pExtentStack.Redo();   //重做到下一檢視
                PreViewTSButton.Enabled = true;   //上一檢視按鈕可以使用

                if (!pExtentStack.CanRedo())  //如果不可以重做下一檢視
                {
                    NextViewTSButton.Enabled = false;   //下一檢視不能用
                }
            }
            mainMapControl.ActiveView.Refresh();
        }

下面著幾個功能是有關聯的,所以放在了一起:
先定義一個列舉:

    //列舉
    public enum DownButton
    { 
        no = 0,
        pan = 1,
        bigger = 2,  //拉框放大
        smaller = 3, //拉框縮小
 	}

3.6 漫遊

        private void PanTSButton_MouseDown(object sender, MouseEventArgs e)
        {
            // EjectAllButton();  //彈起所有得按鈕
            PanTSButton.Checked = true;
            DButton = DownButton.pan;
            mainMapControl.MousePointer = esriControlsMousePointer.esriPointerPan;
            mainMapControl.CurrentTool = null;  //將勾選得其他工具取消
        }

3.7 拉框放大

private void btnBigger_Click(object sender, EventArgs e)
        {
            // EjectAllButton();  //彈起所有得按鈕
            btnBigger .Checked = true;
            mainMapControl.CurrentTool = null;
            DButton = DownButton.bigger;
            mainMapControl.MousePointer = esriControlsMousePointer.esriPointerZoomIn;
        }

3.8 拉框縮小

        private void btnSmaller_Click(object sender, EventArgs e)
        {
            // EjectAllButton();  //彈起所有得按鈕
            btnSmaller.Checked = true;
            mainMapControl.CurrentTool = null;  //將勾選的其他工具去掉
            DButton = DownButton.smaller;
            mainMapControl.MousePointer = esriControlsMousePointer.esriPointerZoomOut;
        }

然後,編寫主地圖的OnMouseDown事件

private void mainMapControl_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
        {
            //將螢幕的座標轉換為地圖的座標點
            //IPoint pPoint = (mainMapControl.Map as IActiveView).ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);
            if (e.button == 1)
            {//表示滑鼠的左鍵
                IActiveView pActiveView = mainMapControl.ActiveView;
                IEnvelope pEnvelop = new EnvelopeClass();

                switch (DButton)
                {
                    
                    //拉框放大
                    case DownButton.bigger:
                    #region 拉框放大
                        pEnvelop = mainMapControl.TrackRectangle();
                        //如果拉框的範圍為空則返回
                        if (pEnvelop == null || pEnvelop.IsEmpty || pEnvelop.Height == 0 || pEnvelop.Width == 0)
                        {
                            return;
                        }
                        //如果有拉框範圍則放大到拉框範圍
                        pActiveView.Extent = pEnvelop;
                        pActiveView.Refresh();
                        break;
                    #endregion
   
                    case DownButton.smaller:
                    #region 拉框縮小
                        pEnvelop = mainMapControl.TrackRectangle();
                        //如果拉框範圍為空則退出
                        if (pEnvelop == null || pEnvelop.IsEmpty || pEnvelop.Height == 0 || pEnvelop.Width == 0)
                        {
                            return;
                        }
                        else  //如果有拉框範圍、則以拉框範圍為中心,縮小倍數為當前檢視範圍/拉框範圍
                        {
                            double dWidth = pActiveView.Extent.Width * pActiveView.Extent.Width / pEnvelop.Width;
                            double dHeight = pActiveView.Extent.Height * pActiveView.Extent.Height / pEnvelop.Height;
                            double dXmin = pActiveView.Extent.XMin - ((pEnvelop.XMin - pActiveView.Extent. XMin) * pActiveView.Extent.Width / pEnvelop.Width);
                            double dYmin = pActiveView.Extent.YMin - ((pEnvelop.YMin - pActiveView.Extent.YMin) * pActiveView.Extent.Height / pEnvelop.Height);
                            double dXmax = dXmin + dWidth;
                            double dYmax = dYmin + dHeight;
                            pEnvelop.PutCoords(dXmin, dYmin, dXmax, dYmax);
                        }
                        pActiveView.Extent = pEnvelop;
                        pActiveView.Refresh();
                        break;
                    #endregion
           
                    case DownButton.pan:
                    #region 漫遊
                        mainMapControl.Pan();
                        break;
                        #endregion
                }
            }



        }

4. 儲存地圖文件

private void saveToolStrip_Click(object sender, EventArgs e)
        {
            try
            {
                string sMxdFileName = mainMapControl.DocumentFilename;
                IMapDocument pMapDocument = new MapDocumentClass();
                //檢查文件是否為空以及有效性
                if (sMxdFileName != null && mainMapControl.CheckMxFile(sMxdFileName))
                {
                    if (pMapDocument.get_IsReadOnly(sMxdFileName))
                    {
                        MessageBox.Show("地圖本當為只讀,不能儲存!");
                        pMapDocument.Close();
                        return;
                    }
                    
                    else
                    {
                    SaveFileDialog pSaveFileDialog = new System.Windows.Forms.SaveFileDialog();
                    pSaveFileDialog.Title = "請選擇儲存路徑";
                    pSaveFileDialog.Filter = "ArcMap文件(*.mxd)|*.mxd|ArcMap模板(*.mxt)|*.mxt";
                    //當相同的檔案存在是提示錯誤
                    pSaveFileDialog.OverwritePrompt = true;
                    pSaveFileDialog.RestoreDirectory = true;
                    if (pSaveFileDialog.ShowDialog() == DialogResult.OK)
                    {
                        //獲取名字
                        sMxdFileName = pSaveFileDialog.FileName;
                    }
                    else
                    {
                        return;
                    }
                        pMapDocument.New(sMxdFileName);
                        pMapDocument.ReplaceContents(mainMapControl.Map as IMxdContents);
                        //儲存為絕對路徑
                        pMapDocument.Save(pMapDocument.UsesRelativePaths, true);
                        pMapDocument.Close();
                        MessageBox.Show("儲存文件成功");
                }
                }
               
                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

4.2 另存為

private void saveAsToolStrip_Click(object sender, EventArgs e)
        {
            try
            {
                SaveFileDialog pSaveDialog = new System.Windows.Forms.SaveFileDialog();
                pSaveDialog.Title = "另存為";
                pSaveDialog.OverwritePrompt = true;//當相同的檔案存在是提示錯誤
                pSaveDialog.Filter = "ArcMap文件(*.mxd)|*.mxd|ArcMap模板(*.mxt)|*.mxt";
                pSaveDialog.RestoreDirectory = true;
                if (pSaveDialog.ShowDialog() == DialogResult.OK)
                {
                    string sFilePath = pSaveDialog.FileName;
                    IMapDocument pMapDocument = new MapDocumentClass();
                    pMapDocument.New(sFilePath);
                    pMapDocument.ReplaceContents(mainMapControl.Map as IMxdContents);
                    pMapDocument.Save(true, true);
                    pMapDocument.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
  1. 輸出地圖(這裡真的想用python寫指令碼, engine這麼這麼複雜)
  1. 選擇要素
  1. 查詢
  1. 空間分析