AutoCAD数据自动创建ArcGIS“地图瓦片”服务的方法研究
2016-01-26谭仁春
洪 涛,谭仁春,李 宁
(昆明市测绘研究院,云南 昆明 650051)
Study on the Creating Tile Caches of ArcGIS Based on the Geo-spatial
Data from AutoCAD
HONG Tao,TAN Renchun,LI Ning
AutoCAD数据自动创建ArcGIS“地图瓦片”服务的方法研究
洪涛,谭仁春,李宁
(昆明市测绘研究院,云南 昆明 650051)
Study on the Creating Tile Caches of ArcGIS Based on the Geo-spatial
Data from AutoCAD
HONG Tao,TAN Renchun,LI Ning
摘要:随着AutoCAD在各行各业应用的普及及WebGIS应用需求的不断扩大,将DWG等格式的地理空间数据处理成WebGIS常用的ArcGIS“地图瓦片”服务已成为GIS开发及数据处理人员经常遇到的一项任务。传统的处理方式不仅过程复杂,需要花费大量的人力和物力,而且常常存在符号丢失等问题。本文根据ArcGIS“地图瓦片”创建与文件存储组织规则,通过AutoCAD二次开发语言ObjectARX进行了二次开发,直接在AutoCAD下实现了“地图瓦片”的创建,极大提高了AutoCAD格式的地理空间数据创建“地图瓦片”服务的效率,节省了人力和物力。应用实践表明,本文中的方法具有很高的应用价值。
关键词:地图瓦片;地图缓存;ArcGIS;DWG数据
一、引言
随着计算机网络技术、GIS技术的快速发展,WebGIS已经成为目前GIS系统的主要形式。传统的WebGIS对于客户端提交的请求,通常利用实时计算模式向客户端反馈数据,如在ArcIMS地图发布平台下,由客户端提交地图请求,通过ArcXML与服务器端通信,服务器端接收客户端提交的各项参数,实时计算生成客户端用户请求的图形,再通过ArcXML反馈给客户端[1]。但由于GIS中需要访问或处理的地理空间数据通常是海量的,即使是采用目前的高速宽带网络,上述数据处理与传输方式也常常需要客户每次对自己的“地图平移”“地图缩放”等操作请求等待较长甚至难以忍受的响应时间。数据传输与浏览速度较慢曾一度成了WebGIS推广应用的重要瓶颈。
为了解决网络环境下WebGIS访问海量地理空间数据速度十分缓慢的问题,地图缓存技术应运而生。地图缓存技术(通俗的说法为“瓦片”技术),就是按照一定的数学规则,把地图切成一定规格的小图片集保存到服务器上。当用户通过客户端浏览器访问地图服务时,不是由服务器实时创建一幅图片来送到客户端,而是服务器直接返回当前地图坐标区域所对应的小“瓦片”后在客户端拼接成地图,这样就可以通过降低服务器负担来极大提升地图浏览的速度[2-3]。目前,越来越多的地图服务网站(如Google Maps、Microsoft Live Map、Mapbar、SogouMap、MapABC 等)都采用了这种技术来提高地图访问的速度。ArcGIS“地图瓦片”服务就是采用地图缓存技术的一种空间数据服务方式,其支持的服务标准有WMS、WCS等。目前,它已成为WebGIS中最为常用的一种地图服务形式。
AutoCAD以其功能强大、操作简便等特点,早已成为国内外各设计领域采用最为广泛的一种图形设计软件。这也使得目前大量需要在WebGIS下发布共享的地理空间数据(如城市总规、控规、详规、专项规划等数据)是以AutoCAD的DWG文件的形式存在。由于数据格式与符号化的差异,为了保证信息不丢失,目前,由DWG数据创建地图服务需要进行复杂的数据格式转换与符号化处理等工作,即需要先将DWG数据按图层进行数据格式转换,转换成ArcGIS的标准数据格式,然后再对各个数据图层进行符号化。当DWG数据量较大时,这种处理方式效率极低,而且还有可能存在信息丢失的可能。
为了解决AutoCAD形式的地理空间数据生成ArcGIS“地图瓦片”服务所面临的转换处理较复杂的问题,本文基于AutoCAD二次开发语言ObjectARX进行二次开发,实现AutoCAD下由地理空间数据自动创建ArcGIS“地图瓦片”服务。实践表明,本文中的方法无须进行数据格式转换、数据规范化处理与复杂的符号化过程,可以由AutoCAD数据一步自动完成ArcGIS“地图瓦片”服务的创建。
二、ArcGIS“地图瓦片”创建与文件存储组织规则
ArcGIS地图“瓦片”创建与文件存储组织规则为:无论哪一级ArcGIS地图“瓦片”切片,每张小图片都是长宽相同,且大小为2N像素的正方形网格;每一级切片都有一个相同的切片起始点(该起始点被简称TSO,即为图1中的A点);由于每一级切图比例尺不同,因此不同级别的瓦片对应的实地大小范围不同;每一级切片都以TSO为起点,按照该级图片对应的实地长宽进行行列编号,但地图实际切片范围为空间数据的最大范围(切片原理如图1所示);所有的切片文件都以文件的方式存储,一个切片服务对应一个文件夹(简称“服务总文件夹”),文件夹以地图服务名命名;“服务总文件夹”下存放一个子文件夹(简称“地图文档框架文件夹”),该文件夹命名与地图服务对应的地图文档框架名一致;“地图文档框架文件夹”下存放一个命名为“_allayers” 的子文件夹和一个名为conf.xml的配置文件;conf.xml文件记录该切片服务的切片信息,主要包括:切图的起始点坐标、各级切片的比例尺、瓦片的图片格式、瓦片大像素大小、地图数据的空间参考系,如地图投影、坐标系等[4-5]。
图1 ArcGIS瓦片切片原理
“_allayers”文件夹下存放一系列子文件夹,每个子文件夹对应一级切片,每个子文件夹的命名为“LXX”,第1级切片对应的子文件夹为L00,第2级切片对应的子文件夹为L01,依次类推;每个LXX文件夹下还包含一系列子文件夹,每个子文件夹对应一行的切片,文件夹命名以“R”开头,后面加上一个8位长度的数字字符串。该8位长的字符串是对应的瓦片行号的16进制数值。如果不足8位,左边加0补齐,如第29行对应的子文件夹命名为R0000001d。每个R文件夹下存放该行切片的瓦片文件。每个瓦片文件以字母C开头,后面加上一个8位长度的数字字符串。该8位长的字符串是对应的瓦片列号的16进制数值。如果不足8位,左边加0补齐。如第26行第29列瓦片为“...R0000001aC0000001d.png”。地图瓦片的数据组织与命名方式如图2所示。
图2 ArcGIS瓦片文件组织与命名方式
三、AutoCAD下自动创建ArcGIS“地图瓦片”服务的方法
1. 主要实现原理与思路
本文提出的AutoCAD下地理空间数据自动创建ArcGIS“地图瓦片”服务的方法主要基于AutoCAD二次开发语言ObjectARX进行二次开发来实现。其主要思路是:用户首先指定创建地图瓦片服务的坐标原点TSO(x0,y0)、切图级数N及每一级的切图比例尺(1∶M0)、图片的大小L0×L0(单位为像素)、图片的屏幕分辨率d0(单位DPI);然后基于ArcGIS“地图瓦片”存储组织规则,在AutoCAD下按照切图比例尺从小到大的顺序自动为每个级别建立一个瓦片文件夹,第1级文件夹命名L00,第2级文件夹命名L01,依次类推。计算每一个切图级别下所有图片的左下角坐标点Pl与右上角坐标点Pr,采用AutoCAD的图片打印输出功能,将(Pl,Pr)对应的矩形框范围打印成小图片,按照图片所在的行列号及ArcGIS瓦片文件组织与命名方式进行命名。最后将生成的小图片保存到其对应级别的缓存文件夹中即可。
如果切图比例尺为1∶M0、每个图片的大小L0×L0(单位为像素)、图片的屏幕分辨率d0(单位DPI),则该切图比例尺下,每个图片对应的实地大小为L1×L1,L1(单位为m)为
L1=(0.025 4 M0·L0)/d0
则第i行第j(行列号从0开始编号)图片的左下角点的坐标P1(X1,Y1)与右上角点的坐标P2(X2,Y2)分别为
式中,(x0,y0)为创建地图瓦片服务的起始坐标原点TS0,如图1的左上角点A。
2. 主要实现代码
(1) 判断当前待打印图片范围内有无图形要素
由于程序创建地图瓦片是从点TS0开始的,为了提高地图瓦片生成的效率,并减少空白图片。当生成每个小瓦片时,需要判断该瓦片范围内有无要素,如果没有,就不生成,否则就生成。部分代码如下:
ads_point pt1,pt2;
ads_name ssnamefilter;
long length;
pt1[X] = X1;pt1[Y] = Y1;
pt2[X] = X2;pt2[Y] = Y2;
acedSSGet(_T("C"),pt1,pt2,NULL,ssnamefilter);
acedSSLength(ssnamefilter,&length);
(2) 设置打印窗口
如果当前范围内有要素,则设置打印窗口,打印生成对应的小瓦片。
AcDbObjectId layoutId;
layoutId=pBTR->getLayoutId();
AcDbLayout*pLayout=NULL;
acdbOpenObject(pLayout,layoutId,AcDb::kForRead);
AcDbPlotSettingsValidator*pPSV;
pPSV=(AcDbPlotSettingsValidator*)acdbHostApplicationServices()->plotSettingsValidator();
AcDbPlotSettings *pPlotSettings;
pPlotSettings=newAcDbPlotSettings(pLayout->modelType());
pPlotSettings->copyFrom(pLayout);
……
pPSV->setPlotWindowArea(pPlotSettings,X1, Y1, X2, Y2);
pPSV->setPlotType(pPlotSettings,PlotType::kWindow);
pPSV->setPlotOrigin(pPlotSettings,X1, Y1);
(3) 驱动打印,生成小瓦片
AcPlPlotEngine*pEngine=NULL;
……
const TCHAR*szDocName=acDocManager->curDocument()->fileName();
pEngine->beginDocument(plotInfo, szDocName, NULL, 1, true, goalFile);
……
pEngine->beginPage(pageInfo, plotInfo, true);
pEngine->beginGenerateGraphics();
pEngine->endGenerateGraphics();
(4) 小瓦片命名保存
根据当前小瓦片所在的行列号,以及ArcGIS瓦片文件组织与命名方式对当前小瓦片进行命名。最后将生成的小瓦片保存到其对应级别的缓存文件夹中。
当所有级别的瓦片全部生成完毕后,就可以通过ArcGIS创建一个空的“地图瓦片”服务,最后将AutoCAD下生成的地图瓦片文件拷贝到ArcGIS Server缓存目录下替换这个空的“地图瓦片”缓存文件夹,这样就实现了AutoCAD格式的地理空间数据自动创建ArcGIS“地图瓦片”服务。
四、结束语
目前,在GIS开发及数据处理过程中,经常需要将AutoCAD格式的地理空间数据处理成ArcGIS“地图瓦片”服务。本文针对这一需求及传统处理方式存在的问题,同时结合ArcGIS“地图瓦片”创建与文件存储组织规则,提出了在AutoCAD中直接由AutoCAD格式的地理空间数据创建“地图瓦片”服务的方法。应用实践表明,本文方法极大提高了AutoCAD格式的地理空间数据创建“地图瓦片”服务的效率,节省了人力和物力,值得大力推广。
参考文献:
[1]李海亭,费立凡,彭清山,等.预生成思想在地理信息服务中的应用研究[J]. 测绘信息与工程,2009,34(1):31-32.
[2]王强.分布式WebGIS地图缓存策略的应用研究[J].软件导刊,2008(5):16-18.
[3]马维峰,王晓蕊,高松峰,等.基于服务器动态缓存和Ajax技术的WebGIS开发[J].测绘科学,2008,33(5):204-205.
[4]郭明武,彭清山,李黎.ArcGIS Server中地图瓦片实时在线局部更新方法研究[J]. 测绘通报,2012(2):35-38.
[5]ArcGIS Server大数据量地图服务影像缓存建立方法初探[EB/OL].[2015-01-28].http:∥www.cnblogs.com/lovekitty/archive/2009/03/27/1423279.html.
[6]周婷婷.电子地图局部更新方法研究[J]. 地理空间信息,2014,12(4):162-163.
[7]孙伟,李志庆,焦孟凯,等. 瓦片地图动态缓存中间件的优化设计及实现[J]. 测绘通报, 2014(1): 37-40.
[8]周沛.智能交通系统中的瓦片地图技术研究与应用[D].上海:同济大学, 2008.引文格式: 胡应龙,陈杰. NoSQL空间数据管理在省级水利数据共享服务平台中的应用[J].测绘通报,2015(12):88-92.DOI:10.13474/j.cnki.11-2246.2015.387
作者简介:洪涛(1971—),女,高级工程师,研究方向为地理信息系统。E-mail: 940857079@qq.com
收稿日期:2015-01-28
中图分类号:P208
文献标识码:B
文章编号:0494-0911(2015)12-0085-03
引文格式: 洪涛,谭仁春,李宁. AutoCAD数据自动创建ArcGIS“地图瓦片”服务的方法研究[J].测绘通报,2015(12):85-87.DOI:10.13474/j.cnki.11-2246.2015.386