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

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

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

后记:之后找到了一个更加方便的方法,看博客:利用PBS的发布地图服务

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

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

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

3、按钮点击事件

  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. //调用
  4. TilesBounds tilesBounds = new TilesBounds();
  5. tilesBounds.minCol = ;
  6. tilesBounds.maxCol = ;
  7. tilesBounds.minRow = ;
  8. tilesBounds.maxRow = ;
  9. //计算切片个数
  10. int num = (tilesBounds.maxCol - tilesBounds.minCol) * (tilesBounds.maxRow - tilesBounds.minRow);
  11. progressBar1.Maximum = num * ;
  12. progressBar1.Step = ;
  13.  
  14. label3.Text = num.ToString();
  15. tilesBounds.zoomLevel = ;
  16. string outPutFileName = "f:\\18.png";
  17. string tilePath = @"C:\data\titledata\";
  18. CombineTiles(tilesBounds, tilePath, outPutFileName);
  19. MessageBox.Show("拼接完成");
  20. }

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

  1. int a = ;//用于显示进度条
  2. ////将单个切片的像素值赋值给拼接后的图片
  3. private void SaveBitmapBuffered(Bitmap mainbit, string bmppath, int x, int y)
  4. {
  5. a++;
  6. progressBar1.Value = a;
  7. x = x * ;
  8. y = y * ;
  9. label4.Text = a.ToString();
  10. Application.DoEvents();
  11. Bitmap bt = new Bitmap(bmppath);
  12. for (int i = ; i <; i++)
  13. {
  14. for (int j =; j <; j++)
  15. {
  16. mainbit.SetPixel(x + i, y + j, bt.GetPixel(i,j));
  17. }
  18. }
  19. }

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

  1. /// <summary>
  2. /// 遍历瓦片
  3. /// </summary>
  4. private void CombineTiles(TilesBounds tilesBounds, string tilePath, string outPutFileName)
  5. {
  6. if (File.Exists(outPutFileName))
  7. {
  8. File.Delete(outPutFileName);
  9. }
  10. int imageWidth = * (tilesBounds.maxCol - tilesBounds.minCol + );
  11. int imageHeight = * (tilesBounds.maxRow - tilesBounds.minRow + );
  12. Bitmap memoryimg = new Bitmap(imageWidth, imageHeight);//设置拼接后的图片大小,注意:如果图片很大,需要将程序设置成64位
  13. for (int col = tilesBounds.minCol; col <= tilesBounds.maxCol; col++)
  14. {
  15. for (int row = tilesBounds.minRow; row <= tilesBounds.maxRow; row++)
  16. {
  17. try
  18. {
  19. string sourceFileName = tilePath + tilesBounds.zoomLevel.ToString() + "\\" + col.ToString() + "\\" + row.ToString() + ".png";
  20. if (File.Exists(sourceFileName))
  21. {
  22. SaveBitmapBuffered(memoryimg, sourceFileName, col - tilesBounds.minCol, row - tilesBounds.minRow);
  23. }
  24. else
  25. {
  26. Console.WriteLine("不存在:" + sourceFileName);
  27. }
  28. }
  29. catch (Exception ex)
  30. {
  31. MessageBox.Show(ex.ToString());
  32. }
  33. }
  34. }
  35. memoryimg.Save(outPutFileName);//保存合并后的图片
  36. memoryimg.Dispose();
  37. }

6、TilesBounds类

  1. class TilesBounds
  2. {
  3. public int minCol { get; set; }
  4. public int maxCol { get; set; }
  5. public int minRow { get; set; }
  6. public int maxRow { get; set; }
  7. public int zoomLevel { get; set; }
  8. }

