李 靜,朱秀麗 ,周治武
(1. 中南大學(xué),湖南 長沙 410083;2. 國家基礎(chǔ)地理信息中心,北京 100830)
隨著網(wǎng)絡(luò)地圖技術(shù)的不斷發(fā)展、地理數(shù)據(jù)獲取方式的增多,地圖制圖與可視化領(lǐng)域面臨著用戶大眾化,地圖數(shù)據(jù)多樣化海量化,地圖樣式個性化的挑戰(zhàn)?;谑噶客咂脑诰€制圖技術(shù)[1]為這些難題提供了新的解決方案:將海量多樣性的地理數(shù)據(jù)緩存為矢量瓦片金字塔,然后由地圖渲染引擎(Mapnik等)按照配置樣式實(shí)現(xiàn)地圖的實(shí)時在線渲染。將多類型的地理數(shù)據(jù)統(tǒng)一到矢量瓦片,化整為零,解決了數(shù)據(jù)海量化多樣化的問題,依照自定義地圖樣式的實(shí)時渲染滿足了用戶大眾化、地圖樣式個性化的需求。但是基于矢量瓦片的在線制圖技術(shù)還存在許多問題,尤其是注記的標(biāo)注存在重要注記被次要注記壓蓋,同級注記之間互相壓蓋等問題,嚴(yán)重影響了地圖的可讀性和信息傳遞功能,因此,優(yōu)化注記的標(biāo)注,提高注記標(biāo)注質(zhì)量具有重要意義。本文基于矢量瓦片的數(shù)據(jù)結(jié)構(gòu)及Mapnik地圖渲染引擎,研究了注記的標(biāo)注問題。
地圖注記的主要作用是反映地理對象的名稱和某些數(shù)量以及質(zhì)量特征[2],由于其描述主體—地理事物和現(xiàn)象具有明顯的層次概念,因此地圖注記也具有明顯的層次性[3]。地圖注記的層次性體現(xiàn)在兩個方面:重要性與類別。在重要性方面,由于地圖圖幅有限、地圖的負(fù)載量一定,要在有限的圖幅范圍內(nèi)表達(dá)盡量多的地理信息,必然要對所要表達(dá)的地理要素進(jìn)行取舍,選擇較大的具有重要意義的進(jìn)行標(biāo)注,忽略較小的不重要的地理要素[4]。在類別方面,相同類別要素的注記風(fēng)格要統(tǒng)一[5],不同類別要素注記之間要有明顯的差異,便于人們的識別與判讀。
注記配置也具有明顯的順序性,包括不同類別要素注記配置的先后順序和同種要素注記配置的先后次序。不同類別要素的注記按照要素對地圖主題的重要程度從高到低進(jìn)行配置,而對于同類要素的注記,優(yōu)先考慮位置選擇余地較少的,后考慮位置選擇余地較大的[3]。
地圖注記是對地圖中圖形要素的解釋與說明[6],注記與圖形符號之間具有明顯的拓?fù)潢P(guān)聯(lián)[7]。面狀要素的注記要盡量在面狀要素以內(nèi),線狀要素的注記要沿著線要素的走向,不允許一組注記分放在線狀要素的兩側(cè),點(diǎn)狀要素的注記要保持與要素的緊密聯(lián)系,通常是環(huán)繞點(diǎn)位進(jìn)行[8]。
本文以Mapnik作為地圖渲染引擎,按照Mapnik XML規(guī)范[9]配置地圖樣式渲染矢量瓦片生成地圖。對于注記的標(biāo)注配置,Mapnik具有以下策略:①地圖注記顯示的優(yōu)先級別受兩方面控制,一是矢量瓦片中注記圖層的疊放順序,二是Mapnik XML樣式配置文件。后者只能控制顯示的開關(guān),前者只能按照從上到下的順序標(biāo)注顯示開關(guān)打開的注記,當(dāng)注記繪制發(fā)生沖突時,后繪制的注記可能因?yàn)樵趫D面上找不到空間而不再標(biāo)注[10]。②注記分為兩種符號:盾標(biāo)符號(ShieldSymbolizer)和文本符號(TextSymbolizer)。盾標(biāo)符號是在一個盾牌中標(biāo)注文字或數(shù)字說明,可用于表示線注記和點(diǎn)注記,如道路編號。文本符號的注記方式(placement)又分為點(diǎn)文本注記(point)和沿線文本注記(line)。對于點(diǎn)文本注記還可以設(shè)置注記避讓算法(placement-type)和環(huán)繞點(diǎn)位的候選標(biāo)注位置(placements)來處理注記沖突,在當(dāng)前位置渲染某個標(biāo)注時,如果與已有注記發(fā)生沖突,就按照候選標(biāo)注位置中的次序逐個嘗試[11]。
為了實(shí)現(xiàn)更加良好的注記顯示效果,本文針對注記的層次性、順序性和拓?fù)湎嚓P(guān)性并按照Mapnik的注記配置策略分別對注記進(jìn)行基于分類與分層的注記配置、基于注記優(yōu)先級的圖層順序配置和基于注記類型的分類優(yōu)化配置,總體框架見下圖。根據(jù)Mapnik的注記配置策略,設(shè)置優(yōu)先級是調(diào)控注記顯示順序的基本手段,且優(yōu)先級的配置以圖層為基礎(chǔ),所以首先進(jìn)行基于分類與分層的注記配置,然后實(shí)現(xiàn)基于分類與分層的注記配置,包括圖層之間優(yōu)先級的配置與同層不同類別注記之間優(yōu)先級的配置。接著從拓?fù)湎嚓P(guān)性方面分別對點(diǎn)注記和線注記進(jìn)行配置與優(yōu)化,從細(xì)節(jié)上對注記進(jìn)行控制。各方法的具體操作與實(shí)現(xiàn)如圖1所示。
圖1 總體框架圖Fig.1 The total frame diagram
依據(jù)地圖的表達(dá)內(nèi)容將注記分為:地名注記、道路注記和水系注記3個類別。再按照注記所表達(dá)要素的幾何類型和形狀將各類別再細(xì)分為點(diǎn)注記和線注記:點(diǎn)狀要素和線狀要素的注記分別為點(diǎn)注記和線注記,如地名點(diǎn)和道路的注記;對于面狀要素的注記,由于面狀要素的形狀大小各異,對于面積小、形狀扁圓的面狀要素,如小的湖泊、面狀水庫,通常用點(diǎn)注記表示,并把面的中心點(diǎn)當(dāng)做點(diǎn)注記的定位點(diǎn),而對于狹長(如面狀河流)或面積較大、形狀不規(guī)則的面狀地物(如面積較大的湖泊、行政區(qū)域)在中心點(diǎn)位置標(biāo)注不能反映面狀要素的空間分布形態(tài)特征、延伸方向和范圍,通常提取該面狀要素的骨架線作為線注記的定位參考線[7]。經(jīng)過兩次分類,地圖注記被分為地名點(diǎn)注記、行政區(qū)域線注記、道路線注記、水系線注記和水系點(diǎn)注記5個圖層。
在注記的順序性方面,不同注記圖層的優(yōu)先級別可以通過控制圖層在矢量瓦片中的疊放順序?qū)崿F(xiàn),其中地名點(diǎn)注記和行政區(qū)域線注記更加重要,所以地名點(diǎn)注記和行政區(qū)域線注記優(yōu)先級最高,其次是道路線注記和水系線注記,然后是水系點(diǎn)注記;而同一注記圖層中不同小類之間也存在著優(yōu)先級別的差異,如地名點(diǎn)注記圖層中省會城市注記的優(yōu)先級要高于普通市、縣,其注記優(yōu)先級要通過同圖層注記數(shù)據(jù)寫入矢量瓦片的順序和Mapnik XML地圖配置樣式控制。因此在寫入矢量瓦片之前,先將注記圖層按照優(yōu)先級從高到低的順序從上到下依次疊放,并將同一注記圖層的注記數(shù)據(jù)按照優(yōu)先級從高到低進(jìn)行排序,依次寫入。
為得到較好的顯示效果,根據(jù)線注記和點(diǎn)注記的各自特性,利用postgis工具對注記圖層進(jìn)行一系列的處理。
對于線注記層,要經(jīng)過如下處理:
①注記定位參考線的提取。道路線注記是從道路線圖層提取含有名稱與道路編號的要素,水系線注記的定位參考線是提取有名稱的線狀河流和面狀河流的骨架線,行政區(qū)劃線注記是提取行政區(qū)劃面的骨架線。
②合并處理。線注記的繪制以線段為單位,當(dāng)線段比較破碎而注記字段較長時,會出現(xiàn)只標(biāo)注部分文本的情況,因此要依據(jù)名稱屬性合并定位參考線中的破碎的線段。
③化簡處理。定位參考線只是標(biāo)示注記的走向,并不需要很高的精度,為了減少瓦片的大小,利用postgis的要素化簡函數(shù)(st_simplify)對其進(jìn)行抽稀處理。
對于點(diǎn)注記,通過配置環(huán)繞點(diǎn)位的標(biāo)注位置,雖然可以從一定程度上解決注記沖突問題,但是每次都從同一位置開始嘗試很容易導(dǎo)致注記聚集分布,不僅影響注記的標(biāo)注,還不利于地圖的美觀[12]。為了使注記分布的更加合理,為每個注記添加一個屬性dir,其屬性值為隨機(jī)函數(shù)(random)產(chǎn)生的一個隨機(jī)數(shù)(0或1)。在配置樣式時,為每個隨機(jī)數(shù)設(shè)置一個候選標(biāo)注位置序列,如當(dāng)dir為0時,設(shè)置注記的候選標(biāo)注位置序列為N、E、S、W,而當(dāng)dir等于1時,將注記的候選標(biāo)注位置序列設(shè)為N、W、S、E。這樣可以使注記標(biāo)注位置的選擇具有更多的隨機(jī)性,讓注記分布更加均衡。
在點(diǎn)注記與線狀要素的拓補(bǔ)關(guān)系方面,地名注記應(yīng)盡量不壓蓋主要道路且最好與被注記要素位于道路的同側(cè),而當(dāng)注記點(diǎn)位于兩條道路之間時優(yōu)先考慮對重要程度更高的道路的避讓。為了達(dá)到這個效果,為點(diǎn)注記圖層添加一個屬性字段,表示該點(diǎn)注記與離它最近的主要道路(高速、國道、省道)形成的方位角,然后按方位角的大小,設(shè)置注記的候選標(biāo)注位置,見表1。為了使用方便,在postgis中添加一個自定義函數(shù)計(jì)算其屬性值,計(jì)算過程為:在該點(diǎn)(P1)的半徑為100 m的緩沖區(qū)內(nèi)查找一條與它距離最近且道路級別較高的主要道路,然后在該主要道路上尋找一個與P1點(diǎn)距離最近的點(diǎn)P2,并計(jì)算P2到P1連線的方位角(0~360)。
表1 方位角與候選標(biāo)注位置的關(guān)系Tab.1 The relationship between the azimuth and placemnt
將收集到的公開地理數(shù)據(jù)進(jìn)行處理,按照上述方法進(jìn)行分類、分層,圖層順序配置并按照注記類型分別對點(diǎn)、線、面注記分類優(yōu)化配置,然后依據(jù)配置將其切割為矢量瓦片,并依照Mapnik XML樣式規(guī)范自定義地圖樣式,經(jīng)Mapnik地圖渲染引擎渲染后得到的顯示結(jié)果與優(yōu)化前的地圖顯示效果見如圖2所示。
圖2 (a)優(yōu)化后的注記效果Fig.2 (a)The effect after label optimization
圖2 (b)優(yōu)化前的注記效果Fig.2 (b)The effect before label optimization
對比優(yōu)化前和優(yōu)化后的注記標(biāo)注顯示效果(尤其是紅圈部分),可以看出地名注記在標(biāo)注時對主要道路(中間的兩條)實(shí)現(xiàn)了規(guī)避,注記不再壓蓋主要道路,而是標(biāo)注于道路兩側(cè)且注記與被標(biāo)注元素位于同側(cè),達(dá)到了比較好的地圖顯示效果,表明該方法可以實(shí)現(xiàn)滿足拓?fù)潢P(guān)系的注記標(biāo)注。
本文針對矢量瓦片在線制圖過程中的注記自動標(biāo)注問題,從矢量瓦片的組織和Mapnik XML地圖樣式配置兩方面研究,提出了一系列注記配置優(yōu)化方法。實(shí)驗(yàn)結(jié)果表明,經(jīng)該方法優(yōu)化后的注記標(biāo)注在注記沖突和美學(xué)平衡方面都有較大提高,且簡單易行,可操作性及實(shí)踐性比較強(qiáng)。但是矢量瓦片制圖在實(shí)際應(yīng)用中還存在很多其他問題,如地圖邊緣的注記被切割、注記的自動化標(biāo)注對瓦片依賴較大等。下一步的研究工作:解決地圖邊緣處注記被切割的問題,減少矢量瓦片方面的操作,從算法方面改進(jìn)Mapnik渲染引擎的注記自動配置功能。