洪 濤,譚仁春,李 寧
(昆明市測繪研究院,云南 昆明 650051)
Study on the Creating Tile Caches of ArcGIS Based on the Geo-spatial
Data from AutoCAD
HONG Tao,TAN Renchun,LI Ning
?
AutoCAD數(shù)據(jù)自動創(chuàng)建ArcGIS“地圖瓦片”服務(wù)的方法研究
洪濤,譚仁春,李寧
(昆明市測繪研究院,云南 昆明 650051)
Study on the Creating Tile Caches of ArcGIS Based on the Geo-spatial
Data from AutoCAD
HONG Tao,TAN Renchun,LI Ning
摘要:隨著AutoCAD在各行各業(yè)應(yīng)用的普及及WebGIS應(yīng)用需求的不斷擴(kuò)大,將DWG等格式的地理空間數(shù)據(jù)處理成WebGIS常用的ArcGIS“地圖瓦片”服務(wù)已成為GIS開發(fā)及數(shù)據(jù)處理人員經(jīng)常遇到的一項任務(wù)。傳統(tǒng)的處理方式不僅過程復(fù)雜,需要花費大量的人力和物力,而且常常存在符號丟失等問題。本文根據(jù)ArcGIS“地圖瓦片”創(chuàng)建與文件存儲組織規(guī)則,通過AutoCAD二次開發(fā)語言O(shè)bjectARX進(jìn)行了二次開發(fā),直接在AutoCAD下實現(xiàn)了“地圖瓦片”的創(chuàng)建,極大提高了AutoCAD格式的地理空間數(shù)據(jù)創(chuàng)建“地圖瓦片”服務(wù)的效率,節(jié)省了人力和物力。應(yīng)用實踐表明,本文中的方法具有很高的應(yīng)用價值。
關(guān)鍵詞:地圖瓦片;地圖緩存;ArcGIS;DWG數(shù)據(jù)
一、引言
隨著計算機(jī)網(wǎng)絡(luò)技術(shù)、GIS技術(shù)的快速發(fā)展,WebGIS已經(jīng)成為目前GIS系統(tǒng)的主要形式。傳統(tǒng)的WebGIS對于客戶端提交的請求,通常利用實時計算模式向客戶端反饋數(shù)據(jù),如在ArcIMS地圖發(fā)布平臺下,由客戶端提交地圖請求,通過ArcXML與服務(wù)器端通信,服務(wù)器端接收客戶端提交的各項參數(shù),實時計算生成客戶端用戶請求的圖形,再通過ArcXML反饋給客戶端[1]。但由于GIS中需要訪問或處理的地理空間數(shù)據(jù)通常是海量的,即使是采用目前的高速寬帶網(wǎng)絡(luò),上述數(shù)據(jù)處理與傳輸方式也常常需要客戶每次對自己的“地圖平移”“地圖縮放”等操作請求等待較長甚至難以忍受的響應(yīng)時間。數(shù)據(jù)傳輸與瀏覽速度較慢曾一度成了WebGIS推廣應(yīng)用的重要瓶頸。
為了解決網(wǎng)絡(luò)環(huán)境下WebGIS訪問海量地理空間數(shù)據(jù)速度十分緩慢的問題,地圖緩存技術(shù)應(yīng)運而生。地圖緩存技術(shù)(通俗的說法為“瓦片”技術(shù)),就是按照一定的數(shù)學(xué)規(guī)則,把地圖切成一定規(guī)格的小圖片集保存到服務(wù)器上。當(dāng)用戶通過客戶端瀏覽器訪問地圖服務(wù)時,不是由服務(wù)器實時創(chuàng)建一幅圖片來送到客戶端,而是服務(wù)器直接返回當(dāng)前地圖坐標(biāo)區(qū)域所對應(yīng)的小“瓦片”后在客戶端拼接成地圖,這樣就可以通過降低服務(wù)器負(fù)擔(dān)來極大提升地圖瀏覽的速度[2-3]。目前,越來越多的地圖服務(wù)網(wǎng)站(如Google Maps、Microsoft Live Map、Mapbar、SogouMap、MapABC 等)都采用了這種技術(shù)來提高地圖訪問的速度。ArcGIS“地圖瓦片”服務(wù)就是采用地圖緩存技術(shù)的一種空間數(shù)據(jù)服務(wù)方式,其支持的服務(wù)標(biāo)準(zhǔn)有WMS、WCS等。目前,它已成為WebGIS中最為常用的一種地圖服務(wù)形式。
AutoCAD以其功能強(qiáng)大、操作簡便等特點,早已成為國內(nèi)外各設(shè)計領(lǐng)域采用最為廣泛的一種圖形設(shè)計軟件。這也使得目前大量需要在WebGIS下發(fā)布共享的地理空間數(shù)據(jù)(如城市總規(guī)、控規(guī)、詳規(guī)、專項規(guī)劃等數(shù)據(jù))是以AutoCAD的DWG文件的形式存在。由于數(shù)據(jù)格式與符號化的差異,為了保證信息不丟失,目前,由DWG數(shù)據(jù)創(chuàng)建地圖服務(wù)需要進(jìn)行復(fù)雜的數(shù)據(jù)格式轉(zhuǎn)換與符號化處理等工作,即需要先將DWG數(shù)據(jù)按圖層進(jìn)行數(shù)據(jù)格式轉(zhuǎn)換,轉(zhuǎn)換成ArcGIS的標(biāo)準(zhǔn)數(shù)據(jù)格式,然后再對各個數(shù)據(jù)圖層進(jìn)行符號化。當(dāng)DWG數(shù)據(jù)量較大時,這種處理方式效率極低,而且還有可能存在信息丟失的可能。
為了解決AutoCAD形式的地理空間數(shù)據(jù)生成ArcGIS“地圖瓦片”服務(wù)所面臨的轉(zhuǎn)換處理較復(fù)雜的問題,本文基于AutoCAD二次開發(fā)語言O(shè)bjectARX進(jìn)行二次開發(fā),實現(xiàn)AutoCAD下由地理空間數(shù)據(jù)自動創(chuàng)建ArcGIS“地圖瓦片”服務(wù)。實踐表明,本文中的方法無須進(jìn)行數(shù)據(jù)格式轉(zhuǎn)換、數(shù)據(jù)規(guī)范化處理與復(fù)雜的符號化過程,可以由AutoCAD數(shù)據(jù)一步自動完成ArcGIS“地圖瓦片”服務(wù)的創(chuàng)建。
二、ArcGIS“地圖瓦片”創(chuàng)建與文件存儲組織規(guī)則
ArcGIS地圖“瓦片”創(chuàng)建與文件存儲組織規(guī)則為:無論哪一級ArcGIS地圖“瓦片”切片,每張小圖片都是長寬相同,且大小為2N像素的正方形網(wǎng)格;每一級切片都有一個相同的切片起始點(該起始點被簡稱TSO,即為圖1中的A點);由于每一級切圖比例尺不同,因此不同級別的瓦片對應(yīng)的實地大小范圍不同;每一級切片都以TSO為起點,按照該級圖片對應(yīng)的實地長寬進(jìn)行行列編號,但地圖實際切片范圍為空間數(shù)據(jù)的最大范圍(切片原理如圖1所示);所有的切片文件都以文件的方式存儲,一個切片服務(wù)對應(yīng)一個文件夾(簡稱“服務(wù)總文件夾”),文件夾以地圖服務(wù)名命名;“服務(wù)總文件夾”下存放一個子文件夾(簡稱“地圖文檔框架文件夾”),該文件夾命名與地圖服務(wù)對應(yīng)的地圖文檔框架名一致;“地圖文檔框架文件夾”下存放一個命名為“_allayers” 的子文件夾和一個名為conf.xml的配置文件;conf.xml文件記錄該切片服務(wù)的切片信息,主要包括:切圖的起始點坐標(biāo)、各級切片的比例尺、瓦片的圖片格式、瓦片大像素大小、地圖數(shù)據(jù)的空間參考系,如地圖投影、坐標(biāo)系等[4-5]。
圖1 ArcGIS瓦片切片原理
“_allayers”文件夾下存放一系列子文件夾,每個子文件夾對應(yīng)一級切片,每個子文件夾的命名為“LXX”,第1級切片對應(yīng)的子文件夾為L00,第2級切片對應(yīng)的子文件夾為L01,依次類推;每個LXX文件夾下還包含一系列子文件夾,每個子文件夾對應(yīng)一行的切片,文件夾命名以“R”開頭,后面加上一個8位長度的數(shù)字字符串。該8位長的字符串是對應(yīng)的瓦片行號的16進(jìn)制數(shù)值。如果不足8位,左邊加0補(bǔ)齊,如第29行對應(yīng)的子文件夾命名為R0000001d。每個R文件夾下存放該行切片的瓦片文件。每個瓦片文件以字母C開頭,后面加上一個8位長度的數(shù)字字符串。該8位長的字符串是對應(yīng)的瓦片列號的16進(jìn)制數(shù)值。如果不足8位,左邊加0補(bǔ)齊。如第26行第29列瓦片為“...R0000001aC0000001d.png”。地圖瓦片的數(shù)據(jù)組織與命名方式如圖2所示。
圖2 ArcGIS瓦片文件組織與命名方式
三、AutoCAD下自動創(chuàng)建ArcGIS“地圖瓦片”服務(wù)的方法
1. 主要實現(xiàn)原理與思路
本文提出的AutoCAD下地理空間數(shù)據(jù)自動創(chuàng)建ArcGIS“地圖瓦片”服務(wù)的方法主要基于AutoCAD二次開發(fā)語言O(shè)bjectARX進(jìn)行二次開發(fā)來實現(xiàn)。其主要思路是:用戶首先指定創(chuàng)建地圖瓦片服務(wù)的坐標(biāo)原點TSO(x0,y0)、切圖級數(shù)N及每一級的切圖比例尺(1∶M0)、圖片的大小L0×L0(單位為像素)、圖片的屏幕分辨率d0(單位DPI);然后基于ArcGIS“地圖瓦片”存儲組織規(guī)則,在AutoCAD下按照切圖比例尺從小到大的順序自動為每個級別建立一個瓦片文件夾,第1級文件夾命名L00,第2級文件夾命名L01,依次類推。計算每一個切圖級別下所有圖片的左下角坐標(biāo)點Pl與右上角坐標(biāo)點Pr,采用AutoCAD的圖片打印輸出功能,將(Pl,Pr)對應(yīng)的矩形框范圍打印成小圖片,按照圖片所在的行列號及ArcGIS瓦片文件組織與命名方式進(jìn)行命名。最后將生成的小圖片保存到其對應(yīng)級別的緩存文件夾中即可。
如果切圖比例尺為1∶M0、每個圖片的大小L0×L0(單位為像素)、圖片的屏幕分辨率d0(單位DPI),則該切圖比例尺下,每個圖片對應(yīng)的實地大小為L1×L1,L1(單位為m)為
L1=(0.025 4 M0·L0)/d0
則第i行第j(行列號從0開始編號)圖片的左下角點的坐標(biāo)P1(X1,Y1)與右上角點的坐標(biāo)P2(X2,Y2)分別為
式中,(x0,y0)為創(chuàng)建地圖瓦片服務(wù)的起始坐標(biāo)原點TS0,如圖1的左上角點A。
2. 主要實現(xiàn)代碼
(1) 判斷當(dāng)前待打印圖片范圍內(nèi)有無圖形要素
由于程序創(chuàng)建地圖瓦片是從點TS0開始的,為了提高地圖瓦片生成的效率,并減少空白圖片。當(dāng)生成每個小瓦片時,需要判斷該瓦片范圍內(nèi)有無要素,如果沒有,就不生成,否則就生成。部分代碼如下:
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) 設(shè)置打印窗口
如果當(dāng)前范圍內(nèi)有要素,則設(shè)置打印窗口,打印生成對應(yīng)的小瓦片。
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) 驅(qū)動打印,生成小瓦片
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) 小瓦片命名保存
根據(jù)當(dāng)前小瓦片所在的行列號,以及ArcGIS瓦片文件組織與命名方式對當(dāng)前小瓦片進(jìn)行命名。最后將生成的小瓦片保存到其對應(yīng)級別的緩存文件夾中。
當(dāng)所有級別的瓦片全部生成完畢后,就可以通過ArcGIS創(chuàng)建一個空的“地圖瓦片”服務(wù),最后將AutoCAD下生成的地圖瓦片文件拷貝到ArcGIS Server緩存目錄下替換這個空的“地圖瓦片”緩存文件夾,這樣就實現(xiàn)了AutoCAD格式的地理空間數(shù)據(jù)自動創(chuàng)建ArcGIS“地圖瓦片”服務(wù)。
四、結(jié)束語
目前,在GIS開發(fā)及數(shù)據(jù)處理過程中,經(jīng)常需要將AutoCAD格式的地理空間數(shù)據(jù)處理成ArcGIS“地圖瓦片”服務(wù)。本文針對這一需求及傳統(tǒng)處理方式存在的問題,同時結(jié)合ArcGIS“地圖瓦片”創(chuàng)建與文件存儲組織規(guī)則,提出了在AutoCAD中直接由AutoCAD格式的地理空間數(shù)據(jù)創(chuàng)建“地圖瓦片”服務(wù)的方法。應(yīng)用實踐表明,本文方法極大提高了AutoCAD格式的地理空間數(shù)據(jù)創(chuàng)建“地圖瓦片”服務(wù)的效率,節(jié)省了人力和物力,值得大力推廣。
參考文獻(xiàn):
[1]李海亭,費立凡,彭清山,等.預(yù)生成思想在地理信息服務(wù)中的應(yīng)用研究[J]. 測繪信息與工程,2009,34(1):31-32.
[2]王強(qiáng).分布式WebGIS地圖緩存策略的應(yīng)用研究[J].軟件導(dǎo)刊,2008(5):16-18.
[3]馬維峰,王曉蕊,高松峰,等.基于服務(wù)器動態(tài)緩存和Ajax技術(shù)的WebGIS開發(fā)[J].測繪科學(xué),2008,33(5):204-205.
[4]郭明武,彭清山,李黎.ArcGIS Server中地圖瓦片實時在線局部更新方法研究[J]. 測繪通報,2012(2):35-38.
[5]ArcGIS Server大數(shù)據(jù)量地圖服務(wù)影像緩存建立方法初探[EB/OL].[2015-01-28].http:∥www.cnblogs.com/lovekitty/archive/2009/03/27/1423279.html.
[6]周婷婷.電子地圖局部更新方法研究[J]. 地理空間信息,2014,12(4):162-163.
[7]孫偉,李志慶,焦孟凱,等. 瓦片地圖動態(tài)緩存中間件的優(yōu)化設(shè)計及實現(xiàn)[J]. 測繪通報, 2014(1): 37-40.
[8]周沛.智能交通系統(tǒng)中的瓦片地圖技術(shù)研究與應(yīng)用[D].上海:同濟(jì)大學(xué), 2008.引文格式: 胡應(yīng)龍,陳杰. NoSQL空間數(shù)據(jù)管理在省級水利數(shù)據(jù)共享服務(wù)平臺中的應(yīng)用[J].測繪通報,2015(12):88-92.DOI:10.13474/j.cnki.11-2246.2015.387
作者簡介:洪濤(1971—),女,高級工程師,研究方向為地理信息系統(tǒng)。E-mail: 940857079@qq.com
收稿日期:2015-01-28
中圖分類號:P208
文獻(xiàn)標(biāo)識碼:B
文章編號:0494-0911(2015)12-0085-03
引文格式: 洪濤,譚仁春,李寧. AutoCAD數(shù)據(jù)自動創(chuàng)建ArcGIS“地圖瓦片”服務(wù)的方法研究[J].測繪通報,2015(12):85-87.DOI:10.13474/j.cnki.11-2246.2015.386