<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                最近上線了一個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則使得其成為一個真正的大型空間數據庫。 ## 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的規范。 ## O2O應用中空間計算需求 外賣應用短距離配送系統解決的是物流配送過程中最后一公里的問題。國家郵政局市場監管司預計,今年“雙十一”期間快遞總量將超過數億件,最高日處理量可能突破7000萬件。如此多的包裹堆積在城市物流的“最后一公里”上,讓物流公司喘不過氣來。商務部商業流通司司長王選慶說:“我國物流業在城際間的干線運輸效率已經大大提高。現在真正的難題集中在城市配送的‘最后一公里’,配送難、配送貴的問題越來越突出。” 數據顯示,末端配送成本已經占到物流行業總成本的30%以上。大量的社會資源消耗在“最后一公里”上,加重了城市的交通和環境壓力,卻未能帶來配送效率的提高。短距離配送系統定位同城短距離配送業務,物流公司通過該平臺獲取同城內的物流配送訂單,批量配送到距離該地約5公里內的目的地。典型業務模型如下: 1\. 業務員查詢自己負責范圍內的訂單信息,需求不規則多邊形(自己負責的業務范圍)的范圍查詢; 2\. 業務員獲取訂單配送距離和推薦路線,需求點到點的距離計算、路徑計算; 3\. 相似路徑的多個訂單的批量配送,需求位置和大量傳統數據符合運算; 4\. 實時配送,位置跟蹤。大量位置相關信息的存取,需要有較好的性能。 ## PostgreSQL+PostGIS解決方案 上述需求對應PostgreSQL 和PostGIS涉及到的數據類型和SQL用法有: 1. 數據類型。幾何對象的數據類型如下: ~~~ POINT(0 0) ——點 LINESTRING(0 0,1 1,1 2) ——線 POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1)) ——面 MULTIPOINT(0 0,1 2) ——多點 MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4)) ——多線 MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1))) ——多面 GEOMETRYCOLLECTION(POINT(2 3),LINESTRING((2 3,3 4))) ——幾何集合 ~~~ 2. 距離計算函數:`ST_distance_sphere(point, point)` 3. 范圍判定函數。判斷A是否被B包含:`ST_Within(geometry A, geometry B)` 4. 更多幾何運算: ~~~ 面積量測 ST_Area(geometry) 獲取兩個幾何對象相交的部分 ST_Intersection(geometry, geometry) 判斷兩個幾何對象的邊緣是否接觸 ST_Touches(geometry, geometry) 判斷兩個幾何對象是否互相穿過 ST_Crosses(geometry, geometry) 判斷兩個幾何對象是否是重疊 ST_Overlaps(geometry, geometry) 判斷A是否包含B ST_Contains(geometry A, geometry B) 判斷A是否覆蓋 B ST_Covers(geometry A, geometry B) 判斷A是否被B所覆蓋 ST_CoveredBy(geometry A, geometry B) ~~~ 5. 如果需要精確的計算結果,則要做坐標系轉換,稱為空間投影。例如,以兩個空間點的位置,計算兩點間的距離。計算結果的單位與你的空間數據的參考系有關。如果使用4326(wgs84)這個坐標系,則是以度為單位的,要想轉成米為單位的話還得做一下轉換。例如,GEOCS 代表的是地理坐標系,也就是以經緯度表示的坐標系統,例如編號為4326的坐標系統,PROJCS 代表的投影坐標系,它是通過一種算法把球面坐標系轉成平面坐標系,以便計算,一般是以米為單位表示,例如編號為26986的坐標系統。在求兩點之間的距離時,由于存的數據都是經緯度,因此它參考的是GEOCS,要想得到以米為單位的結果,首先要把它轉成PROJCS,可以通過ST_Transform來實現。查看PostGIS手冊,這個函數的原型如下: ~~~ geometry ST_Transform(geometry g1, integer srid); ~~~ 第一個參數是原來的幾何對象,第二個參數為要把它轉換到這個投影所代表的坐標系下。這時我們只要找一個單位是米的投影坐標系,用下面的方法轉換過去就好了: ~~~ SELECT ST_Distance( ST_Transform(ST_GeomFromText('POINT(-87.734087560562 43.770129071141)',4326),26986), ST_Transform(ST_GeomFromText('POINT(-87.747382933006 43.759234252055)', 4326),26986)); ~~~ 這個查出來的結果即是以米為單位的兩點間的距離了。 6. 空間索引。空間相關的數據支持創建GIST索引,這大大提高了這類數據查詢的效率,使用下面的方法可以創建空間索引: ~~~ CREATE INDEX shape_index_area ON sp_delivery_area.area USING gist(shape); ~~~ 無論是數據類型還是各種幾何運算,都和關系數據庫PostgreSQL緊密結合,你可以在進行數據庫事務操作的同時,進行空間運算,這讓業務的開發異常的簡單并且效率極高。 ## 與其他方案的對比 這是典型的業務場景和 MongoDB 的性能對比: ![PgSQL 和 MongoDB性能對比](https://box.kancloud.cn/2015-09-24_56039b024fab0.png "PgSQL 和 MongoDB 對比") 基本上PostgreSQL的性能可以秒殺MongoDB。 在功能上,和MYSQL對比,PostGIS具有下列優勢: ![PgSQL 和 MySQL對比](https://box.kancloud.cn/2015-09-24_56039b02aff3d.png "PgSQL 和 MySQL 對比") O2O業務場景中的LBS業務使用PostgreSQL + PostGIS有無法比擬的優勢。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看