【譯】 矢量切片大小優(yōu)化指南

??在Observable Vector Tile Dissector 一文中笆制,我評估了不同的矢量切片供應(yīng)商提供的切片大小。文中提到的一些限制,其實是完全隨機選擇的选调,依據(jù)的是我豐富的經(jīng)驗積累……但如何才能真正減小切片大械亍俯抖?我將嘗試優(yōu)化自己的矢量切片并逐步解釋臂容。

??以下所有空間數(shù)據(jù)均基于 OpenStreetMap嗅剖,投影為web 墨卡托 (EPSG:3857) 忆蚀,并托管于PostGIS 數(shù)據(jù)庫矾利。

長話短說

??使用一些方法后姑裂,我們可以將給定矢量切片的大小減小到原始大小的 14%。


??這些“無損”的方法是:

  • 移除不使用的數(shù)據(jù)
  • 減小緩沖區(qū)
  • 合并要素
  • 壓縮

現(xiàn)狀

??選擇兩個不同縮放級別的切片男旗,讓我們觀察一下它們的大胁案:

切片 14/8717/5683.mvt 10/544/355.mvt
大小 64 KiB (64984 Bytes) 352 KiB (359820 Bytes)
原始數(shù)據(jù)
渲染后

??數(shù)據(jù)本身已經(jīng)根據(jù)縮放層級進行了刪減,并且還概化 [1] 了(降低空間復(fù)雜性)低縮放級別的要素察皇。還能搞點啥茴厉?

Identifier

?? 讓我們看看切片里都有啥:

??我們看到許多存儲為數(shù)字的 ID。z10這個層級大概有幾千個什荣。然而當前配圖并沒有用到 ID矾缓,因此我們可以從Layer Schema中刪除對 osm_id/id 的所有引用:

??看看結(jié)果如何:


??數(shù)字類型的屬性少了很多,切片大小也顯著減欣6谩:

Tile 14/8717/5683.mvt 10/544/355.mvt
原始切片 64 KiB (64984 Bytes) 352 KiB (359820 Bytes)
移除Id 51 KiB (51966 Bytes) 278 KiB (283677 Bytes)
相對大小 80% 79%

??Nice!僅僅是刪除Id————這個未使用的屬性而账,大小就減少了約 20%!

??然而在某些情況下掛載ID字段是有意義的因篇,例如需要根據(jù)ID從切片中提取數(shù)據(jù)(比如通過OnClick()事件)看哈這個Azure Maps

??Anyway泞辐,咱們再壓榨點空間試試。

Tile Buffer

??最近我寫過一篇關(guān)于切片緩沖區(qū)的文章竞滓。目前我緩沖大小為256咐吼。試著減小到64:

切片 14/8717/5683.mvt 10/544/355.mvt
原始數(shù)據(jù)
渲染后

??沒有出現(xiàn)visual artefacts,但切片也沒小多少商佑。意料之中锯茄。

Tile 14/8717/5683.mvt 10/544/355.mvt
previous step 51 KiB (51966 Bytes) 278 KiB (283677 Bytes)
64 coordinate unit buffer 50 KiB (51114 Bytes) 276 KiB (282250 Bytes)
relative size 98% 99%

Merge

??看看縮放層級為10時的其他統(tǒng)計數(shù)據(jù):


??可以發(fā)現(xiàn):

??公路和鐵路層占所有要素的 87%。
??這些要素中超過 95% 僅包含 2 個點茶没。
??讓我們隨機選一條道路并檢查一下數(shù)據(jù)庫:

SELECT 
    ST_NPoints(geometry) as points, 
    geometry 
FROM import.roads_gen10 
where (geometry && ST_Transform(ST_MakeEnvelope(11.2500, 47.9899, 11.6016, 48.2247, 4326), 3857)) AND ref = 'St 2345' order by points DESC;
image.png

??將這條道路在 postgis 中編碼為矢量切片:

SELECT
    length(ST_AsMVT(q, 'roads', 4096, 'geom')) as length
FROM
    (
    SELECT
        ST_AsMVTGeom(
            geometry,
            ST_Transform(ST_MakeEnvelope(11.2500, 47.9899, 11.6016, 48.2247, 4326), 3857), 
            4096, 
            1) AS geom
    FROM
        import.roads_gen10
    WHERE
        (geometry && ST_Transform(ST_MakeEnvelope(11.2500, 47.9899, 11.6016, 48.2247, 4326), 3857))
        AND ref = 'St 2345' ) AS q;

??看一下結(jié)果:

Name Value
length 1639

??這么說來肌幽。該切片中一條由 112 個單獨的 LineString 組成的連續(xù)道路,編碼為矢量瓦片后抓半,占用了 1639 字節(jié)空間喂急。而這112條LineString中,大部分(104條)都只有兩個點笛求。

??如果我們 使用ST_LineMerge() 將只有 兩個個 點的 LINESTRING 合并為一個大的 MULTILINESTRING 會發(fā)生什么廊移?

SELECT
    length(ST_AsMVT(q, 'roads', 4096, 'geom')) AS length
