田鵬,何偉
(武漢市測繪研究院,湖北 武漢 430022)
瓦片地圖是利用地圖切片技術(shù)將矢量數(shù)據(jù)或者影像數(shù)據(jù)制作成按照“級、行、列”的金字塔網(wǎng)格形式存儲的圖片集,可以在網(wǎng)頁中根據(jù)用戶選擇的地圖級別和視圖范圍有選擇性地快速加載,主要作為地圖底圖或者復(fù)雜的大比例尺專題圖,滿足用戶對地圖加載速度和效果上的要求。
瓦片地圖的切片方案是計(jì)算瓦片地圖“級、行、列”的依據(jù),主要由切片原點(diǎn)、切片分辨率(比例尺)、切片范圍和切片像素大小構(gòu)成。
①切片原點(diǎn):切片原點(diǎn)是定義切片網(wǎng)格坐標(biāo)系的起點(diǎn)位置,一般分布在地圖的左上角或左下角;
②切片分辨率(比例尺):切片分辨率和比例尺是一一對應(yīng)的。比例尺指的是圖上一個(gè)單位代表實(shí)際多少距離,而分辨率代表屏幕上一個(gè)像素代表實(shí)際多少距離。
③切片范圍:切片范圍是指進(jìn)行切片的地圖圖幅范圍;
④切片像素大小:每張切片圖片的長寬像素值。切片像素值乘以切片分辨率即確定了當(dāng)前比例尺下的切片實(shí)地大小。默認(rèn)的切片大小為 256 px×256 px。
目前對大比例尺地形圖的前端展示方法分為標(biāo)準(zhǔn)柵格切片展示和矢量數(shù)據(jù)符號化展示兩種。
標(biāo)準(zhǔn)柵格切片是將CAD文件去圖框轉(zhuǎn)成帶坐標(biāo)文件的整幅PNG+PGW文件,再作為柵格影像集導(dǎo)入到切圖軟件中(如ArcGIS)進(jìn)行批量切圖,生成預(yù)設(shè)切片方案下的切片文件。地形圖更新時(shí),需要制作更新區(qū)的標(biāo)準(zhǔn)圖幅PNG+PGW文件,在切圖軟件中對已有的切片文件進(jìn)行局部更新。標(biāo)準(zhǔn)柵格切片對切圖工具的依賴性較高,并且需要專業(yè)性的人工干預(yù),后期切片更新的工作煩瑣復(fù)雜,導(dǎo)致基本圖瓦片數(shù)據(jù)的現(xiàn)勢性和更新周期都比較低,一般一年更新一版或者僅在重大節(jié)點(diǎn)時(shí)間進(jìn)行更新。
矢量數(shù)據(jù)符號化是利用矢量數(shù)據(jù)庫實(shí)時(shí)生成用戶請求的要素,根據(jù)要素的描述屬性調(diào)取符號庫的對應(yīng)符號生成的一種實(shí)時(shí)基本圖展示。矢量數(shù)據(jù)符號化的自動化程度高,可以根據(jù)矢量數(shù)據(jù)庫的更新對基本圖進(jìn)行自動更新。該方法對基本圖制作時(shí)的“圖庫一體性”要求較高,需配置詳盡的地形圖符號庫,并且由于CAD基本圖的圖面整飾原因,最終的符號化展示效果明顯弱于CAD原圖效果。
各城市基礎(chǔ)測繪部門依據(jù)各地的實(shí)際情況,制作了固定圖幅大小的大比例尺基礎(chǔ)地形圖。如 1∶2 000比例尺地形圖,CAD文件圖幅大小為 50 cm×50 cm,實(shí)地尺寸 1 000 m×1 000 m;1∶500比例尺地形圖,CAD文件圖幅大小為 50 cm×50 cm,實(shí)地尺寸 250 m×250 m。
鑒于以上標(biāo)準(zhǔn)柵格切片展示和矢量數(shù)據(jù)符號化展示兩種展示方法的局限性,本文研究了一種標(biāo)準(zhǔn)圖幅大小的地形圖切片制作方法,通過設(shè)計(jì)自定義切片方案,利用標(biāo)準(zhǔn)圖幅大小的整張圖片去代替標(biāo)準(zhǔn)柵格切片,無須進(jìn)行切圖操作,即可實(shí)現(xiàn)大比例尺地形圖的展示和切片管理。
標(biāo)準(zhǔn)圖幅大小的地形圖切片制作有以下四方面的優(yōu)勢:
①擺脫切圖軟件的束縛,實(shí)現(xiàn)標(biāo)準(zhǔn)圖幅切片的快速簡單更新。
標(biāo)準(zhǔn)圖幅大小的地形圖切片采用基本圖幅表作為切片方案網(wǎng)格,每一網(wǎng)格內(nèi)的切片由該圖幅對應(yīng)的地形圖整張圖片代替。后期更新時(shí),只需要替換更新區(qū)域的基礎(chǔ)地形圖PNG文件即可。
②可建立隨時(shí)間軸變化的動態(tài)切片方案。
利用基本圖幅表,對每個(gè)圖幅的地形圖圖片按照時(shí)間順序進(jìn)行集中存放,前端展示時(shí)默認(rèn)顯示所有圖幅內(nèi)的最新地形圖圖片,也可根據(jù)輸入時(shí)間,動態(tài)生成隨時(shí)間軸變化的地形圖。
③可開發(fā)相關(guān)的展示接口,支持ArcGIS、OpenLayers等地圖API的接入。
通過開發(fā)重構(gòu)ArcGIS、OpenLayers等地圖API的特定接口,可支持直接加載標(biāo)準(zhǔn)圖幅大小地形圖切片,與現(xiàn)有的技術(shù)和系統(tǒng)無縫對接。
④切片文件加密處理,提高地圖瓦片在線瀏覽時(shí)的安全性。
采用類似高德、百度地圖的切片文件加密方法,實(shí)現(xiàn)標(biāo)準(zhǔn)圖幅切片文件的加密處理,提高在線地圖瓦片安全性。
本文以ArcGIS API調(diào)用1∶2 000圖和 1∶500圖標(biāo)準(zhǔn)圖幅切片的整個(gè)操作流程為例進(jìn)行具體闡述。
標(biāo)準(zhǔn)圖幅切片制作和使用分四個(gè)階段進(jìn)行,如圖1所示:
圖1 標(biāo)準(zhǔn)圖幅切片制作和使用
①切圖原點(diǎn)選定。采用ArcGIS API支持的左上角坐標(biāo)作為切圖原點(diǎn),根據(jù)城市 1∶2 000基本圖的圖幅結(jié)合表范圍,可以選擇結(jié)合表最左和最上的網(wǎng)格坐標(biāo)作為切圖原點(diǎn),如圖2中結(jié)合表范圍的左上角(Xmin,Ymax)為切圖原點(diǎn)。
②切片分辨率(比例尺)選擇。根據(jù)基本圖CAD文件轉(zhuǎn)PNG圖片的最佳顯示效果, 1∶2 000基本圖的分辨率為0.2,1∶500圖的分辨率為0.1。
③切片網(wǎng)格大小。 1∶2 000圖的實(shí)地尺寸為 1 000 m×1 000 m,根據(jù)分辨率計(jì)算可得網(wǎng)格大小為 5 000 px×5 000 px,同法可得1∶500圖的切片網(wǎng)格大小為 2 500 px×2 500 px。
圖2 標(biāo)準(zhǔn)圖幅切片方案
④根據(jù)以上起算數(shù)據(jù),可整理得 1∶2 000圖和1∶500圖的最終切片方案。
"lods":
[
{ "level":7,"resolution":0.2,"scale":2000 },
{ "level":8,"resolution":0.1,"scale":500 }
]
①CAD基本圖數(shù)據(jù)。準(zhǔn)備全市標(biāo)準(zhǔn)圖幅的地形圖CAD文件或者更新區(qū)域的標(biāo)準(zhǔn)圖幅CAD文件。 1∶2 000圖一般 1∶2 000結(jié)合表的網(wǎng)格坐標(biāo)作為文件名,1∶500圖是 1∶2 000圖的基礎(chǔ)上16等分,從左至右由上至下按01到16進(jìn)行編號,與 1∶2 000結(jié)合表的網(wǎng)格坐標(biāo)組合編號作為文件名。
②標(biāo)準(zhǔn)圖幅PNG。利用CAD插件,轉(zhuǎn)存CAD文件到固定分辨率大小的PNG文件,圖片文件名同CAD文件名一致。
③PNG文件信息入庫。利用入庫程序,輸入數(shù)據(jù)更新時(shí)間,根據(jù)PNG文件名中的坐標(biāo)信息,生成時(shí)間戳和加密后的文件名等相關(guān)信息,并保存到關(guān)系數(shù)據(jù)庫中。
④PNG文件入庫。利用入庫程序,上傳PNG文件到文件服務(wù)器,并采用關(guān)系數(shù)據(jù)庫中的加密文件名對PNG文件進(jìn)行重命名。
利用ArcGIS API中的TiledMapServiceLayer類,重構(gòu)出加載標(biāo)準(zhǔn)圖幅切片的TiledCustomLayer類,通過傳遞標(biāo)準(zhǔn)圖幅切片方案的各類參數(shù),獲取到響應(yīng)切片加載函數(shù)getTileUrl中的level,row,col等參數(shù)。
①切片加載接口請求
根據(jù)響應(yīng)切片加載函數(shù)中的level,row,col參數(shù),計(jì)算要加載的切片資源文件和路徑。以下是計(jì)算 1∶2 000圖和1∶500圖的格網(wǎng)坐標(biāo)代碼。
function getTileUrl(level,row,col) {
var requestnumber
if (level == 7 && col >= 0 && row >= 0)
requestnumber += (region.y - row - 1).toString() + (col + region.x).toString() + "00";
if (level == 8 && col >= 0 && row >= 0) {
var zy = Math.floor(row / 4);
var zx = Math.floor(col / 4);
var temp = row % 4;
var z0 = temp * 4 + col % 4 + 1;
requestnumber += (region.y - zy - 1).toString() + (zx + region.x).toString() + padLeft(2,z0);
}
}
以下是OpenLayers API中直接加載自定義標(biāo)準(zhǔn)圖幅切片的核心代碼:
var tile2000 = new ol.layer.Tile({
name:'tile2000',
source:new ol.source.XYZ({
tileSize:vectorTileGrid2000.tmpSize_,
tileGrid:vectorTileGrid2000,
resolutions:[0.2],
tileUrlFunction:function (tileCoord) {
if (tileCoord[0] == 7 && tileCoord[1] >= 0 && tileCoord[2] >= 0) {
var requestnumber = "";
requestnumber += (tileCoord[2] + region.y).toString() + (tileCoord[1] + region.x).toString() + "00.png";
getMytile(requestnumber,call);
function call(data) {
return getMytile(data);
}
}
}
})
})
map.addLayer(tile2000);
②切片展示
根據(jù)格網(wǎng)坐標(biāo)代碼和時(shí)間戳信息調(diào)用關(guān)系數(shù)據(jù)庫接口,返回加密后的切片文件路徑進(jìn)行前端切片加載展示。
利用ArcGIS API重構(gòu)接口調(diào)用標(biāo)準(zhǔn)圖幅切片,展示效果如圖3~圖6所示。
圖3 1∶2 000圖ArcGIS API前端展示效果
圖4 1∶2 000標(biāo)準(zhǔn)圖幅圖片效果
圖5 1∶500圖ArcGIS API前端展示效果
圖6 1∶500標(biāo)準(zhǔn)圖幅圖片效果
谷歌瀏覽器中對加載性能進(jìn)行監(jiān)測,如圖7和圖8所示。
圖7 紅框內(nèi)為加密后的標(biāo)準(zhǔn)圖幅切片的加載情況
圖8 標(biāo)準(zhǔn)圖幅切片的預(yù)覽效果
本文基于瓦片地圖切片原理,設(shè)計(jì)了一套大比例尺地形圖的標(biāo)準(zhǔn)圖幅切片方案,通過設(shè)計(jì)切圖原點(diǎn)和切圖網(wǎng)格大小,使得 1∶2 000圖或1∶500圖標(biāo)準(zhǔn)圖幅大小的圖片能代替?zhèn)鹘y(tǒng)的地圖切片,進(jìn)而在瀏覽器前端進(jìn)行加載顯示,減少了制作大比例尺底圖和復(fù)雜專題圖切片工作中對切圖軟件和專業(yè)操作上的要求。通過重構(gòu)開發(fā)ArcGIS API和OpenLayers API等地圖接口實(shí)現(xiàn)了對標(biāo)準(zhǔn)圖幅切片的支持,可直接對現(xiàn)有GIS系統(tǒng)進(jìn)行升級。同時(shí)設(shè)計(jì)了相關(guān)的加密算法對切片文件進(jìn)行加密,保證了標(biāo)準(zhǔn)圖幅切片在線瀏覽的安全性。本文的研究為GIS系統(tǒng)提供了多時(shí)態(tài)、更高效的地圖切片資源,也為城市基礎(chǔ)測繪部門在基礎(chǔ)地形圖的管理上提供了一定的參考。