近年來,新技術(shù)的不斷涌現(xiàn),使得網(wǎng)頁功能更加豐富。數(shù)字地圖創(chuàng)造性地將傳統(tǒng)地圖與網(wǎng)頁相結(jié)合,極大豐富和方便了人們的生活。從最初的“無縫”圖片發(fā)展到現(xiàn)在的二維、三維,數(shù)字地圖,以其特有的優(yōu)勢(shì),得到了人們?cè)絹碓蕉嗟那嗖A。
在用戶體驗(yàn)上,數(shù)字地圖為用戶提供了一種新的信息查詢方式,信息顯示更精準(zhǔn)全面,而查詢結(jié)果通常都是以標(biāo)記形式展現(xiàn),用戶的可視區(qū)域有限,如何在當(dāng)前縮放級(jí)別下,利用最小的區(qū)域展示出最全面的信息,而又不產(chǎn)生重疊覆蓋,就要利用到標(biāo)記聚合技術(shù),這也正是文章討論的中心。
一個(gè)開發(fā)地圖應(yīng)用的快捷方法是利用第三方的API。運(yùn)用美國(guó)衛(wèi)星航拍技術(shù)的Google地圖,以及與交通部門合作的百度地圖這兩個(gè)地圖服務(wù)商都為應(yīng)用程序開發(fā)者提供了API。Google與百度的API文檔相對(duì)其他服務(wù)商提供的文檔來說,更完備、詳盡、簡(jiǎn)潔,并且給出了很多學(xué)習(xí)示例,非常適合初學(xué)者學(xué)習(xí)開發(fā)。Google更精準(zhǔn),精確度達(dá)小數(shù)點(diǎn)后14位,而百度地圖則是小數(shù)點(diǎn)后6位。但由于Google的ICP牌照已失效,因此理論上谷歌不能再向中國(guó)用戶提供Google Map和Google Earth服務(wù)了,所以文章最終采用百度Map API實(shí)現(xiàn)。
為了減小計(jì)算量,以下討論的三種算法只計(jì)算在視圖區(qū)域內(nèi)標(biāo)記點(diǎn),在視圖區(qū)域外的不計(jì)算。
將視圖區(qū)域劃分成若干矩形,矩形的大小視地圖的縮放級(jí)別而定。將同一矩形內(nèi)的標(biāo)記點(diǎn)聚合成一個(gè)聚合標(biāo)記,該聚合標(biāo)記需記錄被聚合的標(biāo)記點(diǎn)個(gè)數(shù)或其他重要的統(tǒng)計(jì)信息。
利用百度地圖API中Map類的getBounds方法,獲取視圖區(qū)域的西南點(diǎn)及東北點(diǎn)的經(jīng)緯度數(shù)據(jù),并根據(jù)當(dāng)前的縮放級(jí)別確定出矩形大小,綜合這三個(gè)數(shù)據(jù)計(jì)算得出各個(gè)矩形的邊界。
現(xiàn)矩形劃分已定,需要解決標(biāo)記點(diǎn)的經(jīng)緯度到所在矩形區(qū)域的對(duì)應(yīng)問題。有個(gè)直接的方法是將每一個(gè)標(biāo)記點(diǎn)依次與視圖中的矩形區(qū)域邊界比較,直到有一個(gè)匹配的為止。這種方法簡(jiǎn)單,但費(fèi)時(shí),實(shí)驗(yàn)中采用一種時(shí)間復(fù)雜度比較低的算法。
首先將視圖視為2維數(shù)組,按從上到下從左到右的順序依次對(duì)矩形編號(hào),以lngDiff代表一個(gè)矩形所跨域的經(jīng)度,以latDiff代表一個(gè)矩形所跨域的緯度,以swp代表視圖區(qū)域的西南點(diǎn),利用Math庫提供的下取整函數(shù)Math.floor,則點(diǎn)point所在的矩形行標(biāo)為:Math.floor((nep.lat-point.lat)/latDiff),列標(biāo)為:Math.floor((point.lngswp.lng)/lngDiff),這樣就找到了標(biāo)記點(diǎn)到矩形的對(duì)應(yīng)關(guān)系。對(duì)應(yīng)關(guān)系找到,標(biāo)記點(diǎn)的分類與聚合就可以順利完成。下一步就需要確定聚合點(diǎn)的顯示位置。
聚合點(diǎn)在矩形的顯示位置需要考慮當(dāng)前的縮放級(jí)別,若縮放級(jí)數(shù)低,為避免聚合點(diǎn)重疊,可以將聚合點(diǎn)顯示在矩形正中;若縮放級(jí)別高,則可選取矩形內(nèi)某個(gè)標(biāo)記點(diǎn)的位置為聚合點(diǎn)的顯示位置,這個(gè)標(biāo)記點(diǎn)可以簡(jiǎn)單的選取遇到的第一個(gè)標(biāo)記點(diǎn),也可以選取最靠近矩形中心的標(biāo)記點(diǎn),或者可以根據(jù)標(biāo)記點(diǎn)內(nèi)容,選取最重要的點(diǎn)。
實(shí)驗(yàn)中選取矩形中心為聚合點(diǎn)的目標(biāo)位置。圖1、圖2分別為使用聚合算法前后標(biāo)記點(diǎn)的顯示情況,可以看出,聚合后的信息呈現(xiàn)更加簡(jiǎn)潔豐富。選取矩形中心為聚合點(diǎn)的顯示位置,可以避免出現(xiàn)圖3所示的情況,圖3中由于[3]
[2]矩形及[3][3]矩形的聚合點(diǎn)位置隨機(jī)選取為矩形內(nèi)的某個(gè)標(biāo)記點(diǎn)位置,而恰巧這兩個(gè)標(biāo)記點(diǎn)相鄰,這就使得聚合點(diǎn)發(fā)生覆蓋,信息無法讀出。
基于矩形的標(biāo)記點(diǎn)聚合實(shí)現(xiàn)簡(jiǎn)單,但不夠靈活?,F(xiàn)實(shí)應(yīng)用中,標(biāo)記點(diǎn)多與國(guó)家地區(qū)相聯(lián)系,因此聚合時(shí),常需要考慮標(biāo)記點(diǎn)間的距離。
首先需要解決地球表面上兩點(diǎn)間距離的計(jì)算問題。通常在不要求特別精確的情況下,將地球視為正球體,而實(shí)際上地球是個(gè)兩頭略扁的橢球體,因此實(shí)驗(yàn)中得出的距離是個(gè)近似距離。在球面幾何中,定義正球體表面兩點(diǎn)間的距離為經(jīng)過這兩點(diǎn)的大圓所在的劣弧長(zhǎng),如圖4中弧AB即為A、B兩點(diǎn)間的距離。以 表示∠AOB的弧度,以R表示地球半徑,則根據(jù)弧長(zhǎng)公式得到:A、B兩點(diǎn)間的距離為R。這樣,選取某個(gè)標(biāo)記點(diǎn)為基點(diǎn),則其他點(diǎn)到基點(diǎn)的距離都可以得到。
以絕對(duì)距離劃分標(biāo)記點(diǎn)存在一個(gè)問題,在不同縮放級(jí)數(shù)下,同一距離對(duì)應(yīng)不同的像素點(diǎn)數(shù)目,而視圖區(qū)域的像素點(diǎn)數(shù)目是一定的,用戶是以兩點(diǎn)間的像素點(diǎn)數(shù)目來衡量點(diǎn)與點(diǎn)之間的距離,因此以間隔的像素點(diǎn)數(shù)目為標(biāo)準(zhǔn)設(shè)計(jì)聚合算法更合理(圖4)。
圖1 點(diǎn)聚合前
圖2 點(diǎn)聚合后
圖3 聚合點(diǎn)發(fā)生覆蓋
百度地圖API默認(rèn)使用墨卡托投影。選取經(jīng)緯線原點(diǎn)為平面原點(diǎn),即原點(diǎn)位置為赤道與0度經(jīng)線相交的位置。在百度地圖API中,以18級(jí)為平面坐標(biāo)基準(zhǔn)級(jí)數(shù)。已知某點(diǎn)的經(jīng)緯度,利用BMap.MercatorProjection類可獲取該點(diǎn)在18級(jí)下的平面像素坐標(biāo),在其他級(jí)別下的像素坐標(biāo)可通過Math. floor (平面坐標(biāo)×2zoom-18)換算得到,其中zoom代表當(dāng)前縮放級(jí)別。至此,點(diǎn)的經(jīng)緯度坐標(biāo)到像素坐標(biāo)轉(zhuǎn)換完成,點(diǎn)的像素坐標(biāo)已知,則點(diǎn)間的像素距離不難得到。
圖4 地球表面兩點(diǎn)間距離示意圖
圖5 點(diǎn)聚合前
圖6 點(diǎn)聚合后
實(shí)驗(yàn)中,取成都市為基點(diǎn)(經(jīng)緯度坐標(biāo):104.067923,30.679943),到該點(diǎn)的距離小于等于65像素的點(diǎn)被聚合,聚合前后標(biāo)記點(diǎn)情況分別如圖5、6所示。易實(shí)現(xiàn),基于距離的聚合算法則更靈活些。在實(shí)際應(yīng)用中,常在這兩種方法的基礎(chǔ)上增加一些限制條件,更精確的定位及聚合標(biāo)記點(diǎn)。
文章重點(diǎn)介紹了基于視圖矩形的聚合算法及基于距離的聚合算法的原理及實(shí)現(xiàn),基于視圖矩形的聚合算法簡(jiǎn)單
[1]許輝,馬曉鵬. 基于web墨卡托投影地理信息系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn).電腦編程技巧與維護(hù), 2011年第8期
[2]崔文紅. 電子地圖的應(yīng)用及發(fā)展趨勢(shì). 測(cè)繪與空間地理信息, 2008年第3期