震驚,PostGIS還可以這樣用!!!


摘要:PostGIS為PostgreSQL提供了空間數據庫分析能力,是目前業界主流的地理數據庫之一,提供如下空間信息服務功能:空間對象、空間索引、空間操作函數和空間操作符等。在GaussDB 中,目前已支持PostGIS地理數據庫擴展,並已廣泛應用於國內外公安、農業、安平等政企客戶。

本文分享自華為雲社區《震驚,PostGIS還可以這樣用!!!》,原文作者:秋之語  。

一、地理數據庫能做什么

地理數據庫屬於空間數據庫,為地理數據提供了標准的格式和存貯方法,能夠方便迅速地進行檢索、更新和數據分析,最終達到為多種應用服務的目的。地理數據則包括觀測數據、分析測定數據、遙感數據和統計調查數據。地理數據庫已廣泛的應用於單車、導航,旅游、水利,農業、安平城市等應用場景,滲透到人民生活點點滴滴中。

https://bbs-img.huaweicloud.com/blogs/img/1595920768419011877.jpg

圖1. 地理數據庫典型應用場景

二、PostGIS功能介紹

對於如上介紹的使用場景中,地理數據通常存儲為點、線或者多邊形的集合。在PostgreSQL中,已經提供了點、線、多邊形等空間數據類型,但其提供的數據處理方法和性能很難達到GIS的要求,主要表現在:缺乏復雜的空間類型;沒有提供空間分析;沒有提供投影變換功能。為了使得PostgreSQL更好的提供空間信息服務,PostGIS也就應運而生。

2.1 PostGIS支持數據類型

PostGIS完全遵循OpenGIS規范,支持OpenGIS中所有空間數據類型:

  • a.POINT, LINESTRING, POLYGON, MULTI-POINT,
  • b.MULTI-LINESTRING, MULTI-POLYGON,
  • c.GEOMETRY COLLECTION

除了OpenGIS定義的地理數據類型之外,PostGIS還對數據類型進行了擴展,在WKT和WKB數據類型基礎上擴展出EWKT和EWKB數據類型:

  • a.EWKT, EWKB(包含了SRID信息的WKT/WKB)
  • b.SRID(Spatial Referencing System Identifier):每個空間實例都有一個空間引用標識符 (SRID)。SRID 對應於基於特定橢圓體的空間引用系統,可用於平面球體映射或圓球映射。

此外,PostGIS還支持柵格數據raster分析,可以基於已有的影像或者衛星數據,實現影像或者衛星數據不同類別的統計分析。

2.2 PostGIS支持函數類型

PostGIS常見函數大致可以分為以下六類,對於各函數具體用法參考《PostGIS使用手冊》

1.    字段處理函數

  • a.AddGeometryColumn為已有的數據表增加一個地理幾何數據字段;
  • b.DropGeometryColumn刪除一個地理數據字段的;
  • c.ST_SetSRID設置SRID值

2.    幾何關系函數

這類函數描述幾何對象的距離、包含、范圍、相等等幾何關系,常見函數如下:ST_Distance、ST_Equals、ST_Disjoint、ST_Intersects、ST_Touches、ST_Within、 ST_Overlaps、ST_Contains。

3.    讀寫函數

這類函數主要用於各種數據類型之間的轉換,尤其是Geometry數據類型與其他字符型等數據類型之間的轉換,如ST_AsText、ST_GeomFromText、ST_AsGeoJSON ST_AsHEXEWKB、ST_AsKML、 ST_AsLatLonText。

4.    幾何對象創建函數

這類函數用於點、線、多變形等幾何對象創建,如ST_GeomFromEWKT、ST_GeomFromEWKB、ST_MakePoint、ST_MakeBox2D、ST_LineFromText、ST_Polygon。

5.    幾何對象編輯函數

