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 ...
随机推荐
- 每日学习心得:SharePoint 2013 自定义列表项添加Callout菜单项、文档关注、SharePoint服务端对象模型查询
前言: 前一段时间一直都比较忙,没有什么时间进行总结,刚好节前项目上线,同时趁着放假可以好好的对之前遇到的一些问题进行总结.主要内容有使用SharePoint服务端对象模型进行查询.为SharePoi ...
- 调Windows 7的图片浏览器查看图片
public static void viewPicFromWindows(string pPicPath) { if (pPicPath!="" && Syste ...
- SSIS 项目部署模型
微软 BI 系列随笔 - SSIS 2012 基础 - SSIS 项目部署模型 关于部署 SSIS 2012 支持两种部署模型:项目部署模型和包部署模型. 使用项目部署模型可以将项目部署到 Integ ...
- Asp.net中WebForm 与 MVC的架构区别
ASP.NET Webform 后台代码(behind code) 这种behind code 模式有5个问题,我们用MVC的设计思想来分别解决这些问题 1.基于视图的方案来解决基于行为的需求 从上图 ...
- mac 10.9开启有道词典取词功能
取词时候,有道词典给出提示,说要去开启辅助功能,但提示的是在mac 10.8上面怎么操作,在10.9的话,就是以下位置去改了. 补充以下: 在mac机器上,实际上大多数的单词都能从自带的词典中查找到. ...
- 【AT91SAM3S】建立基于SAM3S库的工程并点亮LED
习惯了ST的库,猛然间看到ATMEL的库,有点无从下手.这几天参考这示例工程,终于建立了一个使用ATMEl库的工程. 软件库版本: 软件平台:MDK470A 硬件平台:英蓓特 EB-SAM3S MCU ...
- Android学习笔记(八)
android中常见空间的使用方法 1.TextView TextView主要用于在界面上显示一段文本信息,如下面代码所示: <LinearLayout xmlns:android=" ...
- view坐标_ _ Android应用坐标系统全面详解
转:http://blog.csdn.net/yanbober/article/details/50419117 1 背景 去年有很多人私信告诉我让说说自定义控件,其实通观网络上的很多博客都在讲各种自 ...
- oracle两列相同的去重
源地址:https://zhidao.baidu.com/question/66722841.html 1.不含大字段(clob等)的表格: 1 2 3 4 5 6 7 8 9 --例子表格:crea ...
- Linux批量更改文件后缀名
一.rename解决 1. Ubuntu系统下 rename 's/\.c/\.h/' ./* 把当前目录下的后缀名为.c的文件更改为.h的文件 2. CentOS5.5系统下 rename . ...