天天看點

PgSQL · 功能分析 · PostGIS 在 O2O應用中的優勢

最近上線了一個o2o相關的應用,用到了postgresql和非常著名的插件postgis,該應用把postgresql和postgis的優勢在o2o領域成功的發揮了出來。o2o業務分為線上和線下兩部分,線下部分業務和位置距離等密切相關,不可避免的需要儲存商戶位置資訊,進行距離的計算,範圍覆寫計算等,這部分業務簡稱lbs(location based service),即基于地理位置資訊服務。使用postgresql和postgis實作這些業務,具有天然的優勢。

由于空間資料具有空間位置、非結構化、空間關系、分類編碼、海量資料等特征,一般的商用資料庫管理系統本身難以滿足要求,是以很多廠商都在其産品基礎上,加入了空間方面的擴充。例如,支援空間擴充的産品有oracle的oracle spatial,ibm的db2 spatial extender,informix 的spatial datablade等。其優點是空間資料的管理與通用資料庫系統融為一體,空間資料按對象存取,可在資料庫核心中實作空間操作和處理,擴充sql比較友善,較易實作資料共享與互操作;其缺點主要表現為,實作難度大,壓縮資料比較困難,目前的功能和性能與第一類系統尚存在差距。

開源資料庫方面,目前性能最優秀的資料庫軟體當屬postgresql資料庫,而建構在其上的空間對象擴充子產品postgis則使得其成為一個真正的大型空間資料庫。

1986年,加州大學伯克利分校的 michael stonebraker 教授上司了postgres的項目,它是postgresql的前身。這個項目的成果非常顯著,在現代資料庫的許多方面都作出了大量的貢獻,如在面向對象的資料庫、部分索引技術、規則、過程和資料庫擴充方面都取得了顯著的成果。同時,stonebraker将postgresql納入到bsd版權體系中,使得postgresql在各種科研機構和一些公共服務組織得到了廣泛的應用。

在postgresql中已經定義了一些基本的集合實體類型,這些類型包括:點(point)、線(line)、線段(lseg)、方形(box)、多邊形(polygon)和圓(circle)等,另外postgresql定義了一系列的函數和操作符來實作幾何類型的操作和運算。同時postgresql引入空間資料索引r-tree。

盡管在postgresql提供了上述幾項支援空間資料的特性,但其提供的空間特性很難達到gis的要求,主要表現在:缺乏複雜的空間類型、沒有提供空間分析、沒有提供投影變換功能。為了使得postgresql更好的提供空間資訊服務,postgis應運而生。

postgis是postgresql的一個擴充,postgis提供如下空間資訊服務功能:空間對象、空間索引、空間操作函數和空間操作符,同時postgis遵循opengis的規範。

外賣應用短距離配送系統解決的是物流配送過程中最後一公裡的問題。國家郵政局市場監管司預計,今年“雙十一”期間快遞總量将超過數億件,最高日處理量可能突破7000萬件。如此多的包裹堆積在城市物流的“最後一公裡”上,讓物流公司喘不過氣來。商務部商業流通司司長王選慶說:“我國物流業在城際間的幹線運輸效率已經大大提高。現在真正的難題集中在城市配送的‘最後一公裡’,配送難、配送貴的問題越來越突出。” 資料顯示,末端配送成本已經占到物流行業總成本的30%以上。大量的社會資源消耗在“最後一公裡”上,加重了城市的交通和環境壓力,卻未能帶來配送效率的提高。短距離配送系統定位同城短距離配送業務,物流公司通過該平台擷取同城内的物流配送訂單,批量配送到距離該地約5公裡内的目的地。典型業務模型如下:

1. 業務員查詢自己負責範圍内的訂單資訊,需求不規則多邊形(自己負責的業務範圍)的範圍查詢;

2. 業務員擷取訂單配送距離和推薦路線,需求點到點的距離計算、路徑計算;

3. 相似路徑的多個訂單的批量配送,需求位置和大量傳統資料符合運算;

4. 實時配送,位置跟蹤。大量位置相關資訊的存取,需要有較好的性能。

上述需求對應postgresql 和postgis涉及到的資料類型和sql用法有:

資料類型。幾何對象的資料類型如下:

距離計算函數:<code>st_distance_sphere(point, point)</code>

範圍判定函數。判斷a是否被b包含:<code>st_within(geometry a, geometry b)</code>

更多幾何運算:

如果需要精确的計算結果,則要做坐标系轉換,稱為空間投影。例如,以兩個空間點的位置,計算兩點間的距離。計算結果的機關與你的空間資料的參考系有關。如果使用4326(wgs84)這個坐标系,則是以度為機關的,要想轉成米為機關的話還得做一下轉換。例如,geocs 代表的是地理坐标系,也就是以經緯度表示的坐标系統,例如編号為4326的坐标系統,projcs 代表的投影坐标系,它是通過一種算法把球面坐标系轉成平面坐标系,以便計算,一般是以米為機關表示,例如編号為26986的坐标系統。在求兩點之間的距離時,由于存的資料都是經緯度,是以它參考的是geocs,要想得到以米為機關的結果,首先要把它轉成projcs,可以通過st_transform來實作。檢視postgis手冊,這個函數的原型如下:

第一個參數是原來的幾何對象,第二個參數為要把它轉換到這個投影所代表的坐标系下。這時我們隻要找一個機關是米的投影坐标系,用下面的方法轉換過去就好了:

這個查出來的結果即是以米為機關的兩點間的距離了。

空間索引。空間相關的資料支援建立gist索引,這大大提高了這類資料查詢的效率,使用下面的方法可以建立空間索引:

無論是資料類型還是各種幾何運算,都和關系資料庫postgresql緊密結合,你可以在進行資料庫事務操作的同時,進行空間運算,這讓業務的開發異常的簡單并且效率極高。

這是典型的業務場景和 mongodb 的性能對比:

PgSQL · 功能分析 · PostGIS 在 O2O應用中的優勢

基本上postgresql的性能可以秒殺mongodb。

在功能上,和mysql對比,postgis具有下列優勢:

PgSQL · 功能分析 · PostGIS 在 O2O應用中的優勢

o2o業務場景中的lbs業務使用postgresql + postgis有無法比拟的優勢。