MathJax

MathJax-2

MathJax-3

Google Code Prettify

置頂入手筆記

EnterproseDB Quickstart — 快速入門筆記

由於考慮採用 EnterpriseDB 或是直接用 PostgreSQL 的人,通常需要一些入手的資料。這邊紀錄便提供相關快速上手的簡單筆記 ~ 這篇筆記以 資料庫安裝完畢後的快速使用 為目標,基本紀錄登入使用的範例:

2017年12月4日 星期一

PostGIS 入門簡介

PostGIS 是一個資料庫的地理圖資模組。這個模組能讓 PostgreSQL 搖身一遍,成為一個地理圖資資料庫(Spatial Database)。裡面提供豐富的地理資料操作功能,可以說是目前市面上數一數二的地理圖資資料庫。而許多人會使用 PostgreSQL 的理由,便是因為 PostGIS 這個工具的關係。
這裡整理一點有關的筆記,希望能對你有幫助~
(本篇落落長,慎入!)

首先還是先從程式本身作一點簡易的介紹。
地理圖資功能,其實在原生的 PostGIS 就已經有「很簡單的」內建功能,大概有以下幾項
上面可以看到什麼?當你不在地球表面的話就沒辦法處理了~~也就是說,進一步的地理功能比較欠缺。這也就是 PostGIS 專案所要提供的。
PostGIS 的軟體授權和 PostgreSQL 不一樣,是採用 GNU GPL  授權,而非 BSD 風格的授權,因此 PostGIS 沒有和 PostgreSQL 合併起來的關係。

PostGIS 和 PostgreSQL 一樣,是一個很活躍的專案,每個版本都不斷有更多進階功能。因此 PostGIS 和 PostgreSQL 一樣,在 PostGIS 升版時不能直接安裝新檔案而已;此外,PostGIS 和 PostgreSQL 之間有版本相依性,太過新的 PostGIS 沒辦法裝到過舊的 PostgreSQL 版本。我們可以到 PostGIS 的 Wiki 上確認。通常一個 PostGIS 版本會橫跨支援幾個 PostgreSQL 版本,以便進行資料庫版本升級。在比較近期版本的升版操作流程上大致如下:
upgrade_pg+postgis-9.6.png

上圖呈現的是,採用 EDB 發行的 PostgreSQL Distribution(或是該公司的企業版產品 Postgres Advanced Server)時,進行的升級流程


有關 PostGIS 的資料,在網路上其實不是很多。除了 PostGIS 本身的使用手冊之外,目前已知關於 PostGIS 的資源主要為以下兩~三本書籍:
  • PostGIS in Action ver2 by Leo S. Hsu, Regina O. Obe
  • PostGIS Essentials by Angel Marquez
  • PostGIS Cookbook by Paolo Corti, Thomas J. Kraft, Stephen Vincent Mather, Bborie Park
