C#拼接地图瓦片

为了在AE程序中使用离线的电子地图,思路如下:

利用下载工具下载地图切片,然后利用C#进行切片拼接成一张图片,最后使用ArcMap进行地理配准,然后发布成ArcGIS Server 切片服务供程序使用。

今天讲的就是如何利用C#拼接切片。

1、切片下载工具网址开源地图下载器

下载器不是很好用,不过比起收费试用版的还是可以的,下载器界面如下:

2、数据准备,下载好的数据如下图

3、按钮点击事件

  private void button1_Click(object sender, EventArgs e)
        {
            //调用
            TilesBounds tilesBounds = new TilesBounds();
            tilesBounds.minCol = 109173;
            tilesBounds.maxCol = 109256;
            tilesBounds.minRow = 53284;
            tilesBounds.maxRow = 53363;
            //计算切片个数
            int num = (tilesBounds.maxCol - tilesBounds.minCol) * (tilesBounds.maxRow - tilesBounds.minRow);
            progressBar1.Maximum = num * 2;
            progressBar1.Step = 1;

            label3.Text = num.ToString();
            tilesBounds.zoomLevel = 17;
            string outPutFileName = "f:\\18.png";
            string tilePath = @"C:\data\titledata\";
            CombineTiles(tilesBounds, tilePath, outPutFileName);
            MessageBox.Show("拼接完成");
        }

