張娜 李國清 張蓓蓓
(河南省遙感測繪院,河南 鄭州 450008)
隨著信息化的發(fā)展,地理信息應用服務模式逐漸發(fā)生轉變。傳統(tǒng)紙質地圖由專業(yè)技術人員通過編輯準備、數(shù)據(jù)獲取、數(shù)據(jù)編輯處理、直接制版等多道工序完成[1]。如今,各行各業(yè)都需要隨時輸出專題地圖,傳統(tǒng)工序已不能滿足當前實時制圖打印的需求。在互聯(lián)網(wǎng)時代,電子地圖已經(jīng)成為人們日常使用的主要地圖產(chǎn)品,其所儲存的信息遠遠高于普通地圖[2]。在電子地圖的基礎上,隨時進行專題制圖輸出成為用戶的主要需求。從本質上講,電子地圖的打印輸出就是將電子地圖轉化為紙質地圖[3]。當前信息化系統(tǒng)主要支持基于C/S模式的地圖專題打印輸出,但是隨著信息化系統(tǒng)的發(fā)展,基于B/S模式的行業(yè)信息化系統(tǒng)逐漸成為主流,而當前大部分B/S模式電子地圖的打印只針對A3、A4等小幅面的圖片式打印輸出,無法滿足用戶對大幅面專題地圖矢量結果輸出的需求。
為了滿足用戶日常工作需求,本文通過研究基于B/S模式的大幅面地圖打印輸出技術,使用Python語言編寫地圖打印服務文件,通過ArcGIS Server軟件完成打印服務發(fā)布,便于非專業(yè)用戶在B/S信息化系統(tǒng)中實現(xiàn)一鍵式地圖打印輸出。
采用Python腳本語言,基于ArcGIS軟件的Python二次開發(fā)接口即arcpy開發(fā)完成。arcpy提供了大量類和函數(shù),使用它可以直接執(zhí)行ArcGIS工具箱中的工具,并且支持創(chuàng)建原生對象。在ArcGIS環(huán)境中,用戶可以將編寫的Python腳本語言導入到Python ToolBox中,生成腳本工具[4],同時ArcGIS 10.1以上版本支持將用戶制作的地理處理工具發(fā)布為服務,通過在線方式完成地理處理工作。ArcGIS 10.1以上版本Server自帶有地圖打印服務,但是該服務主要用于輸出A3、A4等常規(guī)尺寸地圖。為實現(xiàn)大幅面矢量數(shù)據(jù)輸出,需采用腳本語言自定義地圖打印服務。
首先創(chuàng)建自定義地理處理服務的Python腳本,腳本文件采用ConvertWebMapToMapDocument函數(shù),該函數(shù)可將待打印或導出的Web地圖(JSON格式)轉換為地圖文檔,然后arcpy.mapping腳本在輸出地圖文檔的所有圖層中循環(huán),除與Web地圖JSON中的服務圖層相對應的矢量圖層外,其他所有圖層均被移除。腳本可讀取自定義打印任務中的額外參數(shù),隨后可將地圖文檔導出為所選格式,如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)建腳本工具過程中,需設置地圖打印交互參數(shù),包括以下幾個方面:
(1)Web_Map_as_JSON:該參數(shù)為Web應用程序當前的地圖狀態(tài),用JSON表示。
(2)Fromat:傳遞打印時地圖圖像使用的格式。
(3)Layout_Template:用于設置打印時使用的地圖模板文檔。
(4)Georef_info:用于設置是否將坐標信息導出。
(5)Output_File:將要創(chuàng)建的輸出文件。
本文基于ArcGIS軟件完成B/S地圖打印輸出,具體技術路線如圖1所示。
圖1 技術流程圖
(1)準備用于打印輸出的數(shù)據(jù)文件:要進行大幅面的矢量數(shù)據(jù)輸出,需要將所有數(shù)據(jù)全部導入gdb文件數(shù)據(jù)庫。已制作好的切片地圖數(shù)據(jù)同樣可以采用鑲嵌數(shù)據(jù)集的方式導入gdb文件數(shù)據(jù)庫,并將地圖文檔發(fā)布為服務,用于Web程序打印輸出。
(2)準備數(shù)據(jù)打印輸出模板:在服務器端根據(jù)用戶需求提前配置地圖打印模板,包括地圖打印幅面、指北針、比例尺、圖例等各類地圖整飾要素。
(3)編寫Python腳本:根據(jù)打印輸出需求,編寫Python腳本,設置地圖模板位置、打印輸出參數(shù)等。
(4)創(chuàng)建Python工具:基于Python腳本程序創(chuàng)建地理處理工具,設置相關參數(shù),可先在arcmap桌面端進行工具測試,對錯誤進行修改直到測試成功。
(5)發(fā)布打印服務:將創(chuàng)建的腳本工具共享發(fā)布為地理處理服務。
(6)地圖打印輸出:在Web程序中調用發(fā)布的數(shù)據(jù)及地理處理服務,實現(xiàn)打印輸出。
為讓用戶在瀏覽器上一鍵式出圖打印,需在服務器端設置打印模板。根據(jù)需求,在arcmap的layout view視圖中設置地圖打印模板,如紙張大小可設置為60 cm×60 cm、100 cm×60 cm等尺寸,自定義添加圖名、圖例、指北針等地圖整飾要素,設置相關顯示樣式。
創(chuàng)建地圖打印工具時,根據(jù)提前制作的地圖模板,設置打印參數(shù),便于用戶在輸出時選擇。在打印服務發(fā)布時,應注意同步、異步問題,程序設置應與服務相同;根據(jù)用戶需求進行打印測試,一般情況下耗時短用同步,耗時較長則用異步。
在Web程序中,基于ArcGIS提供的JS API接口,使用JavaScript語言調用地圖數(shù)據(jù)服務及打印服務。為滿足用戶一鍵式打印需求,采用所見即所得的地圖打印方式。打印出圖比例尺即用戶當前瀏覽的比例尺,紙張尺寸可選,出圖范圍根據(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ù)需求選擇紙張大小及輸出格式,設置地圖標題,即可完成專題地圖輸出工作。地圖打印界面如圖2所示,輸出地圖文檔如圖3所示。
圖2 地圖打印界面
圖3 地圖制圖輸出結果
基于B/S模式的地圖打印輸出技術讓用戶能在瀏覽器上實時進行地圖打印輸出,解決了傳統(tǒng)地圖打印需安裝桌面軟件、地圖輸出設置復雜等問題。該技術將復雜的設置操作放在服務器端,由專業(yè)人員進行維護,降低了地理信息系統(tǒng)使用門檻,拓展了地理信息服務范圍,在各行業(yè)信息化系統(tǒng)中有廣闊的應用前景。
[1]張冬梅.數(shù)字地圖制圖技術淺析[J].測繪通報, 2009 (12):70-72.
[2]魏紅艷,常軍.淺談電子地圖的應用現(xiàn)狀及發(fā)展前景[J].才智, 2015 (10).
[3]張曉輝,游雄,賈奮勵.電子地圖打印的總體設計和輸出[J].測繪科學技術學報,2007,24 (2):145-148.
[4]ArcGIS幫助10.1[EB/OL].http://resources.ArcGIS.com/zh-cn/help/main/10.1/index.html.