FROM
    (
    SELECT
        ST_AsMVTGeom(
            ST_LineMerge( ST_Collect(geometry) ),
            ST_Transform(ST_MakeEnvelope(11.2500, 47.9899, 11.6016, 48.2247, 4326), 3857), 
            4096, 
            0) AS geom
    FROM
        import.roads_gen10
    WHERE
        (geometry && ST_Transform(ST_MakeEnvelope(11.2500, 47.9899, 11.6016, 48.2247, 4326), 3857))
        AND ref = 'St 2345' ) as q;

??results in:

Name Value
length 398

??So,僅僅是合并 LINESTRINGs 我們就將這條路的大小減少了 75%。背后的原理是探入,每次繪制一條新的 LINESTRING 狡孔,必須先將cursor移動到該LineString的起點,才能開始繪制蜂嗽。如果新Linestring的起點與上一個LineString的終點相同苗膝,則可以省略。也許我會寫另一篇文章來詳細解釋植旧。在此之前荚醒,請參閱 Vector Tile 規(guī)范芋类。

??Anyway,在真實場景中試試:


??干得漂亮界阁!現(xiàn)在我們的切片里的要素又少又大。我們也可以合并其他一些LineStrings,例如waterways圖層胖喳。

??其實面圖層也可以采用這種方法泡躯。我們還可以使用 ST_Union()函數(shù) 將切片內(nèi)的所有建筑物多邊形合并為一個大的MultiPolygon,而且效果不錯丽焊,尤其是在低縮放級別的情況下:

Tile 14/8717/5683.mvt 10/544/355.mvt
上一步驟 50 KiB (51114 Bytes) 276 KiB (282250 Bytes)
合并要素后 31 KiB (31518 Bytes) 73 KiB (74081 Bytes)
相對大小 62% 26%

??要使用此功能较剃,您需要指定一個新的屬性 (geom_query) 并對所有的keys施加group by:

image.png

??請記住,這些合并操作代價不菲技健,有可能會減慢未緩存的訪問写穴。

GZIP

??在減小了數(shù)據(jù)編碼為切片的大小后,我們可以使用壓縮算法進一步減小大小雌贱。所有可用的瀏覽器都支持 GZIP啊送,因此無需擔心兼容性問題。


image.png
Tile 14/8717/5683.mvt 10/544/355.mvt
上一步驟 31 KiB (31518 Bytes) 73 KiB (74081 Bytes)
壓縮后 22 KiB (22382 Bytes) 49 KiB (50061 Bytes)
相對大小 71% 68%

??這不僅有助于節(jié)省存儲成本欣孤,還可以縮短最終用戶的加載時間馋没。

Summary

Tile 14/8717/5683.mvt 10/544/355.mvt
Orignal 64 KiB (64984 Bytes) 352 KiB (359820 Bytes)
移除Id 51 KiB (51966 Bytes) 278 KiB (283677 Bytes)
調(diào)整Buffer后 50 KiB (51114 Bytes) 276 KiB (282250 Bytes)
合并要素后 31 KiB (31518 Bytes) 73 KiB (74081 Bytes)
相對大小 48% 21%
gzip壓縮后 22 KiB (22382 Bytes) 49 KiB (50061 Bytes)
相對大小 34% 14%

??渲染圖顯示出一些細微差異,主要原始是某些要素的排序發(fā)生了變化:

Tile 14/8717/5683.mvt 10/544/355.mvt
之前
64KiB
352KiB
之后
31KiB
73KiB

??通過分析矢量切片及其空間數(shù)據(jù)降传,我們能夠?qū)⑹噶壳衅瑴p小到原始大小的 21%(算上壓縮的話篷朵,14%),同時并沒有降低視覺體驗婆排。這些方法適用于幾乎所有矢量切片服務(wù)器声旺。

??我期待更多關(guān)于如何進一步減小切片大小的想法。

參考

原文鏈接:Optimizing vector tile size(cyclemap.link)


  1. 譯者注:generalize 段只,概化腮猖。是降低空間要素復(fù)雜度的一類計算。See 概化 ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末翼悴,一起剝皮案震驚了整個濱河市缚够,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鹦赎,老刑警劉巖谍椅,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異古话,居然都是意外死亡雏吭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門陪踩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杖们,“玉大人悉抵,你說我怎么就攤上這事栓拜∨吓桑” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵鲤屡,是天一觀的道長孝治。 經(jīng)常有香客問我列粪,道長,這世上最難降的妖魔是什么谈飒? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任岂座,我火速辦了婚禮,結(jié)果婚禮上杭措,老公的妹妹穿的比我還像新娘费什。我一直安慰自己,他們只是感情好手素,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布鸳址。 她就那樣靜靜地躺著,像睡著了一般刑桑。 火紅的嫁衣襯著肌膚如雪氯质。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天祠斧,我揣著相機與錄音闻察,去河邊找鬼。 笑死琢锋,一個胖子當著我的面吹牛辕漂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吴超,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼钉嘹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鲸阻?” 一聲冷哼從身側(cè)響起跋涣,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸟悴,沒想到半個月后陈辱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡细诸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年沛贪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡利赋,死狀恐怖水评,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情媚送,我是刑警寧澤中燥,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站季希,受9級特大地震影響褪那,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜式塌,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望友浸。 院中可真熱鬧峰尝,春花似錦、人聲如沸收恢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伦意。三九已至火窒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間驮肉,已是汗流浹背熏矿。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留离钝,地道東北人票编。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像卵渴,于是被迫代替她去往敵國和親慧域。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容