4、将单个切片的像素值赋值给拼接后的图片

 int a = 0;//用于显示进度条
        ////将单个切片的像素值赋值给拼接后的图片
        private void SaveBitmapBuffered(Bitmap mainbit, string bmppath, int x, int y)
        {
            a++;
            progressBar1.Value = a;
            x = x * 256;
            y = y * 256;
            label4.Text = a.ToString();
            Application.DoEvents();
            Bitmap bt = new Bitmap(bmppath);
            for (int i = 0; i <256; i++)
            {
                for (int j =0; j <256; j++)
                {
                    mainbit.SetPixel(x + i, y + j, bt.GetPixel(i,j));
                }
            }
        }

 5、遍历瓦片并保存拼接后的图片

      /// <summary>
        /// 遍历瓦片
        /// </summary>
        private void CombineTiles(TilesBounds tilesBounds, string tilePath, string outPutFileName)
        {
            if (File.Exists(outPutFileName))
            {
                File.Delete(outPutFileName);
            }
            int imageWidth = 256 * (tilesBounds.maxCol - tilesBounds.minCol + 1);
            int imageHeight = 256 * (tilesBounds.maxRow - tilesBounds.minRow + 1);
            Bitmap memoryimg = new Bitmap(imageWidth, imageHeight);//设置拼接后的图片大小,注意:如果图片很大,需要将程序设置成64位
            for (int col = tilesBounds.minCol; col <= tilesBounds.maxCol; col++)
            {
                for (int row = tilesBounds.minRow; row <= tilesBounds.maxRow; row++)
                {
                    try
                    {
                        string sourceFileName = tilePath + tilesBounds.zoomLevel.ToString() + "\\" + col.ToString() + "\\" + row.ToString() + ".png";
                        if (File.Exists(sourceFileName))
                        {
                            SaveBitmapBuffered(memoryimg, sourceFileName, col - tilesBounds.minCol, row - tilesBounds.minRow);
                        }
                        else
                        {
                            Console.WriteLine("不存在:" + sourceFileName);
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }
            memoryimg.Save(outPutFileName);//保存合并后的图片
            memoryimg.Dispose();
        }

6、TilesBounds类

 class TilesBounds
    {
        public int minCol { get; set; }
        public int maxCol { get; set; }
        public int minRow { get; set; }
        public int maxRow { get; set; }
        public int zoomLevel { get; set; }
    }

7、拼接效果如下:

8、源码如下,附带测试数据:

http://pan.baidu.com/s/1jIJgJX0

时间: 2024-08-07 21:17:07

C#拼接地图瓦片的相关文章

(六)WebGIS中地图瓦片在Canvas上的拼接显示原理

1.前言 在之前的五个章节中,我们在第一章节里介绍了WebGIS的基本框架和技术,第二章节里介绍了什么是瓦片行列号以及计算它的原因,第三章节里介绍了如何通过地理范围计算出这个范围内瓦片的行列号,第四和第五章节里介绍了在得到瓦片行列号后如何获得离线和在线地图的URL,这个章节里,我们将介绍在通过URL得到瓦片后,如何将其显示在浏览器相对应的地方,拼接出整块地图. 2.左上角瓦片起始点屏幕坐标的计算 在第三章节中,我介绍了对于左上角瓦片起始点屏幕坐标的换算原理和方法,这里我再次给出这个公式: off

下载百度地图瓦片的方法

续上篇<Web版百度地图加载离线瓦片>,本文贴出下载瓦片的简易程序. 百度地图瓦片的下载其实很容易,拿到下载链接然后批量下载就行了.不过由于需要按照规则来存储,最好自己写个程序去下载这些链接.否则就要使用人家已经做好的程序去下载了,这些很多都是需要收费的,或者有水印什么的. 其实直接拿到地图窗口内的所有瓦片并非难事,跟踪一下脚本中的代码就行了.不过脚本是压缩混淆过的,读起来比较难. 本文直接贴出来整理好的代码,然后就可以调用下载了. function downloadBaiduTiles(){

百度地图瓦片生成工具

http://www.cnblogs.com/milkmap/ 百度地图瓦片生成工具http://download.csdn.net/download/bq_cui/5790805 免费软件. 新版下载地址:http://blog.csdn.net/bq_cui 2013.7.21 可以生成切片及代码. bug:地图级别切换时图像位置跳跃导致不平滑. 说明: 请自己到百度免费申请密钥,替换t.html文件中“您的密钥”. 申请地址 http://lbsyun.baidu.com/apiconso

百度与谷歌地图瓦片组织方式对比

转自http://www.cnblogs.com/janehlp/archive/2012/08/27/2658106.html 百度是从中心点经纬度(0,0)度开始计算瓦片,在第1级时百度将世界地图分为4块. 中心点右上部分(中国地区)占1块. 谷歌是从左上角经纬度(-180,90)度开始计算瓦片,在第1级时谷歌将世界地图分为1块. 在第2级时,百度地图(中心点右上部分)分为2块, 这是因为在这级百度的地图分辨率为65536米/像素,分辨率=math.pow(2,(18 - n)). WGS8

多时相地图瓦片简单设想

地图及瓦片地图相关文章 瓦片地图的前世今生 国内主要地图瓦片坐标系定义及计算原理 地图瓦片与四叉树(二) 地图瓦片与四叉树(二) 一个有意思的坐标系投影介绍网站 一个小游戏让你彻底弄懂墨卡托投影 百度JavaScript API中经纬度坐标转瓦片坐标bug OpenGIS Web Map Tile Service Implementation Standard 揭秘Google地图背后的秘密:隐藏的算法与人工操作 地图点聚合优化方案 动态地图标注算法 多时相遥感影像相关文章 百度百科-多时相 如

谷歌地图下载瓦片拼接地图

选择多边形框选下载 特别BIGEMAP地图下载器提供了多种选择的下载方式,方便用户得到不同的应用当中: 1.矩形框选择区域下载 2.多边形选择区域下载 3.根据行政区(省市县区)域边界选择下载 4.导入外部边界文件下载(支持kml/kmz/shp格式) 5.标准分幅下载 6.指定矩形框经纬度范围下载 本文主要介绍应用多边形如何下载想要的区域 第一步:选在多边形工具 打开BIGEMAP软件,在软件的最上面工具栏选择[],单机左键选择. 第二步:通过单击[鼠标左键]在地图上任意位置开始绘制多边形,选

谷歌地图瓦片相关操作(js,google Maps v3)

前段时间,由于工作原因,研究了谷歌地图的瓦片相关操作.已知一个点的经纬度和地图级别,获取该点所在的瓦片的url:已知一个瓦片的url,计算该瓦片左上角经纬度:已知一个点经纬度和地图级别,计算这个点在世界地图上的像素值. 1.已知一个点的经纬度和地图级别,获取该点所在的瓦片的url 参考了两篇博客:这个博客(http://blog.csdn.net/lijun_xiao2009/article/details/8178578)中的原理,但是使用到的公式太难算了,就结合了另一篇博客(http://b

osgEarth如何加载离线谷歌卫星地图瓦片的源码教程

说明 本实例演示重新编译bing驱动直接加载本地离线影像瓦片地图. 本实例使用软件版本:osg3.3.1和osgEarth2.5 VC10编译环境(参考osgearth加载谷歌卫星地图的源码案例),vs2010,水经注万能地图下载器.  osgdb_osgearth_bingd.rar (52.96 KB, 下载次数: 786)  osgearthAPI.rar (31.91 KB, 下载次数: 831) 影像瓦片来源"水经注万能地图下载器".如果没有安装本软件,可以百度"水

地图瓦片下载

猫头鹰地图下载器,支持多风格瓦片下载,开发个性化地图利器,可以下载默认定义样式,也可下载自定义样式 以上图片是常规的地图下载,以下图片是个性化地图的下载 还有更多的请下载软件体验,软件下载地址如下: http://api.jjszd.com:8081/apituiguang/%E7%8C%AB%E5%A4%B4%E9%B9%B0%E5%9C%B0%E5%9B%BE%E7%93%A6%E7%89%87%E4%B8%8B%E8%BD%BD.rar 原文地址:https://www.cnblogs.c