


【摘要】針對傳統地圖調用模式效率低、時效性差等問題,本文提出了一種基于GIS的地圖瓦片生成方法,可將生成的瓦片地圖作為背景底圖,提高了地圖的瀏覽、查詢、地理分析等出圖效率。經測試,該方法可實現對地圖分塊切割,達到了以“空間換取時間”的目標。
【關鍵詞】地圖瓦片 GIS 時效性
0引言
隨著智慧城市快速推進,城市基礎地理信息服務的重要性日益突出,政府相關部門非常重視地理空間信息服務工作。傳統的Web GIS系統采用實時請求地圖服務器工作模式,該模式極大地消耗了網絡負載和服務器負載,導致時效性差、工作效率低,無法滿足多用戶、高并發的地理空間信息資源共享服務需求。然而,Google Maps的出現打破了人們對傳統Web GIS工作模式的看法,同時也給大家提供了研究思路和解決方法。Google Maps將全球地圖和影像采用特定的預切割方式進行切片,并將切好的地圖圖像存儲在服務器上,當用戶訪問地圖時,將從Google Maps的服務器上請求圖片到本機緩存,這樣就很大程度上減輕服務器壓力,提高了請求數量和訪問速度。鑒于此,為了提高公眾服務平臺空間信息資源共享的服務效率和能力,開發基于基于GIS的地圖瓦片生成方法十分必要。
1地圖瓦片生成方法機理
地圖切片技術是目前大多數電子地圖網站使用的技術,地圖分塊切割后將地圖若干不同的瓦片組合劃分不同的等級顯示,再由客戶端呈現出無縫拼接地圖的瀏覽技術。地圖瓦片技術將配置好的一定坐標范圍的地圖,按照固定的若干個瓦片級別和指定圖片尺寸(如128,256像素),切成若干行及列的正方形圖片,以指定的格式保存成圖像文件,按一定的命名規則和組織方式存儲到目錄系統中或是數據庫系統里,形成金字塔模型的靜態地圖緩存,地圖切圖所獲得的地圖切片也叫瓦片。對每個地圖切片所表示的地理范圍,進行下一個縮放級別的地圖切片生成,直至所要表示地圖的最大比例尺,形成地圖切片的金字塔結構,地圖切片的數量呈指數級別的增長。瓦片式地圖采用金字塔結構模型如下圖1所示。瓦片式地圖采用多分辨率層次模型的結構,從瓦片金字塔的第一層到最后一層,地圖顯示的細節越來越清晰,但是地圖表示的地理范圍是不變的。
為了實現對GIS系統的圖層信息的提取處理,首先需要參考Google Maps地圖瓦片預生成技術對地圖按照Google Maps標準進行切割。本文對提取的圖層信息進行標準化處理后,統一存儲為Google Maps格式(每個tile為256× 256像素的.png格式的圖像)。本文采用預切割方式對地圖進行切片,并將切好的地圖圖像存儲在服務器上,當用戶訪問地圖時,將從服務器上請求圖片到本機緩存,這樣很大程度上提高請求數量和訪問速度。采用的地圖轉換參數標準如表1所示。
2地圖瓦片生成方法設計與實現
2.1地圖瓦片生成算法流程
參考GoogleMaps標準,地圖瓦片生成算法流程如圖2所示。
2.2地圖瓦片生成方法實現結果
2.2.1代碼實現
private void getWorkspace() //建立一個工作空間
private void createDatasource()//得到數據源
ds=workspace.getDatasources().open(info)//在工作空間中打開數據源。
public OneLevelMapTilesGet(int layerId,int maxLayerId,Vector v){}//單層切圖
public OneLevelMapTilesGet(int layerId,int maxLayerId,Vector v,int tag)
private void getMap(){}從數據源中得到地圖,包括加上背景圖層。
DatasetVector dv =(DatasetVector)ds.getDatasets().get("backColor_1");
name=ds.getDatasets().getAvailableDatasetName("backColor");
dv=ds.getDatasets().create(newDatasetVectorInfo(name,DatasetType.REGION));
dv為數據集向量,以上為畫背景圖層圖形所需的必要設置。
rs.addNew((Geometry)gr);
rs.refresh();
map.getLayers().add(dv, true);
將背景圖層加到map中。
if(layer.getName().equals("房屋@pbn-catv"))
{
GeoStyle g=new GeoStyle();
g.setLineColor(Color.GRAY);
g.setLineWidth(0.1);
LayerSettingVector lsv=new LayerSettingVector();
lsv.setStyle(g);
layer.setAdditionalSetting(lsv);
}
map.open(mapName);//打開地圖
Dimension d=newDimension(cib.getMapTileWidth(),cib.getMapTileHeight());
map.setImageSize(d);
double scale=cib.getInitMapScale();
map.setScale(scale);
Rectangle2D r=new Rectangle2D(cib.getMapInitPosition_Left(),cib.getMapInitPosition_Bottom(),cib.getMapInitPosition_Right(),cib.getMapInitPosition_Top());
map.setViewBounds(r);
public void maptoTiles(){}//切圖。
String path=cib.getMapOutputPath();//圖片存儲路徑
{map.outputMapToPNG(path+"\\\\1\\\\"+"1_0_0", true);//輸為PNG圖片
logger.info("The 1 layer has been completed!");//切圖完成
private void close(){}//使用完數據源,工作空間,地圖后,進行釋放。
2.2.2實現結果
根據SuperMap GIS中的沈陽市地圖信息,對其進行標準圖片的生成,根據本文地理信息標準圖片生成算法可知:當切圖等級為n時,輸出的圖片數量是2n-1×2n-1,即當切圖等級設置為3時輸出的圖片數量16張,以此類推。
3結論
立足有線電視網絡管理中的地圖調用效率低下問題,提出了一種基于GIS的地圖瓦片生成算法,采用該算法可實現對地圖的精細化切割,自由度較大,同時基于該算法生成的地圖具有瀏覽、查詢、地理分析等功能,極大地提高了網絡管理效率,測試效果良好,能夠滿足有線電視網絡管理需求。
參考文獻:
[1]巫細波,胡偉平.Google Maps運行機制以及應用研究[J].華南師范大學(自然科學版),2009(2):106-110 .
[2]張康壽,等.基于RIA和Web Services的WebGIS系統的開發[J].地理空間信息:2009.
[3]耿慶齋,繆綸,段媛媛,等.基于Google Maps API的地圖服務系統研究及應用[J].中國水利水電科學研究院學報,2009(3):62-66.
[4]劉冰,謝軻,陳小樂,等.基于GIS的瓦片式地圖切圖算法的設計與實現[J].科技信息,2011(7):60-61.
[5]王小軍,劉璐.基于ArcGIS Engine進行瓦片式切圖的技術研究[J].測繪與空間地理信息, 2010(8).
基金項目:徐州市科技計劃項目(No. KC16GX038)。
作者簡介:張鐵(1970.12-),男,高級工程師,研究方向為網絡管理.