ArcEngine開發之導出地圖(C#)

1、界面如下:

2、實現步驟

a、創建新窗體,ExportMapForm

b、添加控件ComboBox,TextBox,Button等,具體參數設置如下:

TextBox

txtFileName

用於顯示輸出路徑,ReadOnly設置爲true

Button

btnSave

顯示“路徑”,用於設置文件導出位置

NumbericUpDown

txtResolution

選擇分辨率,默認value=96

CombiBox

cmbPageSize

顯示“圖片尺寸”,集合:自定義大小、A4A3A2A1A0

TextBox

txtWidth

寬度

TextBox

txtLength

長度

RadioButton

radioButton1

顯示“英寸”

RadioButton

radioButton2

顯示“釐米”

RadioButton

radioButton3

顯示“像素”

c、框體的源代碼如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Output;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geometry;
using System.Text.RegularExpressions;
using ESRI.ArcGIS.Controls;


namespace GIS
{
    public partial class ExportMapForm : Form
    {
        private double pWidth, pHeight; 
        private IActiveView pActiveView=null;
        public ExportMapForm(IHookHelper hookHelper)
        {
            InitializeComponent();
            pActiveView = hookHelper.ActiveView;
        }
        private void btnSave_Click(object sender, EventArgs e)
        {
            this.saveMapFileDialog.ShowDialog();
            this.txtFileName.Text = saveMapFileDialog.FileName;
        }

        private void cmdOK_Click(object sender, EventArgs e)
        {
            this.Cursor = Cursors.WaitCursor;
            if (!IsNumbericA(txtWidth.Text))
            {
                MessageBox.Show("請輸入數字!", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtWidth.Focus();
                return;
            }
            if (!IsNumbericA(txtHeight.Text))
            {
                MessageBox.Show("請輸入數字!", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtHeight.Focus();
                return;
            }
            if (txtResolution.Value > 1)
            {
                ExportTool();
            }
            this.Cursor = Cursors.Default;
        }

        private void ExportTool()
        {
             IExport pExport=null;
//           IExportJPEG pExportFormat;
             IWorldFileSettings pWorldFile=null;
             IExportImage pExportType;
             IEnvelope pDriverBounds = null;
  //         int lScreenResolution ;
             ESRI.ArcGIS.Display.tagRECT userRECT=new ESRI.ArcGIS.Display.tagRECT();
             IEnvelope pEnv=new EnvelopeClass();
 //          double dWidth;
 //          double dHeight;
             int lResolution;
             lResolution = Convert.ToInt32(this.txtResolution.Value);
            switch (this.saveMapFileDialog.Filter.ToString().Trim().Substring(0,3))
            {
                case "jpg":
                    pExport = new ExportJPEGClass();
                    break;
                case "bmp":
                    pExport = new ExportBMPClass();
                    break;
                case "gif":
                    pExport = new ExportGIFClass();
                    break;
                case "tif":
                    pExport = new ExportTIFFClass();
                    break;
                case "png":
                    pExport = new ExportPNGClass();
                    break;
                case "emf":
                    pExport = new ExportEMFClass();
                    break;
                case "pdf":
                    pExport = new ExportPDFClass();
                    break;
                case ".ai":   
                    pExport = new ExportAIClass();
                    break;
                case "svg":
                    pExport = new ExportSVGClass();
                    break;
                default:
                    pExport = new ExportJPEGClass();
                    break;
            }
     
            if (this.txtFileName.Text.ToString().Trim() != "")
            {
                if (System.IO.File.Exists(this.txtFileName.Text.ToString()) == true)
                {
                    MessageBox.Show("該文件已經存在,請重新命名!");
                    this.txtFileName.Text = "";
                    this.txtFileName.Focus();
                }
                else
                {
                    pExport.ExportFileName = this.txtFileName.Text;
                    pExport.Resolution = lResolution;
                    pExportType = pExport as IExportImage;
                    pExportType.ImageType = esriExportImageType.esriExportImageTypeTrueColor;
                    pEnv = pActiveView.Extent;
                    pWorldFile = (IWorldFileSettings)pExport;
                    pWorldFile.MapExtent = pEnv;
                    pWorldFile.OutputWorldFile = false;
                    userRECT.top = 0;
                    userRECT.left = 0;
                    userRECT.right = Convert.ToInt32(pWidth);
                    userRECT.bottom = Convert.ToInt32(pHeight);
                    pDriverBounds = new EnvelopeClass();
                    pDriverBounds.PutCoords(userRECT.top, userRECT.bottom, userRECT.right, userRECT.top);
                    pExport.PixelBounds = pDriverBounds;

                    ITrackCancel pTrackCancel = new TrackCancelClass();
                    pActiveView.Output(pExport.StartExporting(), lResolution, ref userRECT, pActiveView.Extent, pTrackCancel);
                    pExport.FinishExporting();
                    MessageBox.Show("打印圖片保存成功!", "保存", MessageBoxButtons.OK);
                    this.Close();

                }

            }
            else
            {
                MessageBox.Show("請保存文件!");
            }

        }
        public IActiveView ResActiveView
        {
            get {
                return pActiveView;
            }
            set {
                pActiveView = value;
            }
        }

        private void txtResolution_ValueChanged(object sender, EventArgs e)
        {
             cmbPageSize_SelectedValueChanged(null,null);
             if (this.radioButton3.Checked == true)
             {
                 this.txtWidth.Text = pWidth.ToString(".00");
                 this.txtHeight.Text = pHeight.ToString(".00");
             }
        }

        private void cmbPageSize_SelectedValueChanged(object sender, EventArgs e)
        {
            switch(cmbPageSize.Text)
            {
                case "自定義大小":
                    txtWidth.Focus();
                    break;
                case "A4":
                    showWH(21,29.7);
                    break;
                case"A3":
                    showWH(29.7, 42);
                    break;
                case"A2":
                    showWH(42, 59.4);
                    break;
                case"A1":
                    showWH(59.4, 84.1);
                    break;
               case"A0":
                    showWH(84.1, 118.9);
                    break;
            }    
        }

//顯示寬度和高度
//傳入的參數必須是釐米
        private void showWH(double pW,double pH)
       {
           pWidth = Convert.ToDouble((pW / 2.54) * Convert.ToDouble(txtResolution.Value));
           pHeight = Convert.ToDouble((pH / 2.54) * Convert.ToDouble(txtResolution.Value));
            if (this.radioButton1.Checked == true)
            {
                this.txtWidth.Text = Convert.ToDouble(pW / 2.54).ToString(".00");
                this.txtHeight.Text = Convert.ToDouble(pH / 2.54).ToString(".00");
            }
            else if (this.radioButton2.Checked == true)
            {
                this.txtWidth.Text = pW.ToString(".00");
                this.txtHeight.Text = pH.ToString(".00");
            }
            else
            {
                this.txtWidth.Text = pW.ToString(".00");
                this.txtHeight.Text = pH.ToString(".00");
            }
        }

        private void txtWidth_TextChanged(object sender, EventArgs e)
        {
            //if (!IsNumbericA(txtWidth.Text))
            //{
            //    MessageBox.Show("請輸入數字!", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
            //    return;
            //}
            if (this.radioButton1.Checked == true)
            {
                pWidth = Convert.ToDouble(txtWidth.Text) * Convert.ToDouble(txtResolution.Value);

            }
            else if (this.radioButton2.Checked == true)
            {
                pWidth = Convert.ToDouble(Convert.ToDouble(txtWidth.Text) / 2.54) * Convert.ToDouble(txtResolution.Value);

            }else
            {
                pWidth = Convert.ToDouble(txtWidth.Text);
            }
        }

        private void txtHeight_TextChanged(object sender, EventArgs e)
        {
            //if (!IsNumbericA(txtHeight.Text))
            //{
            //    MessageBox.Show("請輸入數字!", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
            //    return;
            //}
                
            if (this.radioButton1.Checked == true)
            {
                pHeight = Convert.ToDouble(txtHeight.Text) * Convert.ToDouble(txtResolution.Value);

            }
            else if (this.radioButton2.Checked == true)
            {
                pHeight = Convert.ToDouble(Convert.ToDouble(txtHeight.Text) / 2.54) * Convert.ToDouble(txtResolution.Value);

            }
            else
            {
                pHeight = Convert.ToDouble(txtHeight.Text);
            }
        }

        private void radioButton1_Click(object sender, EventArgs e)
        {
            this.txtWidth.Text = Convert.ToDouble(pWidth / Convert.ToDouble(txtResolution.Value)).ToString(".00");
            this.txtHeight.Text = Convert.ToDouble(pHeight / Convert.ToDouble(txtResolution.Value)).ToString(".00");
        }

        private void radioButton2_Click(object sender, EventArgs e)
        {
                 this.txtWidth.Text = Convert.ToDouble(2.54 * pWidth / Convert.ToDouble(txtResolution.Value)).ToString(".00");
                this.txtHeight.Text =Convert.ToDouble(2.54 * pHeight / Convert.ToDouble(txtResolution.Value)).ToString(".00");

        }

        private void radioButton3_Click(object sender, EventArgs e)
        {
            this.txtWidth.Text = pWidth.ToString(".00");
            this.txtHeight.Text = pHeight.ToString(".00");

        }
        #region 通用函數
        /// <summary>
        /// 是否大於0的數字
        /// </summary>
        /// <param name="v"></param>
        /// <returns></returns>
        private bool IsNumbericA(string v)
        {
            return ((this.IsIntegerA(v)) || (this.IsFloatA(v)));
        }
        /// <summary>
        /// 是否正浮點數
        /// </summary>
        /// <param name="v"></param>
        /// <returns></returns>
        private bool IsFloatA(string v)
        {
            string pattern = @"^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$";
            Regex reg = new Regex(pattern);
            return reg.IsMatch(v);
        }
        /// <summary>
        /// 是否正整數


        /// </summary>
        /// <param name="v"></param>
        /// <returns></returns>
        private bool IsIntegerA(string v)
        {
            string pattern = @"^[0-9]*[1-9][0-9]*$";
            Regex reg = new Regex(pattern);
            return reg.IsMatch(v);
        }
        #endregion

        private void frmResource_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (e.CloseReason == CloseReason.UserClosing)
            {
                e.Cancel = true;
                this.Hide();
            }
        }
    }
}

d、框體的調用:

//參數定義    
    IHookHelper layout_hookHelper = new HookHelperClass();
//參數賦值
    layout_hookHelper.Hook = this.axPageLayoutControl1.Object;

 

    ExportMapForm EMFrm = new ExportMapForm(layout_hookHelper);
    EMFrm.ShowDialog();


希望與大家分享下自己查找到的或者自己修改後的代碼,新手學習,若有錯誤歡迎批評指正!

發佈了27 篇原創文章 · 獲贊 13 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章