文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处: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编写切图工具的一些探讨的更多相关文章

  1. 瓦片切图工具gdal2tiles.py改写为纯c++版本

    gdal2tiles.py是GDAL库中用于生成TMS瓦片的python代码,支持谷歌墨卡托EPSG:3857与经纬度EPSG:4326两种瓦片,输出png格式图像. gdal2tiles.py Mo ...

  2. Cutterman - 最好用的切图工具

    Cutterman - 最好用的切图工具 http://www.cutterman.cn/zh/cutterman

  3. AGS Server 10.1 切图工具

    在AGS Sever中很重要的功能就是地图缓存的制作,安装AGS Sever会在catalog中增加相关的工具箱,利用这些工具可以制作.删除.更新切片 一.Convert map server cac ...

  4. 利用PS自动切图、支持svg且支持icoMoon——再也不用四处去转格式了

    今天想导出svg格式的图片支持webFont,结果AI打不开了,文件好像损坏了,于是就想办法在PS里面导出. 网上搜索到一篇文章,腾讯的 http://isux.tencent.com/ps-phot ...

  5. PS切图工具

    缓存设置: 编辑-首选项-暂存盘 改完除了C盘之外的其他盘 单位设置: 编辑-首选项-单位与标尺 将单位修改成像素  PS预设: 工具   (窗口-工具) 标尺  (视图-标尺) 图层  (窗口-图层 ...

  6. 瓦片切图工具gdal2tiles.py改写为纯c++版本(二)

    python这么火,C++/C#的程序员都生存不下去了,为啥还要干把python转写成c++的这种反动的事? 项目需要呗... gdal2tiles.py文件中有两个类是计算全球墨卡托与WGS84两种 ...

  7. Assistor PS 切图工具的使用说明。

    一.如何运行Assistor PS   使用这个Assistor PS 软件有一个最最重要的条件,那就是:你要打开你的Photoshop (官方建议版本在CS 3以上)   下载-安装-运行. 运行成 ...

  8. sketch最强切图工具Sketch Measure

    https://www.inpandora.com/sketch-measure.html https://www.jianshu.com/p/c11ae88e6b1d

  9. 页面制作部分之PS切图

    页面制作部分之PS切图 <--本标签下,通过页面制作.页面架构.javascript程序设计.DOM编程艺术.产品前端架构五部分来分享总结笔记,总结笔记会陆续分享--> 网页设计在技术层面 ...

随机推荐

  1. Centos 6.5 部署 redmine 3.3

    验证ruby版本 如果有就卸载安装最新的 yum install gcc* openssl openssl-devel -y wget https://ruby.taobao.org/mirrors/ ...

  2. 谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC

    Google 刚刚开源了grpc,  一个基于HTTP2 和 Protobuf 的高性能.开源.通用的RPC框架.Protobuf 本身虽然提供了RPC  的定义语法,但是一直以来,Google 只开 ...

  3. (新年快乐)ABP理论学习之本地化(2016第一篇)

    返回总目录 本篇目录 应用语言 本地化资源 获取本地化文本 扩展本地化资源 最佳实践 应用语言 一个应用至少有一种UI语言,许多应用不止有一种语言.ABP为应用提供了一个灵活的本地化系统. 第一件事情 ...

  4. Unit Testing with NSubstitute

    These are the contents of my training session about unit testing, and also have some introductions a ...

  5. CVTE实习求职经历

    今天,听到有好多同学最近要去面试CVTE这家企业,于是呢,准备将自己的经历写上来,给大家一个参考,希望能够大家一次帮助. 一.整体感觉 首先呢,先讲一下我个人对这家企业的整体感觉吧. 1. 第一次 对 ...

  6. 分享一个css3写的气泡对话框,适合于即时通讯和留言本的动态内容

    效果预览: css code .message_content{width:100%;margin-top:10px;clear:both;float:left;} .face{float:left; ...

  7. 跟我一起数据挖掘(22)——spark入门

    Spark简介 Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行,Spark,拥有Hadoop MapReduce所具有的优点:但不同于MapR ...

  8. iOS----集成ijkplayer视频直播

    ijkplayer 是一款做视频直播的框架, 基于ffmpeg, 支持 Android 和 iOS, 网上也有很多集成说明, 但是个人觉得还是不够详细, 在这里详细的讲一下在 iOS 中如何集成ijk ...

  9. Spring MVC和CXF集成

    前提: 1.spring mvc环境已搭建好,能跑起来. 2.下载apache-cxf-2.7.3.zip的压缩包,解压apache-cxf-2.7.3.zip压缩包,拷贝如下几个jar包即可. 配置 ...

  10. sublime text3同时编辑多行

    sublime text3同时编辑多行 下面的才是正确的姿势,之前一直是shift + 右键 拖啊. http://stackoverflow.com/questions/32127604/how-t ...