在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#图形和图像处理 → C#谷歌地图下载源码

C#谷歌地图下载源码

C#图形和图像处理

下载此实例
  • 开发语言:C#
  • 实例大小:0.55M
  • 下载次数:52
  • 浏览次数:428
  • 发布时间:2020-08-20
  • 实例类别:C#图形和图像处理
  • 发 布 人:宁静远致
  • 文件格式:.rar
  • 所需积分:10
 相关标签: 谷歌 下载 C# 地图

实例介绍

【实例简介】C#谷歌地图下载源码

【实例截图】

from clipboard

【核心代码】

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.IO;
using System.Threading;
using System.Net;
using System.Drawing.Imaging;
using System.Collections;
//using Keli.ItsGISV3.Utilities;
using CY.CYGIS.Utilities;
//using Keli.ItsGISV3.Geometries;
using CY.CYGIS.Geometries;
//using Keli.ItsGISV3.Tiles.TileSources;
using CY.CYGIS.Tiles.TileSources;
//using Keli.ItsGISV3.ItsMap.Commands.Tools;
using CY.CYGIS.ItsMap.Commands.Tools;
using System.Xml;
using System.Configuration;
using System.Reflection;

namespace GoogleMapTool
{
    public partial class Form1 : Form
    {
        private int DefaultZoom = 9;
        private readonly MapPoint DefaultCenter = new MapPoint(117.283756, 31.863563);
        private readonly GoogleChinaTileSource gmts_Map = new GoogleChinaTileSource(GoogleType.Map);
        private static readonly string CUserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7";

        private const int RowItems = 4;
        private const int ColumnItems = 5;

        private double lngStart = 0.0;//起始经度
        private double latStart = 0.0; //起始纬度
        private double lngEnd = 0.0;//结束经度
        private double latEnd = 0.0;//结束纬度

        private static readonly object MyLocker = new object();

        //以下定义一些常量用于限定地图控件的出现范围
        private const int MinLeft = 12;
        private const int MinTop = 39;
        private const int MaxWidth = 616;
        private const int MaxHeight = 485;

        /// <summary>
        /// 线程数目分配
        /// </summary>
        private Hashtable threadNums = new Hashtable();

        /// <summary>
        /// 在每个等级里面启动下载子线程的个数
        /// </summary>
        private const int DownLoadImageChildThreadCount = 40;

        private string _TileSavePathContainMapType = "";

        private FreedomTool ft = new FreedomTool();

        private static readonly Random random = new Random();

        /// <summary>
        /// 用于存放所有的下载坐标
        /// </summary>
        private Hashtable levelValues = new Hashtable();

        /// <summary>
        /// 存放每个等级已经完成的图片个数
        /// </summary>
        private Hashtable finishCount = new Hashtable();

        /// <summary>
        /// 存放每个等级下载任务是否已经完成
        /// </summary>
        private Hashtable finishStatus = new Hashtable();

        /// <summary>
        /// 下载的等级列表
        /// </summary>
        private List<int> downLoadLevelList = new List<int>();

        /// <summary>
        /// 是否正在下载
        /// </summary>
        private bool isDownloading = false;

        /// <summary>
        /// 是否已经装载地图
        /// </summary>
        private bool hasLoadMap = false;

        /// <summary>
        /// 任务开始时间
        /// </summary>
        private DateTime beginTime;

        /// <summary>
        /// 任务结束时间
        /// </summary>
        private DateTime endTime;


        RectControl.CRectControl CRectCtl;

        public Form1()
        {
            InitializeComponent();

            this.mapControl1.UseFileCache = false;
            this.mapControl1.CurrentTool = (ToolBase)this.ft;

            threadNums.Add("15","3");
            threadNums.Add("16", "10");
            threadNums.Add("17", "15");
            threadNums.Add("18", "40");
            threadNums.Add("19", "50");
            threadNums.Add("20", "80");
        }