這類函數提供對幾何圖像的平移、翻轉、旋轉、放大等功能,如ST_AddPoint、ST_Reverse、ST_Rotate、ST_Scale、ST_Snap、ST_Transform、ST_Translate、ST_TransScale。

6.    空間關系及測量函數

這類函數實現幾何對象最遠、最近、長度、面積等計算,如ST_3DClosestPoint、ST_3DDistance、 ST_3DDWithin、ST_3DDFullyWithin、ST_3DIntersects、ST_3DLongestLine、ST_3DMaxDistance、ST_3DShortestLine、ST_Area。

三、PostGIS的安裝:

3.1 基礎編譯環境准備:

GaussDB(DWS)中的PostGIS Extension需使用GCC和G++工具進行編譯安裝。安裝前需確認GCC和G++版本號大於等於4.8.5,且兩個工具可正常使用。具體可通過gcc -v和g++ -v查看相關版本。

https://bbs-img.huaweicloud.com/blogs/img/1619678618156027343.png

如上圖所示環境gcc和g++版本為4.3.4,不滿足版本要求,需使用源碼安裝方式進行升級。若集群中沒有低版本gcc和g++編譯器,可以通過掛載操作系統鏡像進行安裝,這里不做贅述。如需要升級則可從如下網站獲取GCC相關安裝包:

https://ftp.gnu.org/gnu/gcc/gcc-5.4.0/gcc-5.4.0.tar.gz

https://ftp.gnu.org/gnu/gmp/gmp-4.3.2.tar.gz

https://ftp.gnu.org/gnu/mpfr/mpfr-2.4.2.tar.gz

https://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz

此外PostGIS安裝還需要確保zlib、autoconf和automake等工具已正確安裝。

3.2 PostGIS依賴庫安裝:

PostGIS依賴Geos、 Proj、 JSON-C、 Libxml2、 Gdal第三方開源工具。安全前首先需要下載Geos、 Proj、 JSON-C、 Libxml2、 Gdal、 PostGIS源碼至$GAUSSHOME目錄。

安裝時需切換至omm用戶,並檢查GaussDB環境變量已正確加載,且可正常登錄和使用GaussDB環境。具體安裝命令可參考產品文檔,且確保安裝路徑與文檔中給定路徑完全一致,自定義路徑會導致最終庫文件分發失敗。

在整個安裝過程中,可使用make -sj和make install -sj命令並行加速編譯,-sj命令極低概率性出現安裝錯誤,如果安裝失敗則請使用make和make install進行串行安裝。此外對於ARM物理機,在每個安裝包configure時需要增加如下編譯參數: --build=aarch64-unknown-linuxgnu,否則會出現安裝失敗。同時,在三方開源庫proj的安裝過程中,可能會報錯$GAUSSHOME/install/proj/bin目錄不存在,可手動創建該目錄再執行proj的安裝。

安裝成功后截圖大致如下,其中關於get_PlatForm_str.sh不存在的提示信息可直接忽略。

https://bbs-img.huaweicloud.com/blogs/img/1619678763187094670.png

安裝完成后則需要使用PostGIS_install.sh工具完成PostGIS相關動態鏈接庫在集群節點中的分發。執行方式為:

sh $GAUSSHOME/share/postgis/PostGIS_install.sh

如若失敗,可打開PostGIS_install.sh文件分別執行分發命令,確定是哪個文件不存在而導致分發失敗,並進一步分析該庫文件編譯失敗原因。

四、PostGIS使用:

目前GaussDB對PostGIS中絕大多數函數均已支持下推至DN處理。因此對於絕大多數地理數據運算,都可以充分利用GaussDB的分布式計算優勢,帶來相比於PostgreSQL近似線性擴展比的性能加速。

4.1 地理數據的導入:

