为了在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#拼接地图瓦片的更多相关文章

  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. Python 100道题深入理解

    # -*- coding: utf-8 -*-# 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?# 程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所 ...

  2. 自动选中div中的文字

    <html> <head> <title></title> <script type="text/javascript" de ...

  3. win10-golang环境变量设置

    安装go 打开环境变量 添加GOPATH 添加到path 检验 在命令指示符下->go version or go env 配置 在F:\GOPATH下放置C:\go\bin->新建pkg ...

  4. 在命令行中通过adb shell am broadcast发送广播通知

    通过命令行执行adb shell am broadcast发送广播通知. adb shell am broadcast 后面的参数有:[-a <ACTION>][-d <DATA_U ...

  5. SQLLite 学习笔记

    1.SQLLite 简介 2.命令行使用 3.常用GUI管理工具

  6. Tomcat 使用apr优化

    最近业务服务器出现了一些问题,Nginx傲娇了,准备把加Nginx插件上的一些处理逻辑扔到后端的Tomcat的业务处理里面去,考虑到tomcat目前本来就压力山大,所以弄了弄apr库来优化tomcat ...

  7. boost::asio::socket tcp 连接 在程序结束时崩溃。

    刚开始的时候一直不知道怎么回事,不过幸好我有在每个class 的析构时都打印一条信息. 这个时候发现我的一个tcp_connection (就是自定义的一个连接类) 在最后才被析构. 所以感觉这里可能 ...

  8. Chap6: question 46 - 48

    46. 求 1+2+ … +n. 要求:不用乘除法.for.while.if.else.switch.case 以及条件判断语句(A?B:C). a. 利用构造函数求解 #include <io ...

  9. AtomicInteger

    原子量和普通变量相比,主要体现在读写的线程安全上.对原子量的写是原子的,由CAS操作保证原子性.对原子量的读可以读到最新值,由volatile关键字来保证可见性. ublic class Atomic ...

  10. submit异步提交 回调的方法

    背景: mvc模式下,当submit表单的时候,后台Control自动绑定Model类,但是如果不用submit来提交,改用ajax提交的时候,后台Control无法获取前台form表单内相应Name ...