徐 亮
(1. 福建省基礎地理信息中心,福建 福州350001)
基于多源地圖服務的專題地圖生成算法
徐 亮1
(1. 福建省基礎地理信息中心,福建 福州350001)

在B/S體系結構下,實現基于地圖切片和ArcGIS Server地圖服務的專題地圖動態生成算法。分析了地圖切片的組織特點及其像素與坐標的轉換方法,運用標準的REST訪問接口和GDI+技術,設計并實現了多尺度、多源數據的裁剪、拼接以及在特定位置渲染地圖要素的算法。并以山東省測量標志動態監管信息系統為例,證明了該方法的可行性。
地圖切片;專題地圖;多源;REST接口;GDI+
數據是GIS研究的基石,分布式地圖服務是人們為了實現數據成果共享而采用的一種技術手段,當前在線電子地圖幾乎都使用分布式切片技術來提供一種低成本、流暢的、數據豐富的在線服務,并且將服務免費共享給其他用戶使用。隨著各種OGC地圖服務標準的制定,網絡上呈現出很多標準化的地圖服務,這些不同來源的地圖數據,使人們有了更多的選擇。然而,有時對地圖切片的簡單瀏覽并不能滿足用戶的特定需求,他們希望利用網絡地圖作為自己的基礎數據,并結合自己的專題業務數據,制作一幅專題地圖,以滿足特定的應用需求。但是,這些服務是基于網絡形式發布的,即便提供了方便的訪問接口,也很難滿足用戶的特殊需求。對此問題,國內的研究絕大多數局限于抓取切片和單數據源切片拼接[1-3]。
專題圖在服務器端生成,客戶端向服務器發送請求,并附帶多源數據相關參數和輸出的專題圖參數,服務器端程序對請求進行處理,根據參數進行相關計算,并從遠程地圖服務器提取地圖數據,然后按一定的規則進行拼接、異源數據疊加、裁剪等數據處理,最后繪制專題地圖輔助要素,并將處理好的結果輸出到客戶端(圖1)。

圖1 專題數據處理流程
1.1 GDI+技術
GDI是Window操作系統的圖形設備接口,它的主要任務是負責系統與繪圖程序之間的信息交換,處理所有Windows程序的圖形輸出。GDI+是GDI的改進版本,是面向對象編程的圖形框架,相對于GDI具有更高的編程效率、更快的繪圖速度、更穩定的內存資源管理。
GDI處理圖像是在Window坐標空間進行的,Window有3種坐標空間,分別為邏輯坐標、設備坐標、物理坐標。GDI+繪圖時,是在邏輯坐標系下進行的,它與地理坐標系不同,它的位置可以由用戶自己設定,和具體的硬件設備無關[4]。它以像素點作為坐標單位,坐標原點可以用戶自行設定,一般在一個圖形畫布的左上角,X軸水平向右為正,Y軸豎直向下為正,與地理坐標系的Y軸方向相反。
目前電子地圖的開發多是基于MapObjects、Mapx等GIS控件或是直接利用高級語言從底層開發,其本質還是利用Windows提供的圖形繪制接口(GDI)編程實現圖形顯示[5]。
1.2 地圖瓦片
地圖瓦片(map tile,又稱“地圖緩存”)是按照一定的數學規則,在預先設定的不同比例尺下,把整個地圖切割成一定規格大小的圖片,并保存圖片副本拷貝到地圖服務器中。當服務器收到客戶端對地圖服務的請求時,就會根據切割和存儲規則,找到圖片并發送到客戶端,從而有效地減輕GIS服務器的負荷,提升地圖瀏覽速度。
瓦片的切割是基于金字塔模型進行的,該模型是一種多分辨率層次模型,從金字塔的底層到頂層,地理范圍不變,但分辨率越來越低。如圖2所示,在切割金字塔瓦片的同時建立線性四叉樹編碼[6],然后發布成符合標準OGC WMTS服務規范的地圖服務。根據這個規范定義的標準接口,可以獲取任意位置的地圖瓦片。

