張娜 李國(guó)清 張蓓蓓
(河南省遙感測(cè)繪院,河南 鄭州 450008)
隨著信息化的發(fā)展,地理信息應(yīng)用服務(wù)模式逐漸發(fā)生轉(zhuǎn)變。傳統(tǒng)紙質(zhì)地圖由專業(yè)技術(shù)人員通過(guò)編輯準(zhǔn)備、數(shù)據(jù)獲取、數(shù)據(jù)編輯處理、直接制版等多道工序完成[1]。如今,各行各業(yè)都需要隨時(shí)輸出專題地圖,傳統(tǒng)工序已不能滿足當(dāng)前實(shí)時(shí)制圖打印的需求。在互聯(lián)網(wǎng)時(shí)代,電子地圖已經(jīng)成為人們?nèi)粘J褂玫闹饕貓D產(chǎn)品,其所儲(chǔ)存的信息遠(yuǎn)遠(yuǎn)高于普通地圖[2]。在電子地圖的基礎(chǔ)上,隨時(shí)進(jìn)行專題制圖輸出成為用戶的主要需求。從本質(zhì)上講,電子地圖的打印輸出就是將電子地圖轉(zhuǎn)化為紙質(zhì)地圖[3]。當(dāng)前信息化系統(tǒng)主要支持基于C/S模式的地圖專題打印輸出,但是隨著信息化系統(tǒng)的發(fā)展,基于B/S模式的行業(yè)信息化系統(tǒng)逐漸成為主流,而當(dāng)前大部分B/S模式電子地圖的打印只針對(duì)A3、A4等小幅面的圖片式打印輸出,無(wú)法滿足用戶對(duì)大幅面專題地圖矢量結(jié)果輸出的需求。
為了滿足用戶日常工作需求,本文通過(guò)研究基于B/S模式的大幅面地圖打印輸出技術(shù),使用Python語(yǔ)言編寫(xiě)地圖打印服務(wù)文件,通過(guò)ArcGIS Server軟件完成打印服務(wù)發(fā)布,便于非專業(yè)用戶在B/S信息化系統(tǒng)中實(shí)現(xiàn)一鍵式地圖打印輸出。
采用Python腳本語(yǔ)言,基于ArcGIS軟件的Python二次開(kāi)發(fā)接口即arcpy開(kāi)發(fā)完成。arcpy提供了大量類和函數(shù),使用它可以直接執(zhí)行ArcGIS工具箱中的工具,并且支持創(chuàng)建原生對(duì)象。在ArcGIS環(huán)境中,用戶可以將編寫(xiě)的Python腳本語(yǔ)言導(dǎo)入到Python ToolBox中,生成腳本工具[4],同時(shí)ArcGIS 10.1以上版本支持將用戶制作的地理處理工具發(fā)布為服務(wù),通過(guò)在線方式完成地理處理工作。ArcGIS 10.1以上版本Server自帶有地圖打印服務(wù),但是該服務(wù)主要用于輸出A3、A4等常規(guī)尺寸地圖。為實(shí)現(xiàn)大幅面矢量數(shù)據(jù)輸出,需采用腳本語(yǔ)言自定義地圖打印服務(wù)。
首先創(chuàng)建自定義地理處理服務(wù)的Python腳本,腳本文件采用ConvertWebMapToMapDocument函數(shù),該函數(shù)可將待打印或?qū)С龅腤eb地圖(JSON格式)轉(zhuǎn)換為地圖文檔,然后arcpy.mapping腳本在輸出地圖文檔的所有圖層中循環(huán),除與Web地圖JSON中的服務(wù)圖層相對(duì)應(yīng)的矢量圖層外,其他所有圖層均被移除。腳本可讀取自定義打印任務(wù)中的額外參數(shù),隨后可將地圖文檔導(dǎo)出為所選格式,如PDF。部分示例代碼如下所示:
df = arcpy.mapping.ListDataFrames(mxd,'Webmap')[0]
serviceLayersNames = [slyr.name for slyr in arcpy.mapping.ListLayers(mxd, data_frame=df)if slyr.isServiceLayer and slyr.visible and not slyr.isGroupLayer]
vectorLayersNames = [vlyr.name for vlyr in arcpy.mapping.ListLayers(mxd, data_frame=df)if not vlyr.isServiceLayer and not vlyr.isGroupLayer]
removeLayerNameList = [vlyrName for vlyrName in vectorLayersNames if vlyrName not in serviceLayersNames]
for lyr in arcpy.mapping.ListLayers(mxd, data_frame=df):
if not lyr.isGroupLayer
and not lyr.isServiceLayer
and lyr.name in removeLayerNameList
and lyr.name in vectorLayersNames:
arcpy.mapping.RemoveLayer(df, lyr)
在創(chuàng)建腳本工具過(guò)程中,需設(shè)置地圖打印交互參數(shù),包括以下幾個(gè)方面:
(1)Web_Map_as_JSON:該參數(shù)為Web應(yīng)用程序當(dāng)前的地圖狀態(tài),用JSON表示。
(2)Fromat:傳遞打印時(shí)地圖圖像使用的格式。
(3)Layout_Template:用于設(shè)置打印時(shí)使用的地圖模板文檔。
(4)Georef_info:用于設(shè)置是否將坐標(biāo)信息導(dǎo)出。
(5)Output_File:將要?jiǎng)?chuàng)建的輸出文件。
本文基于ArcGIS軟件完成B/S地圖打印輸出,具體技術(shù)路線如圖1所示。
圖1 技術(shù)流程圖
(1)準(zhǔn)備用于打印輸出的數(shù)據(jù)文件:要進(jìn)行大幅面的矢量數(shù)據(jù)輸出,需要將所有數(shù)據(jù)全部導(dǎo)入gdb文件數(shù)據(jù)庫(kù)。已制作好的切片地圖數(shù)據(jù)同樣可以采用鑲嵌數(shù)據(jù)集的方式導(dǎo)入gdb文件數(shù)據(jù)庫(kù),并將地圖文檔發(fā)布為服務(wù),用于Web程序打印輸出。
(2)準(zhǔn)備數(shù)據(jù)打印輸出模板:在服務(wù)器端根據(jù)用戶需求提前配置地圖打印模板,包括地圖打印幅面、指北針、比例尺、圖例等各類地圖整飾要素。
(3)編寫(xiě)Python腳本:根據(jù)打印輸出需求,編寫(xiě)Python腳本,設(shè)置地圖模板位置、打印輸出參數(shù)等。
(4)創(chuàng)建Python工具:基于Python腳本程序創(chuàng)建地理處理工具,設(shè)置相關(guān)參數(shù),可先在arcmap桌面端進(jìn)行工具測(cè)試,對(duì)錯(cuò)誤進(jìn)行修改直到測(cè)試成功。
(5)發(fā)布打印服務(wù):將創(chuàng)建的腳本工具共享發(fā)布為地理處理服務(wù)。
(6)地圖打印輸出:在Web程序中調(diào)用發(fā)布的數(shù)據(jù)及地理處理服務(wù),實(shí)現(xiàn)打印輸出。
為讓用戶在瀏覽器上一鍵式出圖打印,需在服務(wù)器端設(shè)置打印模板。根據(jù)需求,在arcmap的layout view視圖中設(shè)置地圖打印模板,如紙張大小可設(shè)置為60 cm×60 cm、100 cm×60 cm等尺寸,自定義添加圖名、圖例、指北針等地圖整飾要素,設(shè)置相關(guān)顯示樣式。
創(chuàng)建地圖打印工具時(shí),根據(jù)提前制作的地圖模板,設(shè)置打印參數(shù),便于用戶在輸出時(shí)選擇。在打印服務(wù)發(fā)布時(shí),應(yīng)注意同步、異步問(wèn)題,程序設(shè)置應(yīng)與服務(wù)相同;根據(jù)用戶需求進(jìn)行打印測(cè)試,一般情況下耗時(shí)短用同步,耗時(shí)較長(zhǎng)則用異步。
在Web程序中,基于ArcGIS提供的JS API接口,使用JavaScript語(yǔ)言調(diào)用地圖數(shù)據(jù)服務(wù)及打印服務(wù)。為滿足用戶一鍵式打印需求,采用所見(jiàn)即所得的地圖打印方式。打印出圖比例尺即用戶當(dāng)前瀏覽的比例尺,紙張尺寸可選,出圖范圍根據(jù)比例尺及選定的紙張尺寸由程序自動(dòng)計(jì)算確定。主要代碼如下所示:
function init() {
printFun.map = new esri.Map("printmap",{extent:myMap.extent });
var dynURL=”http:// MyServer:6080/ArcGIS/rest/services/pdscb/MapServer”;
printFun.curlayer= new esri.layers.ArcGISTiledM apServiceLayer(dynURL);
printFun.map. addLayer(printFun.curlayer);
var printUrl="http://MyServer:6080/ArcGIS/rest/services/Print/pdsprint/GPServer/pdsprint ";
printTask = new esri.tasks.PrintTask(printUrl,{async: true});
params = new esri.tasks.PrintParameters();params.map = printFun. map;
}
function print(){
var ptemplate = new esri.tasks.
PrintTemplate();
ptemplate.preserveScale = false;
params.template={layout:select_layout,format:select_format,
l a y o u t O p t i o n s:{t i t l e T e x t:t i t l e,legendLayers:[legendLayer]}};
printTask.execute(params, printComplete);
}
function printComplete(result){
window.open(result.url);
}
dojo.addOnLoad(init);
在B/S系統(tǒng)中增加地圖打印輸出模塊,用戶可根據(jù)需求選擇紙張大小及輸出格式,設(shè)置地圖標(biāo)題,即可完成專題地圖輸出工作。地圖打印界面如圖2所示,輸出地圖文檔如圖3所示。
圖2 地圖打印界面
圖3 地圖制圖輸出結(jié)果
基于B/S模式的地圖打印輸出技術(shù)讓用戶能在瀏覽器上實(shí)時(shí)進(jìn)行地圖打印輸出,解決了傳統(tǒng)地圖打印需安裝桌面軟件、地圖輸出設(shè)置復(fù)雜等問(wèn)題。該技術(shù)將復(fù)雜的設(shè)置操作放在服務(wù)器端,由專業(yè)人員進(jìn)行維護(hù),降低了地理信息系統(tǒng)使用門(mén)檻,拓展了地理信息服務(wù)范圍,在各行業(yè)信息化系統(tǒng)中有廣闊的應(yīng)用前景。
[1]張冬梅.數(shù)字地圖制圖技術(shù)淺析[J].測(cè)繪通報(bào), 2009 (12):70-72.
[2]魏紅艷,常軍.淺談電子地圖的應(yīng)用現(xiàn)狀及發(fā)展前景[J].才智, 2015 (10).
[3]張曉輝,游雄,賈奮勵(lì).電子地圖打印的總體設(shè)計(jì)和輸出[J].測(cè)繪科學(xué)技術(shù)學(xué)報(bào),2007,24 (2):145-148.
[4]ArcGIS幫助10.1[EB/OL].http://resources.ArcGIS.com/zh-cn/help/main/10.1/index.html.