利用AE编写切图工具的一些探讨
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。
1.前言
这周利用晚上在家时间研究了下如何使用AE来开发切图工具。最初的想法是直接调用GP服务,利用CreateMapServerCache 、ManageMapServerCacheTiles 和Geoprocessor 这样三个类来做。但是这个思路有个巨大的弊端就是必须先发布地图服务。于是接下来又马上转换思路,想能否通过瓦片选址算法以及AE的一些细粒度类来实现这个功能。在经过了三个晚上的算法编写和功能编写后,整个工具基本成型,其中包括了对算法的优化以及一些具体问题的解决。这里跟大家大致分享下。
2.切图的基本原理和实现
如果对瓦片和瓦片寻址的相关算法不熟悉的朋友,请参考我写的从底层探究WebGIS的原理系列:http://www.cnblogs.com/naaoveGIS/category/600559.html。
这里我直接给出所涉及到的几个公式。
2.1Resolution转换公式
resolution=scale*inch2centimeter/dpi。其中scale是地图比例尺,inch2centimeter为英寸转厘米的参数,dpi为1英寸所包含的像素。
2.2行列号获取公式
假设,地图切图的原点是(originX,oringinY),地图的瓦片大小是tileSize,地图屏幕上1像素代表的实际距离是resolution。计算坐标点(x,y)所在的瓦片的行列号的公式是:
col = floor((originX- x)/( tileSize*resolution))
row = floor((oringinY - y)/( tileSize*resolution))
2.3AGS瓦片的特点
本工具的目标是切出与AGS瓦片相同格式的瓦片。AGS的瓦片具有以下特点(在http://www.cnblogs.com/naaoveGIS/p/3903270.html我做了详细的讲解):
(a).L开头的代表了Level,R开头的代表了row,C开头的代表了Col。
(b). L后的数字是两位字符串,R后的是八位字符串,C后的也是八位字符串。
(c).英文后的数字均是16进制数,然后不足位数的用0补充。
2.3基于以上公式流程
我们首先获得用户输入的切图级别数组levelScaleArr,瓦片大小(imgWidth,imgHeight),切图原点(originX,originY)还有像素值DPI。同时我们还要通过接口获得此时地图的范围(dXMin,dYMin,dXMax,dYMax)。
流程的盒模型如下所示:

2.4实现
实现上,主要使用了AE做了这样几个功能:
(a).使用IMapControl类获得mxd的四角坐标。
(b).使用IActiveView、ExportPNGClass和EnvelopeClass实现将地图局部导出功能。
其他均按照上述流程图实现。
3.功能优化
3.1导出图片种类的优化
在AE中可以导出多种格式的图片。利用ExportJPEGClass(),ExportBMPClass(),ExportEMFClass(),ExportGIFClass()等即可实现。
3.2图片透明的优化
通过上面的类直接导出的图片其背景色默认为了白色。而AGS切图中,背景色是透明的,所以这里还要做一个图片透明度优化过程。C#中转成Bitmap后,利用该类自带的MakeTransparent即可实现。
4.算法的优化
4.1 缩小切图范围
在流程中,我们默认的切图是从切图原点开始的,这样会切成很多很多的无用图。我们可以直接从离地图DXmin和DYmax最近处开始切图即可。
startXByLevel = (int)Math.Abs((Math.Floor((DXmin-originX) / dImageWidth)));
startYByLevel = (int)Math.Abs((Math.Floor((originY-DYMax) / dImageHeight)));
startXByLevel和startYByLevel即为X轴和Y轴的切图初始点。
4.2不切无效图
我们经常会切出整张图都是透明的空白图。但是在AGS的切图中,是看不到这样的无效图的。我们可以在切图时先判断此范围内是否有要素存在,有的话就切,没有的话,continue掉。这样也可以减少切图的数目。
5.算法的进一步优化——支持经纬度地图切图
目前上面的所有过程,均只对做了投影转换的mxd有效,但是如果我们的mxd中的坐标系无投影转换只有一个地理坐标系呢,也就是当地图为经纬度坐标时,此时该如何实现切图?
其实思路也很简单,如果我们真正理解以上resolution的所代表实际意义,那么解决这个问题的思路就应该有了。
当地图为经纬度时,我们切图的比例尺设置应该改为切图的分辨率设置。这样我们就直接得到了每个级别的resolution,然后用resolution来切图即可。不用再做以上的将比例尺转换为resolution的步骤。
6.注意
在levelScaleArr中,里面的比例尺数字是随着index增加而增加的,但是比例尺数字越大,其对应的Level是越小的。所以我们在遍历Level层时,应该是一个递减的遍历,这样生成的L文件夹的编号才是正确的。
7.效果图
以下是效果图:

8.不足
(a).目前无法切出紧凑型(Compact)瓦片。解决思路,用上面的方法导出图后,需要把图变成二进制然后按照bundle的格式重新生成,并且还要生成索引文件bundleX。
(b).所用的AE毕竟是封装的很好的组件库了。用GDAL的话,由于封装层次低一些,效率应该会更好一些。
-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/
如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

利用AE编写切图工具的一些探讨的更多相关文章
- 瓦片切图工具gdal2tiles.py改写为纯c++版本
gdal2tiles.py是GDAL库中用于生成TMS瓦片的python代码,支持谷歌墨卡托EPSG:3857与经纬度EPSG:4326两种瓦片,输出png格式图像. gdal2tiles.py Mo ...
- Cutterman - 最好用的切图工具
Cutterman - 最好用的切图工具 http://www.cutterman.cn/zh/cutterman
- AGS Server 10.1 切图工具
在AGS Sever中很重要的功能就是地图缓存的制作,安装AGS Sever会在catalog中增加相关的工具箱,利用这些工具可以制作.删除.更新切片 一.Convert map server cac ...
- 利用PS自动切图、支持svg且支持icoMoon——再也不用四处去转格式了
今天想导出svg格式的图片支持webFont,结果AI打不开了,文件好像损坏了,于是就想办法在PS里面导出. 网上搜索到一篇文章,腾讯的 http://isux.tencent.com/ps-phot ...
- PS切图工具
缓存设置: 编辑-首选项-暂存盘 改完除了C盘之外的其他盘 单位设置: 编辑-首选项-单位与标尺 将单位修改成像素 PS预设: 工具 (窗口-工具) 标尺 (视图-标尺) 图层 (窗口-图层 ...
- 瓦片切图工具gdal2tiles.py改写为纯c++版本(二)
python这么火,C++/C#的程序员都生存不下去了,为啥还要干把python转写成c++的这种反动的事? 项目需要呗... gdal2tiles.py文件中有两个类是计算全球墨卡托与WGS84两种 ...
- Assistor PS 切图工具的使用说明。
一.如何运行Assistor PS 使用这个Assistor PS 软件有一个最最重要的条件,那就是:你要打开你的Photoshop (官方建议版本在CS 3以上) 下载-安装-运行. 运行成 ...
- sketch最强切图工具Sketch Measure
https://www.inpandora.com/sketch-measure.html https://www.jianshu.com/p/c11ae88e6b1d
- 页面制作部分之PS切图
页面制作部分之PS切图 <--本标签下,通过页面制作.页面架构.javascript程序设计.DOM编程艺术.产品前端架构五部分来分享总结笔记,总结笔记会陆续分享--> 网页设计在技术层面 ...
随机推荐
- js实现div居中
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- FreeMarker中文API手册(完整)
FreeMarker概述 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用 ...
- select2的相关问题
在弹出框中无法使用select2的问题: 通常情况下,使用select2只需要在加载相关js和css后,添加如下代码即可: $("#selectId").select2(); 但如 ...
- VB.Net 2010中 ./和../的含义
文件路径 文件路径就是文件在电脑(服务器)中的位置,表示文件路径的方式有两种:相对路径和绝对路径. Windows由于使用 斜杆/ 作为DOS命令提示符的参数标志了,为了不混淆,所以采用 反斜杠\ 作 ...
- easyUI datagrid 根据查询条件 选中对应数据的行
开始 输入了 土豆,南瓜,再次是小青菜,每次输入点击搜索的时候(模糊查询),选中的当前数据对应的行 在做之前,在网上查询了许多资料,也在技术群里问过许多次,弄了好久终于好了. 第一次写博客真不知道写啥 ...
- jdk 配置环境变量 解决无法加载主类问题
默认安装路径 我的电脑鼠标右键→属性→点击“高级”选项卡点击“环境变量” 系统环境 点击“新建”变量名:JAVA_HOME 变量值:C:\Program Files\Java\jdk1.7.0(以JD ...
- TaintDroid剖析之File & Memiry & Socket级污点传播
TaintDroid剖析之File & Memiry & Socket级污点传播 作者:简行.走位@阿里聚安全 1.涉及到的代码文件 TaintDroid在File, Memory以及 ...
- VVDocumenter 使用
函数说明文档插件下载链接 https://github.com/onevcat/VVDocumenter-Xcode 下载后,直接运行项目 升级Xcode后可能不能再次使用,需要做一些处理从Xcode ...
- [python] 安装numpy+scipy+matlotlib+scikit-learn及问题解决
这篇文章主要讲述Python如何安装Numpy.Scipy.Matlotlib.Scikit-learn等库的过程及遇到的问题解决方法.最近安装这个真是一把泪啊,各种不兼容问题和报错,希望文章对你有所 ...
- 《像计算机科学家一样思考Java》—— 读后总结
本书属于入门级的Java书籍,与其他的向编程思想.核心技术不同的是,这本书不是按部就班的讲解java变成知识,而是随着语言的深入慢慢增加知识点. 这本书以一个语言开发者的角度,深入浅出的讲解了Java ...