圖2 瓦片金字塔模型[6]
1.3 瓦片索引轉換
瓦片在空間上的組織方式表示為行列號,以左上角為編號原點,定義為(0,0),即行號為0,列號為0,然后行列坐標軸分別向右和向下延伸。在標準OGC的WMTS服務規范中,提供了獲取瓦片的GetTile接口,它需要2個基本參數,即行號和列號,可以根據地圖分辨率和瓦片像素大小計算特定地理范圍所對應的瓦片行列號。首先,根據瓦片地圖服務元數據提供的當前輸出比例尺的地圖分辨率,可以計算出一個切片像素大小 (切片像素大小一般為256×256) 所代表的地理范圍,然后通過地圖范圍和用戶選取的地理范圍,計算出對應的切片坐標范圍。計算公式如下:
picHWDegree = Resolution * picHW
左下點列號=(ExtentXMIN + FullExtentXMAX)/ picHWDegree-1
右上點列號=(ExtentXMAX + FullExtentXMAX)/picHWDegree-1
左下點行號=(FullExtentYMAX - ExtentYMIN)/ picHWDegree-1
右上點行號=(FullExtentYMAX - ExtentYMAX)/picHWDegree-1
其中,Resolution為地圖分辨率;picHW為切片像素長寬;picHWDegree為切片像素大小對應的地理坐標 范 圍;ExtentXMIN、ExtentXMAX、ExtentYMIN、ExtentYMAX為用戶選取范圍的最小x坐標、最大x坐標、最小y坐標、最大y坐標;FullExtentXMAX、FullExtentXMAX、FullExtentYMAX、FullExtentYMAX為地圖范圍的最小x坐標、最大x坐標、最小y坐標、最大y坐標。
1.4 疊加偏移
考慮到算法的一般性原則,采取所有疊加圖和要素添加到專題圖后再進行裁剪的方法。在將非底圖地圖服務數據添加到底圖上時,需要計算X和Y軸的偏移量。如果疊加的是WMS服務或MapServer服務,那么可以輸出一張與用戶選取范圍相同的圖片,這樣只需要考慮左上角的偏移量。WMS或MapServer在ArcGIS Server中,默認輸出最大像素大小為2 048×2 048的圖片,當輸出范圍超過這個像素范圍時,這種情況與輸出的瓦片形式的疊加圖類似,需要先拼接選擇范圍內的所有圖片再進行疊加。左上角偏移像素的計算公式如下:
offsetX =(ExtentXMIN/picHWDegree%1)*picHW
offsetY =(1-( ExtentYMAX/picHWDegree%1))* picHW
1.5 輔助要素的繪制
圖例是地圖上表示地理事物的符號,它有助于用戶更方便地使用地圖、理解地圖內容。圖例包含標題、圖層名、地圖符號及其所代表的值、值范圍或意義,一般放置在一側或一角。圖例的布局按左對齊的方式進行排版,放置在右下角,圖例繪制流程如下:
1)根據圖例內容、間距以及排列方式計算適應的圖例畫布的高度和寬度。
2)通過專題地圖的總長寬和圖例畫布,計算畫布距離左邊界和上邊界的間距,在地圖右下角繪制圖例的矩形畫布。
3)圖例名稱水平居中繪制,因此需要根據名稱字體樣式和字符長度計算圖例名所占空間的高度和寬度,然后根據上一步計算的畫布寬度,得到水平居中的繪制起點。
4) 按一定的行間距換行,左對齊繪制圖層名稱。
5)按一定的行間距換行,繪制圖層符號以及符號注釋文本。
6)按3)和4)的步驟循環繪制出所有圖層的圖例。
PmGSTd1 cDNA全長為977 bp,ORF為720 bp,5′端非編碼區 166 bp,3′端非編碼區 78 bp(圖 1)。該基因編碼 240個氨基酸,N端 1-18號氨基酸(MKHSLALLAIAFLQTAIA)為信號肽(圖1雙劃線部分),可以推測其為 1個分泌蛋白;另外,3′端存在一個可能的AATAAA加尾信號(圖1下劃線部分)。PmGSTd1編碼氨基酸的理化性質如表 1所示,PmGSTd1編碼240個氨基酸,分子質量為27.28 kD;該蛋白呈弱疏水性,結構穩定;等電點為8.41,說明此蛋白在pH=8.41的溶液中最不穩定,溶解度最小。
1.6 拼接、裁剪、疊加的實現
切片或矢量圖片的拼接、疊加、裁剪關鍵在于計算偏移像素,拼接的偏移是根據繪制的切片行列號計算得到的,疊加計算按§1.4中所述思路,裁剪的偏移是要計算左上角和右下角的偏移像素,并根據選取范圍和§1.4中的計算思路計算得到。本研究采用GDI+進行實現,使用到的關鍵類包括System.Drawing.Bitmap、System.Drawing.Image和 System.Drawing.Graphics,前者封裝了一個位圖,Image類保存切片或矢量圖片;后者封裝了一個繪圖圖面,它提供了繪圖的主要方法。以下是實現拼接的示例代碼:
//創建位圖
Bitmap bitmap = new Bitmap(width, height);
//在位圖中創建繪圖圖面
Graphics g = Graphics.FromImage(bitmap);
//設置繪圖參數
g.CompositingQuality = CompositingQuality. HighQuality;
g.InterpolationMode= InterpolationMode. HighQualityBicubic;
g.SmoothingMode = SmoothingMode.HighQuality;
g.Clear(Color.White);
//獲取一個切片,并根據,偏移量和切片長度和寬度,繪制到位圖上
//url服務地址,row,col,是請求的行列號
Image tile = getImage(string.Format(url, row, col))
g.DrawImage(tile,new Rectangle(tileOffsetX,tileOffse tY,picWidth, picWidth));
其中,tileOffsetX=tileOffsetY=當前拼接的切片所在畫布中的行列數×picWidth。Width和Height為畫布的長和寬,是將選取的地理范圍轉換成像素得到的,為一個切片像素大小的整數倍。
本示例調用了天地圖山東的WMTS服務和系統在ArcGIS Server中發布的Map Services服務,通過多源數據疊加融合生成一幅標志點專題地圖,各種數據源的資源訪問均使用Rest訪問接口實現,它暴露的所有資源和操作都可以通過每個GIS服務的端點獲得[7]。WMTS的REST接口如下:
string url =”http://www.sdmap.gov.cn/tileservice/{0}?
SERVICE=WMTS&VERSION=1.0&username=test 123&password=test123&REQUEST=GetTile&LAYER=0 &STYLE=default&FORMAT=mage/png&TILEMATRIX SET=sss&TILEMATRIX={1}&TILEROW={2}&TILEC OL={3}";
其中,{0}為地圖類型變量;{1}為比例尺;{2}和{3}分別為行列號變量。調用以下代碼獲取切片數據:
HttpWebRequest req=(HttpWebRequest)WebRequest. Create(url);
HttpWebResponse resp = (HttpWebResponse)req. GetResponse();
Stream stream = resp.GetResponseStream();
return System.Drawing.Image.FromStream(stream);
Map Services服務的REST接口與之類似,但是需要調用服務的Export操作接口,并調用以上代碼獲取圖片數據。圖3為本項目效果圖,可控制是否輸出圖例。

