应用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)所在的瓦片的队列号的公式是:

88bifa必发娱乐,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,dX马克斯,dY马克斯)。

   流程的盒模型如下所示:

       88bifa必发娱乐 1            

  

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.效果图

以下是效益图:

 88bifa必发娱乐 2

8.不足

(a).如今无法切出紧凑型(Compact)瓦片。解决思路,用地点的方式导出图后,要求把图变成二进制然后按照bundle的格式重新生成,并且还要生成索引文件bundleX。

(b).所用的AE毕竟是包裹的很好的零部件库了。用GDAL的话,由于包裹层次低一些,效用应该会更好有的。

 

                                                               
 —–欢迎转发,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

                                                                          
假如你认为本文确实协助了你,可以微信扫一扫,进行小额的打赏和鼓励,谢谢
^_^

                                    88bifa必发娱乐 3

相关文章