PostGIS支持shape格式地理數據導入。因此對於其它地理數據庫平台數據,如Oracle或者ArcGIS中的地理數據,可先將其導出為shape格式文件,然后使用$GAUSSHOME/bin目錄下的shp2pgsql工具將shape文件轉換為sql文件並進一步導入GaussDB。如果生成sql文件中的地理表定義缺少分布鍵的話,可以手動增加一個id自增的分布鍵,使地理數據均勻分布到各個DN,進而充分利用GaussDB的分布式計算優勢。

4.2 GIS函數使用demo:

對於GaussDB支持各GIS函數的具體使用方法,請參考《 PostGIS-2.4.2用戶手冊》。這里給一個簡單的使用demo。

示例1 :幾何表的創建。
CREATE TABLE cities ( id integer, city_name varchar(50) );
SELECT AddGeometryColumn('cities', 'position', 4326, 'POINT', 2);
示例2:幾何數據的插入。
INSERT INTO cities (id, position, city_name) VALUES (1,ST_GeomFromText('POINT(-9.5 23)',4326),'CityA');
INSERT INTO cities (id, position, city_name) VALUES (2,ST_GeomFromText('POINT(-10.6 40.3)',4326),'CityB');
INSERT INTO cities (id, position, city_name) VALUES (3,ST_GeomFromText('POINT(20.8 30.3)',4326), 'CityC');
示例3:計算三個城市間任意兩個城市距離。
SELECT p1.city_name,p2.city_name,ST_Distance(p1.position,p2.position) FROM cities AS p1, cities AS p2 WHERE p1.id > p2.id;

執行結果為:

https://bbs-img.huaweicloud.com/blogs/img/1619678877904075252.png  

示例4:查詢query執行計划,發現執行過程中p1表是廣播到全部DN節點的,因此對於每個DN,其只需要處理自己節點上的p2數據,通過對比本地p2數據與全局p1數據即可完成整個分析,這也是分布式數據庫的優勢所在。

https://bbs-img.huaweicloud.com/blogs/img/1619678899578064661.png

五、PostGIS性能介紹

目前市場上的空間數據庫包括MySQL的Spatial Extension、PostgreSQL的PostGIS、Oracle Spatial、ArcGIS的ArcSDE及MongoDB等。對於這幾款數據庫的性能對比,之前有一篇文檔《常用地理數據庫對比測試》有一個比較詳細的對比和介紹。

從圖2至圖5中的測試數據可以看出,對於點數據,在相同查詢條件下,PostGIS數據庫的空間查詢速度最快。對於線數據,PostGIS則相比於其它數據庫要慢一些,這可能與不同地理數據庫使用不同索引技術有關。

https://bbs-img.huaweicloud.com/blogs/img/1595920768451002963.jpg

 

 

 

 

 

 

圖2. 第一次點查數據結果

https://bbs-img.huaweicloud.com/blogs/img/1595920768546038154.jpg

 

 

 

 

 

圖3. 第二次點查數據結果

https://bbs-img.huaweicloud.com/blogs/img/1595920769019073515.jpg

 

 

 

 

 

 

圖4. 第一次線查數據結果

https://bbs-img.huaweicloud.com/blogs/img/1595920769132062581.jpg

 

 

 

 

 

 

圖5. 第二次線查數據結果

GaussDB作為分布式數據庫,對PostGIS做了深度適配。目前GaussDB對PostGIS中絕大多數函數均已支持下推至DN處理。因此對於絕大多數地理數據運算,都可以充分利用GaussDB的分布式計算優勢,帶來相比於PostgreSQL近似線性擴展比的性能加速,滿足客戶在大數據場景的地理數據處理和分析需求。

六、總結

本篇博文簡單介紹了GaussDB中Postgis的安裝和使用,歡迎廣大讀者收藏和討論。

想了解GuassDB(DWS)更多信息,歡迎微信搜索“GaussDB DWS”關注微信公眾號,和您分享最新最全的PB級數倉黑科技,后台還可獲取眾多學習資料~

 

點擊關注,第一時間了解華為雲新鮮技術~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM