C#拼接地图瓦片
为了在AE程序中使用离线的电子地图,思路如下:
利用下载工具下载地图切片,然后利用C#进行切片拼接成一张图片,最后使用ArcMap进行地理配准,然后发布成ArcGIS Server 切片服务供程序使用。
今天讲的就是如何利用C#拼接切片。
后记:之后找到了一个更加方便的方法,看博客:利用PBS的发布地图服务
1、切片下载工具网址:开源地图下载器
下载器不是很好用,不过比起收费试用版的还是可以的,下载器界面如下:
2、数据准备,下载好的数据如下图:
3、按钮点击事件
- private void button1_Click(object sender, EventArgs e)
- {
- //调用
- TilesBounds tilesBounds = new TilesBounds();
- tilesBounds.minCol = ;
- tilesBounds.maxCol = ;
- tilesBounds.minRow = ;
- tilesBounds.maxRow = ;
- //计算切片个数
- int num = (tilesBounds.maxCol - tilesBounds.minCol) * (tilesBounds.maxRow - tilesBounds.minRow);
- progressBar1.Maximum = num * ;
- progressBar1.Step = ;
- label3.Text = num.ToString();
- tilesBounds.zoomLevel = ;
- string outPutFileName = "f:\\18.png";
- string tilePath = @"C:\data\titledata\";
- CombineTiles(tilesBounds, tilePath, outPutFileName);
- MessageBox.Show("拼接完成");
- }
4、将单个切片的像素值赋值给拼接后的图片
- int a = ;//用于显示进度条
- ////将单个切片的像素值赋值给拼接后的图片
- private void SaveBitmapBuffered(Bitmap mainbit, string bmppath, int x, int y)
- {
- a++;
- progressBar1.Value = a;
- x = x * ;
- y = y * ;
- label4.Text = a.ToString();
- Application.DoEvents();
- Bitmap bt = new Bitmap(bmppath);
- for (int i = ; i <; i++)
- {
- for (int j =; j <; 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 = * (tilesBounds.maxCol - tilesBounds.minCol + );
- int imageHeight = * (tilesBounds.maxRow - tilesBounds.minRow + );
- 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
C#拼接地图瓦片的更多相关文章
- 从底层谈WebGIS 原理设计与实现(六):WebGIS中地图瓦片在Canvas上的拼接显示原理
从底层谈WebGIS 原理设计与实现(六):WebGIS中地图瓦片在Canvas上的拼接显示原理 作者:naaoveGI… 文章来源:naaoveGIS 点击数:1145 更新时间: ...
- Python爬取地图瓦片
由于要在内网开发地图项目,不能访问在线的地图服务了,就想把地图瓦片下载下来,网上找了一些下载器都是需要注册及收费的,否则下载到的图都是打水印的,如下: 因为地图瓦片就是按照层级.行.列规则组织的一张张 ...
- 五分钟学GIS | 快速生成地图瓦片秘籍
什么是地图瓦片? 地图瓦片是包含了一系列比例尺.一定地图范围内的地图切片文件.地图瓦片按照金字塔结构组织,每张瓦片都可通过级别.行列号唯一标记.在平移.缩放地图时,浏览器根据金字塔规则,计算出所需的瓦 ...
- 百度地图瓦片原理 | 百度map使用教程
百度地图瓦片原理: http://blog.csdn.net/mygisforum/article/details/22997879 百度map使用教程: http://www.myexception ...
- MBTiles地图瓦片管理工具
采用C#+GMap.NET+MBTiles数据库来实现. 具有以下功能: 1) 支持单个文件追加到mbtiles数据库. 2) 支持批量导入Google切片组织的地图瓦片. 3) 支持直接对MB ...
- 使用Nodejs+mongodb开发地图瓦片服务器
原先地图瓦片服务器采用的是arcgisserver发布的地图服务并进行切片,但ags发布的地图服务很占内存,发布太多的话服务器压力很大.再一个就是ags价太高了. 学习Nodejs之后,发现这是一个可 ...
- 天地图使用过程中由于display:none导致加载部分地图瓦片失败
在为按钮添加点击事件让地图显示的时候,初始加载未加载到当前页面尺寸的所有地图瓦片,在display:none之后停止加载地图,所以display:none属性去掉,改为dom解析完成之后$('#map ...
- nginx在代理转发地图瓦片数据中的应用
最近有这样一个需求,需要将arcgis server发布的地图瓦片放在移动硬盘中,系统演示的时候,直接调用本地的地图瓦片,而非远程的,主要是为了系统演示的时候加快地图访问速度. 而且需要在任意电脑运行 ...
- 翻译:Bing地图瓦片体系
Bing Maps Tile System Bing地图瓦片体系 原文链接:http://msdn.microsoft.com/en-us/library/bb259689.aspx Bing Map ...
随机推荐
- 黑马程序员——JAVA基础之编码表
------- android培训.java培训.期待与您交流! --------- 字符编码 字符流的出现为了方便操作字符. 更重要是的加入了编码转换. 通过子类转换流来完成. • I ...
- Android控件之SlidingDrawer(滑动式抽屉)详解与实例
SlidingDrawer效果想必大家也见到过,它就是1.5模拟器上进入应用程序列表的效果.下面是截图 一.简介 SlidingDrawer隐藏屏外的内容,并允许用户通过handle以显示隐藏内容.它 ...
- python中使用xlrd、xlwt操作excel表格详解
python读excel——xlrd 这个过程有几个比较麻烦的问题,比如读取日期.读合并单元格内容.下面先看看基本的操作: 首先读一个excel文件,有两个sheet,测试用第二个sheet,shee ...
- [转]理解android.intent.category.LAUNCHER 具体作用
转自:http://blog.csdn.net/jackrex/article/details/9189657 android.intent.category.LAUNCHER 具体有什么作用?我做一 ...
- angular.js ng-class-even ng-class-odd ng-cloak(没啥技术含量)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 基础_ _返回键back
============ 2, android中的back键处理 很多网友不明白,如何在Android平台上捕获Back键的事件. Back键是手机上的后退键,一般的软件不捕获相关信息可能导致你的程序 ...
- 利用jQuery和Ajax实现检测用户名是否已经被注册
这是一个jQuery和Ajax的很基础的应用,是我出去面试时的一个面试题.当时脑子有点懵想了好久才知道该怎么去实现,现在回来再看了下书好好总结一下这个东西. 首先新建一个html文件,只有简单的几行代 ...
- Python第十二章正则表达式(2)
1.前提是引入import re 匹配邮箱后缀需要写入r=r'\.com\.cn|\.com|\.cn' r=r'(\w+@\w+(\.com\.con|\.com|\.cn))'ll=re.find ...
- Android 常见问题收集 (持续更新)
gridview中设置item的高度. 一.BaseAdapter中的getView中设置 AbsListView.LayoutParams param = new AbsListView.Layou ...
- 29. Populating Next Right Pointers in Each Node && Populating Next Right Pointers in Each Node II
Populating Next Right Pointers in Each Node OJ: https://oj.leetcode.com/problems/populating-next-rig ...