背景
????現在我們的數據量越來越來越大,往往會有短時間渲染大量數據的要求,但是往往這些數據過大難以實時處理,整體切片花費時間又過長。在這里提出一種緩存加實時處理的方案。
準備
????軟件環境,PostGIS(3.0.0rc2 r17909)和 PostgreSQL( 12.0, compiled by Visual C++ build 1914, 64-bit),數據是微軟開源的房屋數據。PostGIS3.0相對與PostGIS 2.5大幅度提升矢量切片性能,并行環境表現更好。
預處理
????預處理就是將3級到12級的矢量切片事先切好。首先獲取數據12級的最大最小xyz,通過這個范圍生成網格,然后和數據相交得到一一對應的關系表a。
????接下來就是使用四叉樹鍵(quadkey),四叉樹有一些有意思的特性。第一,四叉樹鍵的長度等于該瓦片所對應的圖像級別;第二,每個瓦片的四叉樹鍵的前幾位和其父瓦片(上一圖像級別所對應的瓦片)的四叉樹鍵相同,下圖中,第1級的 '瓦片2' 是第2級的 '瓦片20' 至 '瓦片23' 的父瓦片,第2級的 '瓦片13' 是 第3級的 '瓦片130' 至 '瓦片133' 的父瓦片。通過四叉樹的這個特性把3到11級的xyz和11級的xyz建立對應關系表b,最終a和b關聯可以得到三到十一級和數據的對應關系。
????根據上述內容,我們就可以生成行矢量切片了,借助golang并發,千萬級面數據預處理(加上gzip壓縮)大概需要16分鐘。
后臺服務
????預處理矢量切片生成完以后,使用golang把矢量切片全部加載進程序中,并且建立鍵值對,能夠快速的判斷請求的xyz在3-11級是否有數據并且存在數據時能快速獲取。當數據請求大于十一級時候,我們使用數據庫查詢方式獲取矢量切片。后臺編寫時候遇到問題,后端向前端傳輸大的矢量切片速度過慢。我通過數據切割方式解決這個問題。打個比方,吃一個西瓜,你一口吃不下。那我們是不是切成塊吃就可以?切塊就是數據分割這樣能較快的傳輸又不影響數據完整性。
渲染
????前臺渲染使用mapbox gl加載自定義矢量切片
總結
????本文方案中使用緩存少量層級提升整體渲染速度,實際前端瀏覽中能較為流暢。由于數據限制,方案的測試數據較為單一,可能不具有代表性。本方案預處理切片層級不宜過大,超過12級預處理性能會急劇降低。
參考資料:
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.lxweimin.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