• 谷歌瓦片地图纠偏


        对谷歌瓦片地图进行纠偏,有两种方法:一是对拼接大图进行纠偏,然后重新切片;二是直接对瓦片图进行纠偏。这里我用的是第二种方法,即直接对瓦片地图进行纠偏。

    App.config配置:

    <appSettings>
      <add key="inputPath" value="D:\_临时文件GISMap1818940751"/>
      <add key="outputPath" value="D:\_临时文件GISMapOutput1818940751"/>
      <add key="deltaPixcelX" value="1031"/>
      <add key="deltaPixcelY" value="421"/>
      <add key="fromMapZoom" value="1"/>
      <add key="toMapZoom" value="18"/>
    </appSettings>
    View Code

    对瓦片图进行纠偏处理的算法代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Configuration;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using Utils;
    
    namespace TileProcess
    {
        public partial class Form1 : Form
        {
            private int _count = 0;
            private int _deltaPixcelX;
            private int _deltaPixcelY;
            private string _inputPath;
            private string _outputPath;
            private int _fromMapZoom;
            private int _toMapZoom;
    
            private DateTime _startTime;
            private int _lastCount;
    
            public Form1()
            {
                InitializeComponent();
    
                _deltaPixcelX = Convert.ToInt32(ConfigurationManager.AppSettings["deltaPixcelX"]);
                _deltaPixcelY = Convert.ToInt32(ConfigurationManager.AppSettings["deltaPixcelY"]);
                _inputPath = ConfigurationManager.AppSettings["inputPath"];
                _outputPath = ConfigurationManager.AppSettings["outputPath"];
                _fromMapZoom = Convert.ToInt32(ConfigurationManager.AppSettings["fromMapZoom"]);
                _toMapZoom = Convert.ToInt32(ConfigurationManager.AppSettings["toMapZoom"]);
            }
    
            private void btnTileProcess_Click(object sender, EventArgs e)
            {
                this.btnTileProcess.Enabled = false;
    
                Task.Factory.StartNew(() =>
                {
                    LogUtil.Log("开始处理");
                    Process();
                });
    
                Thread thread = new Thread(new ThreadStart(() =>
                {
                    int sleepInterval = 1000;
                    while (true)
                    {
                        Thread.Sleep(sleepInterval);
                        this.BeginInvoke(new Action(() =>
                        {
                            double totalSeconds = DateTime.Now.Subtract(_startTime).TotalSeconds;
                            int avg = (int)(_count / totalSeconds);
                            lblMsg.Text = string.Format("已处理 {0} 张瓦片图", _count);
                            if (_count - _lastCount > 0)
                            {
                                lblSpeed.Text = string.Format("当前速度:{0} 张/每秒,平均速度:{1} 张/每秒", (_count - _lastCount) * 1000.0 / sleepInterval, avg);
                            }
                            _lastCount = _count;
                        }));
                    }
                }));
                thread.IsBackground = true;
                thread.Start();
            }
    
            /// <summary>
            /// 瓦片纠偏处理
            /// </summary>
            private void Process()
            {
                _startTime = DateTime.Now;
                Regex regex = new Regex(@"\(d+)\(d+).png", RegexOptions.IgnoreCase);
                for (int i = _fromMapZoom; i <= _toMapZoom; i++)
                {
                    int deltaPixcelX = (int)Math.Round(_deltaPixcelX / Math.Round(Math.Pow(2, 18 - i)));
                    int deltaPixcelY = (int)Math.Round(_deltaPixcelY / Math.Round(Math.Pow(2, 18 - i)));
    
                    string[] fileArr = Directory.GetFiles(_inputPath + "\" + i, "*.*", SearchOption.AllDirectories);
                    foreach (string file in fileArr)
                    {
                        ThreadData data = new ThreadData();
                        data.File = file;
                        data.I = i;
                        data.DeltaPixcelX = deltaPixcelX;
                        data.DeltaPixcelY = deltaPixcelY;
    
                        ThreadUtil.Run((obj) =>
                        {
                            ThreadData d = obj as ThreadData;
    
                            Match match = regex.Match(d.File);
                            if (match.Success)
                            {
                                int x = Convert.ToInt32(match.Groups[1].Value);
                                int y = Convert.ToInt32(match.Groups[2].Value);
    
                                string pathTarget = string.Format(string.Format(@"{0}{1}{2}{3}.png", _outputPath, d.I, x, y));
                                if (!File.Exists(pathTarget))
                                {
                                    if (!Directory.Exists(Path.GetDirectoryName(pathTarget)))
                                    {
                                        Directory.CreateDirectory(Path.GetDirectoryName(pathTarget));
                                    }
                                    Bitmap bmpNew = new Bitmap(256, 256, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
                                    Graphics graph = Graphics.FromImage(bmpNew);
    
                                    int deltaX = data.DeltaPixcelX / 256;
                                    int deltaY = data.DeltaPixcelY / 256;
    
                                    //临时变量定义
                                    string pathSource = null;
                                    FileStream fs = null;
                                    byte[] bArr = null;
                                    MemoryStream ms = null;
                                    Bitmap bmpSource = null;
    
                                    //起始
                                    pathSource = string.Format(@"{0}{1}{2}{3}.png", _inputPath, d.I, x + deltaX, y + deltaY);
                                    if (File.Exists(pathSource))
                                    {
                                        fs = new FileStream(pathSource, FileMode.Open, FileAccess.Read);
                                        bArr = new byte[fs.Length];
                                        int readCount = fs.Read(bArr, 0, bArr.Length);
                                        ms = new MemoryStream(bArr, 0, readCount);
                                        bmpSource = new Bitmap(ms);
                                        graph.DrawImage(bmpSource, 0, 0, new RectangleF(data.DeltaPixcelX % 256, data.DeltaPixcelY % 256, 256 - data.DeltaPixcelX % 256, 256 - data.DeltaPixcelY % 256), GraphicsUnit.Pixel);
                                        graph.Flush();
    
                                        fs.Close();
                                        fs = null;
                                        ms.Close();
                                        ms = null;
                                        bmpSource.Dispose();
                                        bmpSource = null;
                                    }
    
                                    //
                                    pathSource = string.Format(@"{0}{1}{2}{3}.png", _inputPath, d.I, x + deltaX + 1, y + deltaY);
                                    if (File.Exists(pathSource))
                                    {
                                        fs = new FileStream(pathSource, FileMode.Open, FileAccess.Read);
                                        bArr = new byte[fs.Length];
                                        int readCount = fs.Read(bArr, 0, bArr.Length);
                                        ms = new MemoryStream(bArr, 0, readCount);
                                        bmpSource = new Bitmap(ms);
                                        graph.DrawImage(bmpSource, 256 - data.DeltaPixcelX % 256, 0, new RectangleF(0, data.DeltaPixcelY % 256, data.DeltaPixcelX % 256, 256 - data.DeltaPixcelY % 256), GraphicsUnit.Pixel);
                                        graph.Flush();
    
                                        fs.Close();
                                        fs = null;
                                        ms.Close();
                                        ms = null;
                                        bmpSource.Dispose();
                                        bmpSource = null;
                                    }
    
                                    //
                                    pathSource = string.Format(@"{0}{1}{2}{3}.png", _inputPath, d.I, x + deltaX, y + deltaY + 1);
                                    if (File.Exists(pathSource))
                                    {
                                        fs = new FileStream(pathSource, FileMode.Open, FileAccess.Read);
                                        bArr = new byte[fs.Length];
                                        int readCount = fs.Read(bArr, 0, bArr.Length);
                                        ms = new MemoryStream(bArr, 0, readCount);
                                        bmpSource = new Bitmap(ms);
                                        graph.DrawImage(bmpSource, 0, 256 - data.DeltaPixcelY % 256, new RectangleF(data.DeltaPixcelX % 256, 0, 256 - data.DeltaPixcelX % 256, data.DeltaPixcelY % 256), GraphicsUnit.Pixel);
                                        graph.Flush();
    
                                        fs.Close();
                                        fs = null;
                                        ms.Close();
                                        ms = null;
                                        bmpSource.Dispose();
                                        bmpSource = null;
                                    }
    
                                    //右下
                                    pathSource = string.Format(@"{0}{1}{2}{3}.png", _inputPath, d.I, x + deltaX + 1, y + deltaY + 1);
                                    if (File.Exists(pathSource))
                                    {
                                        fs = new FileStream(pathSource, FileMode.Open, FileAccess.Read);
                                        bArr = new byte[fs.Length];
                                        int readCount = fs.Read(bArr, 0, bArr.Length);
                                        ms = new MemoryStream(bArr, 0, readCount);
                                        bmpSource = new Bitmap(ms);
                                        graph.DrawImage(bmpSource, 256 - data.DeltaPixcelX % 256, 256 - data.DeltaPixcelY % 256, new RectangleF(0, 0, data.DeltaPixcelX % 256, data.DeltaPixcelY % 256), GraphicsUnit.Pixel);
                                        graph.Flush();
    
                                        fs.Close();
                                        fs = null;
                                        ms.Close();
                                        ms = null;
                                        bmpSource.Dispose();
                                        bmpSource = null;
                                    }
    
                                    bmpNew.Save(pathTarget);
                                    //bmpNew.Save("d:\_临时文件\1234.png"); //测试用
    
                                    bmpNew.Dispose();
                                    bmpNew = null;
                                    graph.Dispose();
                                    graph = null;
    
                                    _count++;
                                } //end if (!File.Exists(pathTarget))
                            } //end if (match.Success)
                        }, data, (ex) =>
                        {
                            this.BeginInvoke(new Action(() =>
                            {
                                lblErrorMsg.Text = "出错:" + ex.Message + "
    " + ex.StackTrace;
                                LogUtil.LogError(ex, "出错");
                            }));
                        }); //end ThreadUtil.Run
                    } //end foreach (string file in fileArr)
                } //end for (int i = _fromMapZoom; i <= _toMapZoom; i++)
            }
        }
    }
    View Code

    处理效率:我自己电脑每秒处理大约350张瓦片图,1到18级瓦片共100多万张图片,大约需要处理50分钟。

    瓦片图纠偏前后对比:

    还有另一种纠偏方法,通过修改leaflet源码进行纠偏:https://www.cnblogs.com/s0611163/p/13396622.html

  • 相关阅读:
    用Intellij idea创建Maven项目JDK8源码阅读环境问题整理
    咱的Maven项目能用Junit5吗?
    43- 8 mvc知识点
    42-7 linq
    (Ant编程) Iqueryable 类型介绍
    Iqueryable 类型中 的 使用lambda 注意的坑。 (linq to sql)
    (Ant编程) Linq 的select 方法
    Scala模式匹配
    scala正则表达式
    P4336 [SHOI2016]黑暗前的幻想乡
  • 原文地址:https://www.cnblogs.com/s0611163/p/9491785.html
Copyright © 2020-2023  润新知