        /// <summary>
        /// 初始化下载进度
        /// </summary>
        private void InitDownLoadProgress()
        {
            downLoadLevelList.Clear();
            foreach (Control c in tableLayoutPanel1.Controls)
            {
                CheckBox cb = c as CheckBox;
                if (cb != null && cb.Checked)
                {
                    downLoadLevelList.Add(int.Parse(cb.Text));
                }
            }
            if (downLoadLevelList.Count > 0)
            {
                tableLayoutPanel2.Controls.Clear();
                tableLayoutPanel2.RowCount = downLoadLevelList.Count;
                tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Absolute, 20));
                //tableLayoutPanel2
                for (int i = 0; i < downLoadLevelList.Count; i  )
                {
                    ProgressBar pb = new ProgressBar();
                    pb.Name = "pb_"   downLoadLevelList[i].ToString();
                    pb.Dock = DockStyle.Top;
                    pb.Height = 10;
                    
                    Label lbStatus = new Label();
                    lbStatus.Text = "下载进度";
                    lbStatus.Name = "lb_"   downLoadLevelList[i].ToString();
                    lbStatus.Dock = DockStyle.Right;

                    Label lbLevel = new Label();
                    lbLevel.Text = "Level " downLoadLevelList[i].ToString() ":";
                    lbLevel.Refresh();

                    PictureBox pic = new PictureBox();
                    pic.Image = Image.FromFile(Application.StartupPath   @"\ok.png",false);
                    pic.Size = new System.Drawing.Size(16,16);
                    pic.SizeMode = PictureBoxSizeMode.StretchImage;
                    pic.Dock = DockStyle.None;
                    pic.Name = "pic_"   downLoadLevelList[i].ToString();
                    pic.Visible = false;

                    tableLayoutPanel2.Controls.Add(pb,1,i);
                    tableLayoutPanel2.Controls.Add(lbStatus, 2, i);
                    tableLayoutPanel2.Controls.Add(lbLevel, 0, i);
                    tableLayoutPanel2.Controls.Add(pic, 3, i);
                }
            }
        }

        /// <summary>
        /// 下载图片子进程
        /// </summary>
        private void DownLoadImageChildThread(object parameter)
        {
            object[] o = parameter as object[];
            int level = int.Parse(o[0].ToString());  //下载等级
            int startIndex = int.Parse(o[1].ToString()); //起始index
            int endIndex = int.Parse(o[2].ToString());  //结束index
            int imageCount = int.Parse(o[3].ToString());    //图片总数

            ProgressBar pb = GetProgressBarFromLayout(level);
            Label lb = GetLabelFromLayout(level);

            Hashtable htValues = levelValues[level] as Hashtable;
            if (htValues == null)
                return;

            List<int> listX = htValues["listX"] as List<int>;
            List<int> listY = htValues["listY"] as List<int>;

            string path1 = this._TileSavePathContainMapType   "\\L"   level.ToString("00");
            Point oPosition = Point.Empty;

            for (int i=startIndex;i<=endIndex;i  )
            {
                string path2 = path1   "\\"   listX[i].ToString();
                if (!Directory.Exists(path2))
                    Directory.CreateDirectory(path2);
                foreach (int y in listY)
                {
                    if (!isDownloading)
                        return;

                    oPosition.X = listX[i];
                    oPosition.Y = y;
                    string str = string.Concat(new object[4]
                              {
                                (object) path2,
                                (object) "\\",
                                (object) y,
                                (object) ".png"
                              });
                    if (!System.IO.File.Exists(str))
                    {
                        string imageUrl = this.mapControl1.TileSource.GetImageUrl(oPosition, level);

                        bool result = TryGetBitmapFromServerCache(listX[i], y, imageUrl, str);
                        while (!result)
                        {
                            result = TryGetBitmapFromServerCache(listX[i], y, imageUrl, str);
                        }
                    }

                    lock (MyLocker)
                    {
                        int finish = int.Parse(finishCount[level].ToString());
                        finish  ;
                        finishCount[level] = finish;

                        if (finish >= imageCount)  //该等级已经下载完成
                        {
                            finishStatus[level] = true; //设置该等级的下载完成状态
                            PictureBox pic = GetPictureBoxFromLayout(level);
                            SetPictureBoxVisible(pic, true);
                        }
                    }
                    SetProgressValue(pb,int.Parse(finishCount[level].ToString()));
                    SetLabelText(lb, string.Format("{0}/{1}", int.Parse(finishCount[level].ToString()), imageCount));

                    //此处检查全部任务是否已经完成
                    bool resultFlag = CheckTaskFinished();
                    if (resultFlag)  //全部下载完成
                    {
                        endTime = DateTime.Now;
                        lbEndTime.Text = endTime.ToString();
                        TimeSpan ts = endTime - beginTime;
                        lbTimeSpan.Text = string.Format("共耗时{0}时{1}分{2}秒", ts.Hours, ts.Minutes, ts.Seconds);
                        btnDownloadMap.Enabled = true;
                        btnStop.Enabled = false;
                    }
                }
            }
        }

        /// <summary>
        /// 检查下载任务是否已经完成
        /// </summary>
        /// <returns></returns>
        private bool CheckTaskFinished()
        { 
            for (int i = 0; i < downLoadLevelList.Count; i  )
            {
                bool result = bool.Parse(finishStatus[downLoadLevelList[i]].ToString());
                if (!result)
                    return false;
            }
            return true;
        }

        private void DownLoadImageThread(object downLoadLevel)
        {
            int level = (int)downLoadLevel;

            ProgressBar pb = GetProgressBarFromLayout(level);
            Label lb = GetLabelFromLayout(level);

            string path1 = this._TileSavePathContainMapType   "\\L"   level.ToString("00");
            if (!Directory.Exists(path1))
                Directory.CreateDirectory(path1);

            Hashtable htValues = levelValues[level] as Hashtable;
            if (htValues == null)
                return;

            List<int> list1 = htValues["listX"] as List<int>;
            List<int> list2 = htValues["listY"] as List<int>;

            int count1 = list1.Count;
            int count2 = list2.Count;

            //Point point1 = this.mapControl1.TileSource.FromMapPointToTilePoint(lngStart, latStart, level);
            //Point point2 = this.mapControl1.TileSource.FromMapPointToTilePoint(lngEnd, latEnd, level);
            //List<int> list1 = new List<int>();
            //List<int> list2 = new List<int>();
            //for (int x = point1.X; x <= point2.X;   x)
            //    list1.Add(x);
            //for (int y = point1.Y; y >= point2.Y; --y)
            //    list2.Add(y);

            //for (int index1 = 0; index1 < count1;   index1)
            //{
            //    int index2 = index1   random.Next(count1 - index1);
            //    int num2 = list1[index2];
            //    list1[index2] = list1[index1];
            //    list1[index1] = num2;
            //}
            //for (int index1 = 0; index1 < count2;   index1)
            //{
            //    int index2 = index1   random.Next(count2 - index1);
            //    int num2 = list2[index2];
            //    list2[index2] = list2[index1];
            //    list2[index1] = num2;
            //}
            int num3 = this.downLoadLevelList[this.downLoadLevelList.Count - 1];
            int num4 = list1[list1.Count - 1];
            int num5 = list2[list2.Count - 1];
            Point oPosition = Point.Empty;
            int imageCount = count1 * count2;   //图片总数
            int finishedCount = 0;  //已经完成的图片数
            SetProgressMaxValue(pb,imageCount);

            if (level <= 14)    //小于等于14级的直接处理,不需要再启动子线程
            {
                foreach (int x in list1)
                {
                    string path2 = path1   "\\"   x.ToString();
                    if (!Directory.Exists(path2))
                        Directory.CreateDirectory(path2);
                    foreach (int y in list2)
                    {
                        if (!isDownloading)
                            return;

                        oPosition.X = x;
                        oPosition.Y = y;
                        string str = string.Concat(new object[4]
                              {
                                (object) path2,
                                (object) "\\",
                                (object) y,
                                (object) ".png"
                              });
                        if (!System.IO.File.Exists(str))
                        {
                            string imageUrl = this.mapControl1.TileSource.GetImageUrl(oPosition, level);

                            bool result = TryGetBitmapFromServerCache(x, y, imageUrl, str);
                            while (!result)
                            {
                                result = TryGetBitmapFromServerCache(x, y, imageUrl, str);
                            }
                        }

                          finishedCount;
                        SetProgressValue(pb, finishedCount);
                        SetLabelText(lb, string.Format("{0}/{1}", finishedCount.ToString(), imageCount.ToString()));
                        if (finishedCount >= imageCount)  //该等级已经下载完成
                        {
                            finishStatus[level] = true; //设置该等级的下载完成状态
                            PictureBox pic = GetPictureBoxFromLayout(level);
                            SetPictureBoxVisible(pic, true);
                        }
                        //此处检查全部任务是否已经完成
                        bool resultFlag = CheckTaskFinished();
                        if (resultFlag)  //全部下载完成
                        {
                            Action act = delegate()
                            {
                                endTime = DateTime.Now;
                                lbEndTime.Text = endTime.ToString();
                                TimeSpan ts = endTime - beginTime;
                                lbTimeSpan.Text = string.Format("共耗时{0}时{1}分{2}秒", ts.Hours, ts.Minutes, ts.Seconds);
                                btnDownloadMap.Enabled = true;
                                btnStop.Enabled = false;
                            };
                            this.Invoke(act);
                        }
                    }
                }
            }
            else
            { 
                //此处启动子线程处理
                int threadCount = int.Parse(threadNums[level.ToString()].ToString());  //子线程个数
                int groupItems = 0; //将list x 划分成多个线程去处理

                if (count1 % threadCount == 0)  //能够整除
                {
                    groupItems = count1 / threadCount;
                }
                else
                {
                    groupItems = (count1 / threadCount)   1;
                }

                bool flag = false;

                for (int i = 0; i < threadCount; i  )
                {
                    //计算每个线程要处理的listx开始索引和结束索引
                    object[] o = new object[4];
                    o[0] = level;

                    //if (i == threadCount - 1)  //最后一个线程特殊处理
                    //{
                    //    o[1] = i * groupItems;
                    //    o[2] = count1 - 1;
                    //}
                    //else
                    //{
                    //    o[1] = i * groupItems;
                    //    o[2] = i * groupItems   groupItems - 1;
                    //}

                    int start = 0;
                    int end = 0;

                    start = i * groupItems;
                    end = i * groupItems   groupItems - 1;

                    if (end >= count1 - 1)  //已经到了结尾
                    {
                        end = count1 - 1;
                        flag = true;
                    }

                    o[1] = start;
                    o[2] = end;
                    o[3] = imageCount;  //图片总数

                    Thread thread = new Thread(new ParameterizedThreadStart(DownLoadImageChildThread));
                    //thread.Priority = ThreadPriority.BelowNormal;
                    thread.Name = "thread-" i;
                    thread.Start(o);

                    if (flag)
                        break;
                }
            }
        }

        delegate void SetLabelTextDelegate(Label l, string text);
        delegate void SetProgressValueDelegate(ProgressBar pb, int value);
        delegate void SetPictureBoxVisibleDelegate(PictureBox pb, bool value);

        private void SetLabelText(Label l,string text)
        {
            try
            {
                if (InvokeRequired)
                {
                    BeginInvoke(new SetLabelTextDelegate(SetLabelText), l, text);
                }
                else
                {
                    if (l != null)
                    {
                        l.Text = text;
                        l.Refresh();
                    }
                }
            }
            catch
            { 

            }
        }

        private void SetProgressMaxValue(ProgressBar pb, int maxValue)
        {
            try
            {
                if (InvokeRequired)
                {
                    BeginInvoke(new SetProgressValueDelegate(SetProgressMaxValue), pb, maxValue);
                }
                else
                {
                    if (pb != null)
                    {
                        pb.Maximum = maxValue;
                    }
                }
            }
            catch
            {

            }
        }

        private void SetPictureBoxVisible(PictureBox pb, bool value)
        {
            try
            {
                if (InvokeRequired)
                {
                    BeginInvoke(new SetPictureBoxVisibleDelegate(SetPictureBoxVisible), pb, value);
                }
                else
                {
                    if (pb != null)
                    {
                        pb.Visible = value;
                        pb.Refresh();
                    }
                }
            }
            catch
            {

            }
        }

        private void SetProgressValue(ProgressBar pb,int value)
        {
            try
            {
                if (InvokeRequired)
                {
                    BeginInvoke(new SetProgressValueDelegate(SetProgressValue), pb, value);
                }
                else
                {
                    if (pb != null)
                    {
                        pb.Value = value;
                        pb.Refresh();
                    }
                }
            }
            catch
            { 

            }
        }

        /// <summary>
        /// 获取table layout中指定的progressbar
        /// </summary>
        private ProgressBar GetProgressBarFromLayout(int level)
        {
            string key = "pb_" level.ToString();
            return tableLayoutPanel2.Controls[key] as ProgressBar;
        }

        /// <summary>
        /// 获取table layout中指定的label
        /// </summary>
        private Label GetLabelFromLayout(int level)
        {
            string key = "lb_"   level.ToString();
            return tableLayoutPanel2.Controls[key] as Label;
        }

        /// <summary>
        /// 获取table layout中指定的PictureBox
        /// </summary>
        private PictureBox GetPictureBoxFromLayout(int level)
        {
            string key = "pic_"   level.ToString();
            return tableLayoutPanel2.Controls[key] as PictureBox;
        }

        private void DownloadImage()
        {
            //this._IsContinueDownload = true;

            levelValues.Clear();
            finishCount.Clear();
            finishStatus.Clear();

            foreach (int level in downLoadLevelList)  //初始化LevelValues
            {
                //Hashtable htLevel = new Hashtable();
                Hashtable htValues = new Hashtable();

                Point pointX = this.mapControl1.TileSource.FromMapPointToTilePoint(lngStart, latStart, level);
                Point pointY = this.mapControl1.TileSource.FromMapPointToTilePoint(lngEnd, latEnd, level);
                List<int> listX = new List<int>();
                List<int> listY = new List<int>();
                for (int x = pointX.X; x <= pointY.X;   x)
                    listX.Add(x);
                for (int y = pointX.Y; y >= pointY.Y; --y)
                    listY.Add(y);
                int count1 = listX.Count;
                int count2 = listY.Count;
                for (int index1 = 0; index1 < count1;   index1)
                {
                    int index2 = index1   random.Next(count1 - index1);
                    int num2 = listX[index2];
                    listX[index2] = listX[index1];
                    listX[index1] = num2;
                }
                for (int index1 = 0; index1 < count2;   index1)
                {
                    int index2 = index1   random.Next(count2 - index1);
                    int num2 = listY[index2];
                    listY[index2] = listY[index1];
                    listY[index1] = num2;
                }

                htValues.Add("listX", listX);
                htValues.Add("listY", listY);

                levelValues.Add(level, htValues);

                finishCount.Add(level,0);
                finishStatus.Add(level,false);
            }

            foreach (int level in downLoadLevelList)
            {
                Thread downLoadThread = new Thread(new ParameterizedThreadStart(DownLoadImageThread));
                //downLoadThread.Priority = ThreadPriority.BelowNormal;
                downLoadThread.Start(level);
            }
        }

        private bool TryGetBitmapFromServerCache(int x, int y, string url, string filepath)
        {
            try
            {
                //if (string.IsNullOrEmpty(url))
                //    return flag;
                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
                httpWebRequest.Proxy = WebRequest.DefaultWebProxy;
                httpWebRequest.UserAgent = CUserAgent;
                httpWebRequest.Timeout = 30000;
                httpWebRequest.ReadWriteTimeout = 150000;
                httpWebRequest.Accept = "*/*";
                httpWebRequest.Referer = "http://ditu.google.cn/";
                using (HttpWebResponse httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse)
                {
                    using (Stream responseStream = httpWebResponse.GetResponseStream())
                    {
                        using (Bitmap bitmap = BitmapHelper.FromStreamToBitmap(responseStream))
                            bitmap.Save(filepath, ImageFormat.Png);
                    }
                }
                return true;
            }
            catch (Exception ex)
            {
                //Console.WriteLine("url=" url);
                return false;
            }
        }

        private void btnLoadMap_Click(object sender, EventArgs e)
        {
            double centerJD = 0.0;  //中心经度
            if (!double.TryParse(this.txtCenterJD.Text, out centerJD))
                centerJD = this.DefaultCenter.X;
            double centerWD = 0.0;     //中心纬度 
            if (!double.TryParse(this.txtCenterWD.Text, out centerWD))
                centerWD = this.DefaultCenter.Y;

            this.DefaultCenter.X = centerJD;
            this.DefaultCenter.Y = centerWD;
            this.DefaultZoom = Convert.ToInt32(this.cbLevel.Text);
            this.mapControl1.Center = this.DefaultCenter;
            this.mapControl1.Zoom = this.DefaultZoom;
            this.gmts_Map.IsCorrectGoogleVersions = false;
            this.mapControl1.TileSource = (TileSource)this.gmts_Map;

            lblStartLng.Text = mapControl1.Extent.Left.ToString();  //起始经度
            lblStartLat.Text = mapControl1.Extent.Bottom.ToString();  //起始纬度

            lblEndLng.Text = mapControl1.Extent.Right.ToString();  //结束经度
            lblEndLat.Text = mapControl1.Extent.Top.ToString();  //结束纬度

            hasLoadMap = true;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            LoadLevel();
            LoadDownLoadLevel();
            //btnLoadMap_Click(null,null);

            if (this.Controls.Contains(CRectCtl))
                this.Controls.Remove(CRectCtl);
            CRectCtl = new RectControl.CRectControl(mapControl1);
            //CRectCtl.TopLevel = false;
            this.Controls.Add(CRectCtl);
            CRectCtl.BringToFront();
            CRectCtl.Draw();


            //Form myForm = new Form();
            //myForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
            //myForm.Location = new Point(50,50);
            //myForm.Size = new System.Drawing.Size(100,100);
            //myForm.TopLevel = false;
            //myForm.TopMost = true;
            //myForm.ControlBox = false;
            //myForm.Opacity = 0.0;
            ////myForm.BackColor = Color.Transparent;
            //this.Controls.Add(myForm);
            //myForm.Show();
            //myForm.BringToFront();
        }

        private void LoadLevel()
        {
            cbLevel.Items.Clear();

            for (int i = 0; i < 21; i  )
            {
                cbLevel.Items.Add(i);
            }
            cbLevel.SelectedItem = 10;
        }

        private void LoadDownLoadLevel()
        {
            tableLayoutPanel1.Controls.Clear();

            for (int i = 0; i < RowItems; i  )
            {
                for (int j = 0; j < ColumnItems; j  )
                {
                    CheckBox cb = new CheckBox();
                    cb.Text = (i * ColumnItems   j   1).ToString();
                    tableLayoutPanel1.Controls.Add(cb,j,i);
                }
            }
        }

        private void AddElement(string key, string value, XmlElement parent)
        {
            XmlElement element = parent.OwnerDocument.CreateElement(key);
            XmlText textNode = parent.OwnerDocument.CreateTextNode(value);
            element.AppendChild((XmlNode)textNode);
            parent.AppendChild((XmlNode)element);
        }

        private void btnDownloadMap_Click(object sender, EventArgs e)
        {
            //if (!this._IsLoadMap)
            //{
            //    int num1 = (int)MessageBox.Show("请先加载地图");
            //}
            //else if (this.clbLevel.CheckedItems.Count < 1)
            //{
            //    int num2 = (int)MessageBox.Show("请选择要下载的级别");
            //}
            //else
            //{
                string text = this.txtSavePath.Text;
                if (string.IsNullOrEmpty(text))
                {
                    MessageBox.Show("路径不能为空");
                    return;
                }
                if (!hasLoadMap)
                {
                    MessageBox.Show("请先加载地图");
                    return;
                }
                //else if (!Directory.Exists(text))
                //{
                //    int num4 = (int)MessageBox.Show("路径不存在");
                //}
                //else
                //{

                //InitDownLoadProgress();

                this._TileSavePathContainMapType = text   "\\Map";
                    if (!Directory.Exists(this._TileSavePathContainMapType))
                        Directory.CreateDirectory(this._TileSavePathContainMapType);
                    //this.ChangeControlEnabled(false);
                    //this._ZoomList.Clear();
                    //foreach (object obj in this.clbLevel.CheckedItems)
                        //this._ZoomList.Add(Convert.ToInt32(obj));
                    lngStart = Convert.ToDouble(this.lblStartLng.Text);
                    latStart = Convert.ToDouble(this.lblStartLat.Text);
                    lngEnd = Convert.ToDouble(this.lblEndLng.Text);
                    latEnd = Convert.ToDouble(this.lblEndLat.Text);

                    InitDownLoadProgress();

                    if (downLoadLevelList.Count == 0)
                    {
                        MessageBox.Show("请选择要下载的等级");
                        return;
                    }

                    XmlDocument xmlDocument1 = new XmlDocument();
                    XmlDeclaration xmlDeclaration1 = xmlDocument1.CreateXmlDeclaration("1.0", "utf-8", "");
                    xmlDocument1.AppendChild((XmlNode)xmlDeclaration1);
                    XmlElement element1 = xmlDocument1.CreateElement("KeliTileGIS");
                    XmlElement element2 = xmlDocument1.CreateElement("LocalGoogleChinaMap");
                    XmlElement element3 = xmlDocument1.CreateElement("MinZoom");
                    int num5 = this.downLoadLevelList[0];
                    XmlText textNode1 = xmlDocument1.CreateTextNode(num5.ToString());
                    element3.AppendChild((XmlNode)textNode1);
                    XmlElement element4 = xmlDocument1.CreateElement("MaxZoom");
                    XmlText textNode2 = xmlDocument1.CreateTextNode(this.downLoadLevelList[this.downLoadLevelList.Count - 1].ToString());
                    element4.AppendChild((XmlNode)textNode2);
                    XmlElement element5 = xmlDocument1.CreateElement("Left");
                    XmlText textNode3 = xmlDocument1.CreateTextNode(lngStart.ToString());
                    element5.AppendChild((XmlNode)textNode3);
                    XmlElement element6 = xmlDocument1.CreateElement("Bottom");
                    XmlText textNode4 = xmlDocument1.CreateTextNode(latStart.ToString());
                    element6.AppendChild((XmlNode)textNode4);
                    XmlElement element7 = xmlDocument1.CreateElement("Right");
                    XmlText textNode5 = xmlDocument1.CreateTextNode(lngEnd.ToString());
                    element7.AppendChild((XmlNode)textNode5);
                    XmlElement element8 = xmlDocument1.CreateElement("Top");
                    XmlText textNode6 = xmlDocument1.CreateTextNode(latEnd.ToString());
                    element8.AppendChild((XmlNode)textNode6);
                    element2.AppendChild((XmlNode)element3);
                    element2.AppendChild((XmlNode)element4);
                    element2.AppendChild((XmlNode)element5);
                    element2.AppendChild((XmlNode)element6);
                    element2.AppendChild((XmlNode)element7);
                    element2.AppendChild((XmlNode)element8);
                    element1.AppendChild((XmlNode)element2);
                    xmlDocument1.AppendChild((XmlNode)element1);
                    xmlDocument1.Save(this._TileSavePathContainMapType   "\\conf.xml");
                    XmlDocument xmlDocument2 = new XmlDocument();
                    XmlDeclaration xmlDeclaration2 = xmlDocument2.CreateXmlDeclaration("1.0", "utf-8", "");
                    xmlDocument2.AppendChild((XmlNode)xmlDeclaration2);
                    XmlElement element9 = xmlDocument2.CreateElement("GoogleMapDownload");
                    XmlElement element10 = xmlDocument2.CreateElement("DownloadParameters");
                    this.AddElement("MapType", "Map", element10);
                    this.AddElement("CenterLng", mapControl1.Center.X.ToString(), element10);
                    this.AddElement("CenterLat", mapControl1.Center.Y.ToString(), element10);
                    
                    this.AddElement("InitLabel", this.cbLevel.Text.Trim(), element10);
                    //FrmMain frmMain1 = this;
                    string key1 = "MinLabel";
                    int num6 = this.downLoadLevelList[0];
                    string str1 = num6.ToString();
                    XmlElement parent1 = element10;
                    AddElement(key1, str1, parent1);
                    //FrmMain frmMain2 = this;
                    string key2 = "MaxLabel";
                    num6 = this.downLoadLevelList[this.downLoadLevelList.Count - 1];
                    string str2 = num6.ToString();
                    XmlElement parent2 = element10;
                    AddElement(key2, str2, parent2);
                    this.AddElement("SavePath", this.txtSavePath.Text.Trim(), element10);
                    this.AddElement("Disorder", ConfigurationSettings.AppSettings["Disorder"], element10);
                    this.AddElement("MinSleep", ConfigurationSettings.AppSettings["SleepMinMilliSeconds"], element10);
                    this.AddElement("MaxSleep", ConfigurationSettings.AppSettings["SleepMaxMilliSeconds"], element10);
                    this.AddElement("MVersion", ConfigurationSettings.AppSettings["MapVersion"], element10);
                    this.AddElement("SVersion", ConfigurationSettings.AppSettings["SatelliteVersion"], element10);
                    this.AddElement("LVersion", ConfigurationSettings.AppSettings["LabelsVersion"], element10);
                    this.AddElement("TVersion", ConfigurationSettings.AppSettings["TerrainVersion"], element10);
                    this.AddElement("GmdVersion", ((object)Assembly.GetExecutingAssembly().GetName().Version).ToString(), element10);
                    element9.AppendChild((XmlNode)element10);
                    xmlDocument2.AppendChild((XmlNode)element9);
                    xmlDocument2.Save(this._TileSavePathContainMapType   "\\gmd_params.xml");

                    //InitDownLoadProgress();

                    isDownloading = true;
                    btnStop.Enabled = true;
                    btnDownloadMap.Enabled = false;

                    beginTime = DateTime.Now;  //任务开始时间
                    lbStartTime.Text = beginTime.ToString();
                    lbEndTime.Text = string.Empty;
                    lbTimeSpan.Text = "共耗时:";

                    new Thread(new ThreadStart(this.DownloadImage))
                    {
                        Name = "GoogleMapDownloadThread",
                        IsBackground = false,
                        Priority = ThreadPriority.Normal
                    }.Start();
                //}
            //}

            
        }

        /// <summary>
        /// 显示地图的经纬度范围
        /// </summary>
        private void ShowJDWD()
        {
            if (mapControl1.Extent != null)
            {
                lblStartLng.Text = mapControl1.Extent.Left.ToString();  //起始经度
                lblStartLat.Text = mapControl1.Extent.Bottom.ToString();  //起始纬度

                lblEndLng.Text = mapControl1.Extent.Right.ToString();  //结束经度
                lblEndLat.Text = mapControl1.Extent.Top.ToString();  //结束纬度

                //设置中心点
                //txtCenterJD.Text = ((mapControl1.Extent.Left   mapControl1.Extent.Right) / 2).ToString();
                //txtCenterWD.Text = ((mapControl1.Extent.Top   mapControl1.Extent.Bottom) / 2).ToString();
            }

            if (mapControl1.Center != null)
            {
                txtCenterJD.Text = mapControl1.Center.X.ToString();
                txtCenterWD.Text = mapControl1.Center.Y.ToString();
            }
        }

        private void mapControl1_ZoomChanged(int zoom)
        {
            ShowJDWD();
        }

        private void mapControl1_MouseUp(object sender, MouseEventArgs e)
        {
            ShowJDWD();
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            isDownloading = false;
            btnStop.Enabled = false;
            btnDownloadMap.Enabled = true;
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            isDownloading = false;
        }


        //private bool CheckScope()
        //{
        //    if (mapControl1.Top <= MinTop)
        //        return true;
        //    return false;
        //}

        private void SetScope()
        {
            if (mapControl1.Top <= MinTop)
            {
                mapControl1.Top = MinTop;
                return;
            }
            if (mapControl1.Left <= MinLeft)
            {
                mapControl1.Left = MinLeft;
                return;
            }
            if (mapControl1.Bottom >= MinTop   MaxHeight)
            {
                mapControl1.Top = MinTop   MaxHeight - mapControl1.Height;
                return;
            }

            if (mapControl1.Right >= MinLeft   MaxWidth)
            {
                mapControl1.Left = MinLeft   MaxWidth - mapControl1.Width;
                return;
            }

            if (mapControl1.Size.Height >= MaxHeight)
            {
                mapControl1.Size = new Size(mapControl1.Size.Width,MaxHeight);
                return;
            }

            if (mapControl1.Size.Width >= MaxWidth)
            {
                mapControl1.Size = new Size(MaxWidth, mapControl1.Size.Height);
                return;
            }

            //if (mapControl1.Bottom >= MaxBottom)
            //{
            //    mapControl1.Bottom = MaxBottom;
            //}
            //if (mapControl1.Right <= MinTop)
            //{
            //    mapControl1.Top = MinTop;
            //}
        }

        private void mapControl1_Resize(object sender, EventArgs e)
        {
            SetScope();
            label8.Text = string.Format("Top={0},Bottom={1},Left={2},Right={3}",mapControl1.Top,mapControl1.Bottom,mapControl1.Left,mapControl1.Right);
            ShowJDWD();
        }

        private void mapControl1_LocationChanged(object sender, EventArgs e)
        {
            SetScope();
            ShowJDWD();
            label8.Text = string.Format("Top={0},Bottom={1},Left={2},Right={3}", mapControl1.Top, mapControl1.Bottom, mapControl1.Left, mapControl1.Right);
        }
    }

    public class DownLoadImageParameter
    {
        /// <summary>
        /// 下载等级
        /// </summary>
        public int level
        {
            get;
            set;
        }

        /// <summary>
        /// 起始索引
        /// </summary>
        public int startIndex
        {
            get;
            set;
        }

        /// <summary>
        /// 结束索引
        /// </summary>
        public int endIndex
        {
            get;
            set;
        }
    }
}

标签: 谷歌 下载 C# 地图

实例下载地址

C#谷歌地图下载源码

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警