其他的則是一些專門服務的公司的部落格教學內容了~請讀完本篇後再去找吧 ╮(▔▽▔")╭
接著以下便進行 PostGIS 的基礎介紹:



安裝:取決於所採用的 PostgreSQL Distribution,大多都有提供相對應的 PostGIS 安裝檔,在這就直接以 EnterpriseDB 的安裝檔進行。EnterpriseDB 的安裝,可以直接從資料庫安裝完之後的套件管理精靈 StackBuilder (Plus) 裡面選取 PostGIS 套件。基本上就是一直「下一步」的安裝方式,在此就不詳列安裝過程。

如果使用 Postgres 原生的 YUM Repo 進行安裝,記得先安裝 epel-release 套件,才能確保一些必要的套件可以一起被安裝

如果你想「自己編譯」...,那可能得安裝很多的東西才行。下面就列舉一下,在 Slackware 這款 Linux Distribution 的安裝,具體來說,可以到 SlackBuilds.org - 14.2 > Gis > postgis
找資訊,裡面列了一些相依套件,整理後的清單如下
  • proj.4
  • geos (Geometry Engine - Open Source)
  • gdal (Geospatial Data Abstraction Library)
  • libxml2
  • json-c
背後都有些許相依套件在。此外,有時候 Shared Object 的版本會咬得很死,這也是安裝上會遇到的麻煩事~所以還是建議使用套件安裝檔

裝完之後就是啟用:PostGIS 有多種套件,基本的兩個先啟用
postgres=# CREATE EXTENSION postgis;
postgres=# CREATE EXTENSION postgis_topology;

另外還有一個 postgis_tiger_geocoder 是地址 — 經緯度映射模組,這裡就不啟用了。

這樣會建立幾個 Schema 與相關表格(在 PGSQL 9.6 的 PostGIS 2.3.1):
postgres=# \dn
    List of schemas
   Name   |    Owner     
----------+--------------
 public   | enterprisedb
 topology | enterprisedb
(2 rows)

postgres=# \d
                List of relations
 Schema |       Name        | Type  |    Owner     
--------+-------------------+-------+--------------
 public | geography_columns | view  | enterprisedb
 public | geometry_columns  | view  | enterprisedb
 public | raster_columns    | view  | enterprisedb
 public | raster_overviews  | view  | enterprisedb
 public | spatial_ref_sys   | table | enterprisedb
(5 rows)

另外,使用 EDB 的 PostgreSQL 發行版(不論是原生的還是企業版),裝完之後,都會產生一個樣板的 database,要建立有關 PostGIS 的 Database 只要在建立時指定該 template 即可
postgres=# CREATE DATABASE mydb TEMPLATE template_postgis;



PostGIS 主要以實際的地理資料為主,裡面提供的資料型態有以下常用的幾大類型
  • GEOMETRY:這是一般所看的平面地圖(曲率為零的座標)
  • GEOGRAPHY:這是所謂的大地座標(有經過觀測資料修正的地球橢球座標)
  • BOX2D、BOX3D:表達二維/三維方框資訊的資料
  • RASTER:這是網格資料(例如,空拍資料)
其中前三項是所謂的向量資料。由於 raster 型態的資料不清楚從哪裡取得,以下會以向量型態介紹為主。

以上的三大類資料型態,在 PostGIS 裡面,資料型態的宣告格式分別為
GEOMETRY(Subtype, SRID)
GEOGRAPHY(Subtype, SRID)
BOX2D(linestring_data) 或是 BOX3D(circularstring_data)
BOX3D(linestring_data) 或是 BOX3D(circularstring_data)
RASTER

對於 geometry 和 geography 需要指定次一級的型態 Subtype 以及地圖座標系統的 SRID (Spatial Reference System Identifier) 編號。

Subtype 分成以下幾種,分別可以指定單一個幾何資訊或是數個幾何資訊的集合
  • 折線
  • 多邊形
  • 帶洞的多邊形
  • 曲線
而 SRID 則是圖資資料所基準的地圖座標:例如,SRID 4326 就叫做 WGS84 座標,是地球經緯度的座標,或是在台灣會用的座標系統 TWD96 與 TWD97 也可以找到相對應的 SRID 編號。


在 PostGIS 建立資料表的方式有兩種,以下為手冊取出範例

1 使用函數把欄位加進去:這方法是很舊的版本所用的
CREATE TABLE parks ( 
  park_id    INTEGER, 
  park_name  VARCHAR,
  park_date  DATE,
  park_type  VARCHAR
);
SELECT AddGeometryColumn('parks', 'park_geom', 128, 'MULTIPOLYGON', 2 );

2 像一般表格一樣宣告
CREATE TABLE parks ( 
  park_id    INTEGER, 
  park_name  VARCHAR,
  park_date  DATE,
  park_type  VARCHAR,
  park_geom  GEOMETRY(MULTIPOLYGON,128)
);

而插入資料的方法,則需要用函數把符合格式的一般字串(這樣的字串在 PostGIS 裡面稱為 Well-Known Text),用函數 st_geomfromtext() 轉換型態,變成 PostGIS 資料。下面用手冊內容「隨便兜」一個簡單範例
INSERT INTO parks(park_geom) VALUES (ST_GeomFromText('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)))',128));



上面把內部簡單的東西帶了一遍,那麼接下來,重要的問題是,我們不可能手打這種類的資料阿,要怎樣匯入?要匯入什麼才好?

首先是資料來源,不外乎是取得現成的完整資料,或是儀器收集然後存進資料庫。上一段已經用很爛的例子舉例怎樣存資料了,儀器收集資料便可以用這方式處理。下面直接說現成資料的匯入。

一般來說,現成的資料,會以 Shapefile 來提供:ESRI Shapefile 是向量圖資交換格式,由數個檔案組成。Shapefile 內容除了存放地理物件之外,還可以加上與圖資無關的資訊。一組 Shapefile 匯入資料庫,最後會產生一組表格,包含圖資欄位以及其他資訊欄位,就類似上面的範例一樣,有時還會包含一些 Constraint 或 Index 物件等。

Shapefile 沒辦法匯入到 PostGIS,需要先使用 PostGiS 提供的指令 shp2pgsql 把 shapefile 轉換成 SQL Script 才能匯入。要轉換 Shapefile 必須先知道這份 shapefile 的資料編碼才行:例如,從政府開放資料平台取得的 Shapefile 有些是 Big5 編碼,有些又只是單純的 LATIN1,必須要先弄清楚指定才行。

以下以政府資料開放平臺提供的鄉鎮市區界線(TWD97經緯度) 作範例
[postgres@localhost 1060503A_TOWN]$ shp2pgsql -W LATIN1 -D -I TOWN_MOI_1060503.shp > TOWN_MOI_1060503.sql
[postgres@localhost 1060503A_TOWN]$ psql -U postgres -d postgres -f TOWN_MOI_1060503.sql
[postgres@localhost 1060503A_TOWN]$  psql
psql.bin (9.6.2.7)
Type "help" for help.

postgres=# \d town_moi_1060503      
                                   Table "public.town_moi_1060503"
   Column   |          Type          |                           Modifiers                            
------------+------------------------+----------------------------------------------------------------
 gid        | integer                | not null default nextval('town_moi_1060503_gid_seq'::regclass)
 townid     | character varying(8)   | 
 towncode   | character varying(12)  | 
 countyname | character varying(12)  | 
 townname   | character varying(12)  | 
 towneng    | character varying(39)  | 
 countyid   | character varying(3)   | 
 countycode | character varying(8)   | 
 geom       | geometry(MultiPolygon) | 
Indexes:
    "town_moi_1060503_pkey" PRIMARY KEY, btree (gid)
    "town_moi_1060503_geom_idx" gist (geom)

反過來,要從 PostGIS 匯出 shapefile 的話
[postgres@localhost export_moi_shp]$ pgsql2shp -d test public.town_moi_1060503

進一步來說,相依套件所安裝的程式的其他套件有提供通用的匯出/匯入工具:GDAL/OGRlibrary , OGR2OGR,可以支援不同資料源的地理圖資交換。



最後,讓我用一個圖形界面,把匯入的資料提出來看看長啥樣~
地理圖資的工具很多,介紹這些工具也不是本篇的目標,我就挑一個看好像起來很熱門的程式 — QGIS 來呈現。

關於 QGIS 的使用,比起 PostGIS,有更多教學資源可以參考,在此就不列出太多的相關資源了,有興趣的人可以自己去找。

啟動 QGIS 後,設定 PostGIS 所在資料庫的連線,基本上和使用 pgAdmin 連線到資料庫的設定一樣;而載入圖表則只要點選表格,選好座標格式(SRID),就可以畫出下圖


如果嫌 QGIS 太專業,太大一隻,還有其他開源 GIS 程式專案可以用,例如 OrbisGIS





以上就是很基本的 PostGIS 的操作,至於真正的應用,就留給各位願意讀到這裡的人分享~

這些內容都是半路出家湊出來的,有什麼錯誤還請見諒。由於網路上都找不太到有關資源,只好自己獻醜一下~
最後,歡迎各位留言指正,更歡迎把這篇拿去,改寫成更好的文章(因為我也懶的弄了 ┐(´д`)┌ )~ 只要記得註記一下曾經參考過這裡就好~


參考資料:



操作 QGIS 時,找來了解的一點點資料

相關專案:主要是天文資料上的應用

沒有留言:

張貼留言