背景
????現(xiàn)在我們的數(shù)據(jù)量越來越來越大挽霉,往往會有短時間渲染大量數(shù)據(jù)的要求,但是往往這些數(shù)據(jù)過大難以實(shí)時處理琼富,整體切片花費(fèi)時間又過長判没。在這里提出一種緩存加實(shí)時處理的方案蜓萄。
準(zhǔn)備
????軟件環(huán)境,PostGIS(3.0.0rc2 r17909)和 PostgreSQL( 12.0, compiled by Visual C++ build 1914, 64-bit)哆致,數(shù)據(jù)是微軟開源的房屋數(shù)據(jù)绕德。PostGIS3.0相對與PostGIS 2.5大幅度提升矢量切片性能患膛,并行環(huán)境表現(xiàn)更好摊阀。
預(yù)處理
????預(yù)處理就是將3級到12級的矢量切片事先切好。首先獲取數(shù)據(jù)12級的最大最小xyz踪蹬,通過這個范圍生成網(wǎng)格胞此,然后和數(shù)據(jù)相交得到一一對應(yīng)的關(guān)系表a。
????接下來就是使用四叉樹鍵(quadkey)跃捣,四叉樹有一些有意思的特性漱牵。第一,四叉樹鍵的長度等于該瓦片所對應(yīng)的圖像級別疚漆;第二酣胀,每個瓦片的四叉樹鍵的前幾位和其父瓦片(上一圖像級別所對應(yīng)的瓦片)的四叉樹鍵相同刁赦,下圖中,第1級的 '瓦片2' 是第2級的 '瓦片20' 至 '瓦片23' 的父瓦片闻镶,第2級的 '瓦片13' 是 第3級的 '瓦片130' 至 '瓦片133' 的父瓦片甚脉。通過四叉樹的這個特性把3到11級的xyz和11級的xyz建立對應(yīng)關(guān)系表b,最終a和b關(guān)聯(lián)可以得到三到十一級和數(shù)據(jù)的對應(yīng)關(guān)系铆农。
????根據(jù)上述內(nèi)容牺氨,我們就可以生成行矢量切片了,借助golang并發(fā),千萬級面數(shù)據(jù)預(yù)處理(加上gzip壓縮)大概需要16分鐘墩剖。
后臺服務(wù)
????預(yù)處理矢量切片生成完以后猴凹,使用golang把矢量切片全部加載進(jìn)程序中,并且建立鍵值對岭皂,能夠快速的判斷請求的xyz在3-11級是否有數(shù)據(jù)并且存在數(shù)據(jù)時能快速獲取郊霎。當(dāng)數(shù)據(jù)請求大于十一級時候,我們使用數(shù)據(jù)庫查詢方式獲取矢量切片爷绘。后臺編寫時候遇到問題歹篓,后端向前端傳輸大的矢量切片速度過慢。我通過數(shù)據(jù)切割方式解決這個問題揉阎。打個比方庄撮,吃一個西瓜,你一口吃不下毙籽。那我們是不是切成塊吃就可以洞斯?切塊就是數(shù)據(jù)分割這樣能較快的傳輸又不影響數(shù)據(jù)完整性。
渲染
????前臺渲染使用mapbox gl加載自定義矢量切片
總結(jié)
????本文方案中使用緩存少量層級提升整體渲染速度坑赡,實(shí)際前端瀏覽中能較為流暢烙如。由于數(shù)據(jù)限制,方案的測試數(shù)據(jù)較為單一毅否,可能不具有代表性亚铁。本方案預(yù)處理切片層級不宜過大,超過12級預(yù)處理性能會急劇降低螟加。
參考資料:
https://www.runoob.com/python/python-func-memoryview.html
https://stackoverflow.com/questions/45455121/python-convert-memoryview-to-string
https://docs.objectrocket.com/redis_python_examples.html
https://stackoverflow.com/questions/18655648/what-exactly-is-the-point-of-memoryview-in-python
https://blog.csdn.net/why_not2007/article/details/79062351
http://www.reibang.com/p/443719f604a2
https://docs.microsoft.com/en-us/bingmaps/articles/bing-maps-tile-system?redirectedfrom=MSDN
https://github.com/Microsoft/USBuildingFootprints
https://github.com/buckhx/QuadKey/blob/master/quadkey/tile_system.py
https://github.com/CartoDB/python-quadkey
https://www.cnblogs.com/xwgli/archive/2013/04/12/3016345.html
https://stackoverflow.com/questions/415511/how-to-get-the-current-time-in-python
http://postgres.cn/docs/postgis-2.3/ST_SetSRID.html
https://postgis.net/docs/manual-dev/ST_TileEnvelope.html
https://postgis.net/docs/manual-dev/ST_AsMVTGeom.html
https://postgis.net/docs/ST_AsMVTGeom.html
https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames
https://www.postgresql.org/docs/9.5/gist-builtin-opclasses.html
https://www.postgresql.org/docs/9.5/gist-intro.html
https://blog.csdn.net/xk_zhang/article/details/52014737
https://www.cnblogs.com/LCGIS/archive/2013/03/12/2954898.html
https://blog.csdn.net/Happy52Wang/article/details/90022686
https://blog.csdn.net/a624806998/article/details/87092890
http://www.dongcoder.com/detail-1195214.html
https://www.cnblogs.com/520zm/p/10743224.html
https://pynative.com/psycopg2-python-postgresql-connection-pooling/
http://initd.org/psycopg/docs/pool.html
https://www.v2ex.com/t/351734
https://www.cnblogs.com/kaituorensheng/p/4445418.html
https://blog.csdn.net/kanon122500000/article/details/61198902