第三章 GeoJSON 資料壓縮
3.3 資料壓縮技術
國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
23
業活動位置分佈資料原本即PostgreSQL 資料庫匯出,在這邊可直接透過資料庫的 回存功能匯入。
3. 空間資料庫:
PostgreSQL 之所以作為本研究實驗的主要資料庫,主要因為 PostgreSQL 除了具有 一般商業資料庫的功能外,更含括幾何空間(geometry)及使用者自定資料型態,讓 使用者可以方便的對資料進行處理與儲存,另外為使空間資料可以符合OGC 制定 的規格,另外附加了PostGIS (Geographic Object for PostgreSQL) 自由軟體套件,可 以輸出如GeoJSON、GML、KML 等 Web GIS 使用的空間資料格式。
4. GeoJSON 產生:
在GeoJSON 輸出階段,可以直接以「ST_AsGeoJSON」資料庫函式語法,產生 GeoJSON 格式,其格式範例如下:
SELECT ST_AsGeoJSON(1,(the_geom)) FROM TABLE;
其語法代表從資料庫中選擇資料所屬的資料表,並將資料表中存放空間資料物件欄 位「the_geom」,用 ST_AsGeoJSON 轉換成 GeoJSON 格式,而 ST_AsGeoJSON (1,(the_geom),5)中的 1 代表 GeoJSON 版本(目前皆為 1)。最後當 PHP 程式接收到 GeoJSON 格式,篩選出座標物件中的座標陣列,即可進行下一步驟的 GeoJSON 資 料壓縮技術套用。
5. 擷取座標內容:
GeoJSON 中含有大量的座標資料,也是本研究的壓縮重點,因此先將格式中過濾 出座標集,以方便壓縮方法的套用流程。
3.3 資料壓縮技術
從文獻回顧以及3.1 的 GeoJSON 格式輸出範例,可以直接辨識出 GeoJSON 格式中,
座標資料佔有相當大的比例、由於鄰近座標數值相近故差異值較小。基於以上發現可以 歸納兩點方向,一為縮減座標資料量;二為利用座標值相近與差異小的特性。
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
24
在資料壓縮方法設計過程,參考相關處理序列資料的壓縮技術,以「差分編碼」演 算法最接近本研究的需求,差分編碼簡單來說即兩值相減所得到的「差異值」,因此假 設僅儲存差異值,則資料大小就會減少。
然而,座標資料經由差分編碼後,發現壓縮成效不彰,原因在於座標的浮點數格式 相減後,小數點與尾數間許多值為零的結果,如圖3.3 所示,在這邊本研究將小數點與 尾數間的值為零現象稱之為「前置零」。另外,前置零的存在影響字串長度,因此本研 究提出一個可以去除前置零字元的方法-浮點式編碼,並於下文作詳細的介紹。
120.57425 , 0.00037 , 0.0001
前置零
原始資料 :120.57425 , 120.57462 , 120.57472 差分編碼
圖3.3:差分編碼產生的前置零
另一個探討的議題是HTTP 壓縮技術,從文獻中得知,所有經伺服器傳遞的資訊,
都需要經過HTTP 層解析在回應至用戶端。換句話說,資料內容愈多,花費的解析時間 與頻寬使用率就愈高。參考減少頻寬與提昇效能的方法研究中,最普遍的方法為GZIP 壓縮演算法,因此本研究採用GZIP 壓縮演算法進行 HTTP 壓縮,以輔助減少 GeoJSON 資料的解析時間。
綜合以上說明,本節可以歸納二個部份,分別為GeoJSON 壓縮技術與 HTTP 壓縮技術。
1. GeoJSON 壓縮技術:
由差分編碼與浮點式編碼函式組成,差分編碼方法是儲存座標間的差異值,使得差 異值為小於零的浮點數;而浮點式編碼是為了改善差分編碼壓縮後前置零的問題。
第一部份先介紹差分編碼對座標的壓縮流程,第二部份介紹浮點式編碼如何改善差 分編碼,最後在第四章對兩大部份實驗,觀察本研究提出的浮點式編碼對差分編碼 的影響與改善程度。
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
25
(1) 差分編碼函式:
參考差分編碼技術,本研究整理的差分編碼公式如下。p 代表i (x , y ) 座標,Pi i 為座標集合,差分編碼為Δp ,因此我們僅儲存i Δp 即可達到壓縮的目的,其i 表示式如下:
下圖3.4 為座標經差分編碼示意圖,圖片中的代號分別表示將 p 表示成原始座 標值、Δp 為差分編碼值,差分解碼值即為原始座標值,因此同樣以 p 表示。
一、 差分編碼(Delta Encode):
將第一個座標值p0設定為解碼參考的基準值(Reference value),
0 1 0
Δp p p ,即本實驗的差分編碼值,以此類推。
二、 差分解碼(Delta Decode):
從差分編碼結果中,p1Δp0p0即可得到原來的座標值p1。
圖3.4:差分編碼示意圖
i i i
0 1 n-1
i i 1 i
p (x , y ) i 0,....n-1
P {p , p , ...p }
Δp p
p
,
‧
function delta_encode($coor) {
Return $delta_x.”,”.$delta_y;
}
$coor為矩陣座標物件,共n組 編碼函式名稱:delta_encode
$coorsize為座標矩陣的大小,即n
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
27
乙、 前置零:差分編碼應用在座標壓縮會產生前置零的問題,因此壓縮成效 不彰,因此浮點數的正規化,可以將簡化前置零字元長度。
二、 合併符號與指數:
將座標數值經由正規化取得指數與符號後,兩者合併後使得長度為8 個位元 (bit),即為一個位元組(bytes)大小。
三、 進制轉換:
合併sign 與 exponent 後結構變成二個部份,從以上步驟都仍是數值的階段,
因為若要與GeoJSON 的字串格式整合,所有數值皆需轉成字串型態。因此,
本研究將「sign + exponent」與「magnitude」兩部份,分別透過「進制轉換」
組合成字串。為避免字串在轉換後產生如「引號」、「亂碼(無法辨識字元)」等 特殊符號,而影響JavaScript 錯誤的解讀,因此本研究將字串以 0-9,A-Z,a-z 共 62 個符號作進制的轉換,如下表 4 所示,表 5 則為本研究提出的浮點式編碼 程式與內容說明。
magnitude 讀入Delta
編碼後的浮點數
進制轉換
合併字串
(1)編碼前置處理
(2)合併sign與exponent sign + exponent
(1byte)
sign exponent
(3)進制轉換
圖3.5:浮點式編碼示意圖
‧
function float_encode($delta_coor) { if ($delta_coor<0) {
$sign = 1;
$nosign_coor = substr($delta_coor,1);
} else {
$sign = 0;
$nosign_coor = $delta_coor;
}
$nozero_coor = rtrim($nosign_coor, '0');
$decops=strops($nozero_coor, '.');
$exp = strlen($nozero_coor)-$decpos-1;
$str_before_dot = substr($nozero_coor, 0, $decpos);
$str_after_dot = substr($nozero_coor, intval($decpos+1), $exp);
$magnitude = $str_before_dot.$str_after_dot;
$magnitude1 = ltrim($magnitude, '0');
$result1 =
dec2base( ((int)($sign*$base*0.5)+$exp));
}
過濾尾巴的0,並定義為$ nozero_coor 找出小數點的位置,從前面算起
用小數點的位置,決定exponent,把浮點數 變成整數
取得magnitude,並去掉開頭的"0"
將數值轉換成字元並合併成一個字串
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
29
2. HTTP 壓縮技術應用:
從文獻探討了解HTTP 壓縮可以大幅節省資料解析時間的特性,因此本研究嘗試藉 由HTTP 壓縮技術來輔助 GeoJSON 資料傳輸的效能。HTTP 壓縮技術的執行流程說 明與流程圖如下:
(1) 檢查文件檔頭資訊:
伺服器端接收到文件時,透過檔頭資訊可以初步確認文件是否為壓縮檔案,若 為已壓縮檔案,則直接輸出結果,若為未壓縮檔案,則透過GZIP 壓縮方法進 行文件壓縮。
(2) 使用 GZIP 壓縮與結果輸出:
GZIP 可為 HTTP 解析文件前,進行文件的壓縮。本研究使用 PHP 內建的 gzencode 函式壓縮資料,再重新傳送己壓縮的資訊至 HTTP 檔頭資訊,最後輸 出至用戶端。
接收 來源文件
GZIP壓縮
輸出結果
是 透過檔頭資訊
確定是否壓縮
否
圖3.6:HTTP 壓縮流程圖
綜合以上壓縮技術得到下圖完整的資料傳遞與壓縮流程,由上而下為用戶端對資料 請求的流程,當Web 伺服器收到請求便會對資料庫進行查詢以及產生 GeoJSON 格式,
最後在經過GeoJSON 與 HTTP 壓縮技術壓縮並回應至用戶端。
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
30
用戶端
HTTP
Web伺服器
資料庫
請求資料
查詢資料
資料輸出
GeoJSON
分析請求
產生GeoJSON
GeoJSON壓縮 HTTP壓縮
圖3.7:資料傳遞與壓縮套用流程