JUST技术:管理海量空间数据的利器-空间填充曲线
現實世界中存在大量的多維空間數據,如加油站位置、河流走向等。為了高效存儲和管理海量的空間數據,很多基于Key-Value存儲的空間數據庫,如開源的空間插件GeoMesa[1]、京東城市自研的時空數據引擎JUST[2],都使用了空間填充曲線技術。它們能夠將多維空間數據轉換到一維空間上,并通過轉換后的一維空間索引值存儲和查詢多維數據,因此能夠在Key-Value數據庫中存儲管理海量的時空數據。本文詳細介紹了幾種常用的空間填充曲線(Z曲線、Hilbert曲線、XZ-Ordering)的映射算法。
一、背景介紹
隨著基礎設施和GPS終端的飛速發展,城市中出現了大量的空間對象。這些空間對象可以分為兩種類型:點空間對象(例如,POI和GPS點)和空間擴展對象(例如道路、軌跡和行政區域)。許多城市應用通過空間范圍查詢來高度依賴于空間對象。例如,要預測空間區域的交通流量,我們應該首先需要檢索位于該區域的軌跡以計算目前的流量。另一個例子是找到區域中POI、道路和其他空間對象以分析其功能。
但是,出于幾個原因,管理空間對象是一項挑戰。首先,空間物體通常固有地具有復雜的結構,因為它們通常包含至少緯度和經度的高維信息。對于空間擴展對象,則更加復雜,因為它們通常具有形狀、大小、面積和其他屬性。其次,空間數據通常具有巨大的規模。例如,每天有60,000多名快遞員生成超過1TB的GPS日志,而NASA衛星數據檔案庫已經超過500TB [3]。具有空間插件的關系數據庫,例如MySQL Spatial、Oracle Spatial或者PostGIS,通常會遇到可伸縮性問題,即當數據量到達一定程度時,系統往往不能工作。研究人員在諸如Spark和Hadoop的分布式平臺中建立了R-tree,Quad-tree或KD-tree之類的空間索引,以管理大量的空間對象,但是它們可能會出現索引占用大量內存的問題。此外,空間物體是連續產生的。當出現新的空間數據時,這些基于Spark和基于Hadoop的空間數據管理系統通常需要從頭開始重建索引以實現良好的查詢效率,這非常耗時。為了克服所有上述問題,一些工作使用空間填充曲線(SFC)[4],例如Z-Ordering[5]、Hilbert[6]、XZ-Ordering[7],將高維的空間信息轉化成了一維信息,在key-value數據庫中管理空間對象。
空間填充曲線是一種降低空間維度的技術,是由意大利科學家皮亞諾于1890年首次構造出來的,并由希爾伯特于1891年正式提出的,之后空間填充曲線就得到了深入的研究和廣泛的應用[5]。空間填充曲線將高維空間數據映射到一維空間,并利用轉換后的索引值存儲和查詢數據。空間填充曲線通過有限次的遞歸操作將多維空間劃分為眾多的網格(如圖1所示),再通過一條連續的曲線經過所有的網格。
圖1 空間網格
從數學的角度上看,可以將空間填充曲線看成是一種把d 維空間數據轉換到1維連續空間上的映射函數。實際上,存儲磁盤是一維的存儲設備,而空間數據是多維數據,不存在天然的一維順序。因此,為了使空間上鄰近的元素映射也盡可能是一維直線上接近的點,提出了許多的映射方法。最常用的方法包括Z-Ordering[5]、Hilbert[6]曲線和XZ-Ordering,其中Z-Ordering和Hilbert曲線主要用于管理點對象,XZ-Ordering用于管理空間擴展對象,如線和多邊形對象。?
二、點空間填充曲線
點對象是指只具有經度和緯度的二維空間數據。Z-Ordering和Hilbert曲線常用于管理點對象的空間填充曲線。
Z-Ordering:?Z曲線是較簡單的空間填充曲線。如圖2所示,Z曲線遞歸地將空間分成四個子空間,直到達到最大遞歸次數r,最大分辨率控制著最小網格的大小。每一個空間分裂出的四個子空間分別按照圖2(a)所示的方式從0到3編號。如果沒有達到最大分辨率,則繼續劃分每一個子空間,并依次遞歸編碼,如圖2(b)所示。最終,每個最小網格都會有唯一的編碼序列。我們通過一條曲線按照編碼的字典序將最大分辨率下的所有網格連起來,可以看到每一層的編碼形成的形狀類似字母Z。通常,字符串的大小比較沒有整數比較效率高,進而影響查詢效率。因此,在實際使用中,會將Z曲線的編碼序列轉化為整數。如圖3所示,Z曲線從整數0開始按照曲線的連接順序對網格依次遞增編碼。
圖2 Z曲線示意圖
圖3 數值化
Hilbert曲線:?Hilbert曲線是一種能填充滿一個平面正方形的分形曲線(空間填充曲線),由大衛·希爾伯特在1891年提出,如圖4所示。Hilbert曲線通過把一個正方形空間不斷的分成4個子空間,再把小正方形的中心點連接起來得到的曲線,即希爾伯特曲線。在希爾伯特曲線的編碼映射中,使用U字型來訪問每個空間,對分成的4個子空間也同樣使用U字形訪問,但要調整U字形的朝向使得相鄰的空間能夠銜接起來。如圖4(a),在第一層時,選擇一個起始點和方向,然后用0到3依次給四個子空間編號。然而,當層數大于1時,維護總體的鄰接特性,是一件較為復雜的過程。通過不斷的觀察,我們發現,子空間的曲線是由原空間的簡單變換得來,而且只存在四種變換方式,并且相同的變換也適用于子空間的子空間等等。給定一個空間,我們根據它的U字形曲線朝向來確定其四個子空間的U字形曲線朝向和編號。如圖5(a)所示,當U字形朝向為下時,Hibert曲線從左下角開始按照順時針方向分別對其四個子空間編號為0到3,并且進一步劃分四個子空間時,它們的U字型朝向分別為左、下、下、右。其它朝向的U字形變換和編號方式,如圖5(b)(c)(d)所示。同樣地,Hilbert曲線會按照曲線的前進順序從整數0開始給所有最小的網格編碼。
圖4 Hilbert曲線示意圖
圖5 Hilbert曲線的四種變化
三、空間擴展填充曲線
空間數據除了點類型,還有大量的空間擴展對象,如線和多邊形。它們通常具有長度、面積等屬性。因此,不能被一個經緯度唯一表示。Z曲線和Hibert曲線最終得到的編碼只能表示處于最大分辨率的網格。然而,一個空間擴展對象很可能會與多個最小網格相交,因此Z曲線和Hibert曲線都不能用唯一的編碼值來表示它。為了利用空間填充曲線來表示空間擴展對象,最簡單的方法是用所有與空間擴展對象相交的網格的對應編碼表示它,然后將它拷貝多次并存儲在每一個編碼下。明顯地,這種方法會帶來額外的存儲開銷,QQ號交易并且在查詢時需要時間執行去重操作。XZ-Ordering解決了上面提到的問題。它擴展Z曲線,提出了一個放大元素的概念。它固定住Z曲線每一個子空間的左下角,然后將其長和高都擴大一倍得到更大的索引空間,得到的索引空間稱作擴大元素。如圖6(c)中,子空間“00”被擴張到了“0”所覆蓋的子空間,“303”擴張為由“303”、“312”、“321”、“330”這四個子空間組成的索引區域。最終,XZ-Ordering利用恰好能完全包含多邊形的放大元素來表示多邊形,如O1被“303”的擴大元素表示,O1和O3被“00”的擴大元素表示。
圖6 XZ-Ordering示意圖
由于XZ-Ordering使用到了不同分辨率的索引空間表示多邊形對象,因此它的索引空間數量不只是最大分辨率的網格數量。因為,分辨率每增加一次,Z曲線的每個子空間都會分裂出四個新的子空間,而每個子空間也可以擴展為XZ-Ordering的擴大元素。因此,XZ-Ordering擁有個個處于分辨率i的索引空間。進而,它能表示的所有索引空間的數量為不同分辨率下的索引空間數量的累加值。XZ-Ordering實際能表示的索引空間數量為:
其中,l表示最大分辨率。
XZ-Ordering同樣會用一個整數來表示索引空間,并且盡量滿足空間相近的索引空間具有相近的整數值。它的數值化思路可以理解為一種深度優先編碼,如圖7所示,為XZ-Ordering最大分辨率為2時的編碼。先從第0層開始編碼為0,然后再按照深度優先訪問的順序編碼,如先編碼第1層中子空間序號為“0”的空間為1,再編碼“00”子空間為2。當編碼完“0”開頭的所有索引空間后,回退到上一層,再開始編碼上一層為“1”的空間為6,再深度編碼“1”下面所有的索引空間。
圖7 XZ-Ordering最大分辨率為2時的編碼
四、總結
空間填充曲線將多維數據轉換到一維整數域上,并且盡可能保持了多維空間的特性,使得空間相近的空間在轉換后的整數上也盡可能地相近。Z曲線和Hibert曲線是較為常用的空間填充曲線,其中Z曲線較容易實現。XZ-Ordering擴展了Z曲線,使得它能較好地表示非點空間對象,如線和多邊形對象。
總結
以上是生活随笔為你收集整理的JUST技术:管理海量空间数据的利器-空间填充曲线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入理解Linux高性能网络架构的那些事
- 下一篇: JUST技术:提升基于GPS轨迹的路网推