7、拼接效果如下:

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

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

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

  1. 从底层谈WebGIS 原理设计与实现(六):WebGIS中地图瓦片在Canvas上的拼接显示原理

    从底层谈WebGIS 原理设计与实现(六):WebGIS中地图瓦片在Canvas上的拼接显示原理 作者:naaoveGI…    文章来源:naaoveGIS    点击数:1145    更新时间: ...

  2. Python爬取地图瓦片

    由于要在内网开发地图项目,不能访问在线的地图服务了,就想把地图瓦片下载下来,网上找了一些下载器都是需要注册及收费的,否则下载到的图都是打水印的,如下: 因为地图瓦片就是按照层级.行.列规则组织的一张张 ...

  3. 五分钟学GIS | 快速生成地图瓦片秘籍

    什么是地图瓦片? 地图瓦片是包含了一系列比例尺.一定地图范围内的地图切片文件.地图瓦片按照金字塔结构组织,每张瓦片都可通过级别.行列号唯一标记.在平移.缩放地图时,浏览器根据金字塔规则,计算出所需的瓦 ...

  4. 百度地图瓦片原理 | 百度map使用教程

    百度地图瓦片原理: http://blog.csdn.net/mygisforum/article/details/22997879 百度map使用教程: http://www.myexception ...

  5. MBTiles地图瓦片管理工具

    采用C#+GMap.NET+MBTiles数据库来实现. 具有以下功能: 1)  支持单个文件追加到mbtiles数据库. 2)  支持批量导入Google切片组织的地图瓦片. 3)  支持直接对MB ...

  6. 使用Nodejs+mongodb开发地图瓦片服务器

    原先地图瓦片服务器采用的是arcgisserver发布的地图服务并进行切片,但ags发布的地图服务很占内存,发布太多的话服务器压力很大.再一个就是ags价太高了. 学习Nodejs之后,发现这是一个可 ...

  7. 天地图使用过程中由于display:none导致加载部分地图瓦片失败

    在为按钮添加点击事件让地图显示的时候,初始加载未加载到当前页面尺寸的所有地图瓦片,在display:none之后停止加载地图,所以display:none属性去掉,改为dom解析完成之后$('#map ...

  8. nginx在代理转发地图瓦片数据中的应用

    最近有这样一个需求,需要将arcgis server发布的地图瓦片放在移动硬盘中,系统演示的时候,直接调用本地的地图瓦片,而非远程的,主要是为了系统演示的时候加快地图访问速度. 而且需要在任意电脑运行 ...

  9. 翻译:Bing地图瓦片体系

    Bing Maps Tile System Bing地图瓦片体系 原文链接:http://msdn.microsoft.com/en-us/library/bb259689.aspx Bing Map ...

随机推荐

  1. 黑马程序员——JAVA基础之编码表

    ------- android培训.java培训.期待与您交流! --------- 字符编码  字符流的出现为了方便操作字符.  更重要是的加入了编码转换.  通过子类转换流来完成. •  I ...

  2. Android控件之SlidingDrawer(滑动式抽屉)详解与实例

    SlidingDrawer效果想必大家也见到过,它就是1.5模拟器上进入应用程序列表的效果.下面是截图 一.简介 SlidingDrawer隐藏屏外的内容,并允许用户通过handle以显示隐藏内容.它 ...

  3. python中使用xlrd、xlwt操作excel表格详解

    python读excel——xlrd 这个过程有几个比较麻烦的问题,比如读取日期.读合并单元格内容.下面先看看基本的操作: 首先读一个excel文件,有两个sheet,测试用第二个sheet,shee ...

  4. [转]理解android.intent.category.LAUNCHER 具体作用

    转自:http://blog.csdn.net/jackrex/article/details/9189657 android.intent.category.LAUNCHER 具体有什么作用?我做一 ...

  5. angular.js ng-class-even ng-class-odd ng-cloak(没啥技术含量)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. 基础_ _返回键back

    ============ 2, android中的back键处理 很多网友不明白,如何在Android平台上捕获Back键的事件. Back键是手机上的后退键,一般的软件不捕获相关信息可能导致你的程序 ...

  7. 利用jQuery和Ajax实现检测用户名是否已经被注册

    这是一个jQuery和Ajax的很基础的应用,是我出去面试时的一个面试题.当时脑子有点懵想了好久才知道该怎么去实现,现在回来再看了下书好好总结一下这个东西. 首先新建一个html文件,只有简单的几行代 ...

  8. Python第十二章正则表达式(2)

    1.前提是引入import re 匹配邮箱后缀需要写入r=r'\.com\.cn|\.com|\.cn' r=r'(\w+@\w+(\.com\.con|\.com|\.cn))'ll=re.find ...

  9. Android 常见问题收集 (持续更新)

    gridview中设置item的高度. 一.BaseAdapter中的getView中设置 AbsListView.LayoutParams param = new AbsListView.Layou ...

  10. 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 ...