圖3 生成的專題圖
以天地圖山東地圖服務為背景底圖,以項目的業務數據為專題數據進行處理,可根據用戶需要,依據標準OGC服務接口,生成特定范圍和比例尺、用于特定使用場合的標準專題地圖。結果表明,本方法可以較合理地生成標準專題地圖。
[1] 王曉東,劉慧平,喬瑜.利用Bing Maps地圖切片實現網絡地圖服務[J].國土資源遙感, 2010(2):122-127
[2] 劉亞東,李青元,譚海,等.開源庫GDAL及其在影像拼接中的應用[J].數字技術與應用,2010(2):88-89
[3] 韋勝.ArcEngine環境下實現瓦片地圖的訪問與拼接[J].武漢大學學報:信息科學版,2012(6):737-740
[4] 王社偉,朱如鵬.Windows操作系統中的GDI坐標系統[J].計算機與現代化,2003(4):13-15
[5] 車森,劉海硯,劉輝,等.GDI+在電子地圖可視化中的應用[J].測繪科學,2008(1):226-228
[6] 蘇旭明,譚建成. WebGIS中瓦片地圖關鍵技術研究[J].北京測繪,2012(2):9-12
[7] 許卓明,栗明,董逸生.基于RPC和基于REST的Web服務交互模型比較分析[J].計算機工程,2003,29(20):6-8
P208
B
1672-4623(2015)04-0168-03
10.3969/j.issn.1672-4623.2015.04.060
徐亮,碩士,工程師,研究方向為數據庫技術和GIS應用。
2015-01-22。
項目來源:福建省測繪地理信息科技創新基金資助項目(201309)。