這裡整理一點有關的筆記,希望能對你有幫助~
(本篇落落長,慎入!)
首先還是先從程式本身作一點簡易的介紹。
地理圖資功能,其實在原生的 PostGIS 就已經有「很簡單的」內建功能,大概有以下幾項
- 幾何資料型態:平面幾何的點、線段(直線、折線)、多邊形、圓
- 相關運算子、函數:基本集合性質(長度、周長、面積)、操作(平移、旋轉、伸縮)、基本幾何位置關係
- 內建外掛 earthdistance:使用理想球面模型的大圓距離計算地球表面兩點距離
上面可以看到什麼?當你不在地球表面的話就沒辦法處理了~~也就是說,進一步的地理功能比較欠缺。這也就是 PostGIS 專案所要提供的。
PostGIS 的軟體授權和 PostgreSQL 不一樣,是採用 GNU GPL 授權,而非 BSD 風格的授權,因此 PostGIS 沒有和 PostgreSQL 合併起來的關係。
PostGIS 和 PostgreSQL 一樣,是一個很活躍的專案,每個版本都不斷有更多進階功能。因此 PostGIS 和 PostgreSQL 一樣,在 PostGIS 升版時不能直接安裝新檔案而已;此外,PostGIS 和 PostgreSQL 之間有版本相依性,太過新的 PostGIS 沒辦法裝到過舊的 PostgreSQL 版本。我們可以到 PostGIS 的 Wiki 上確認。通常一個 PostGIS 版本會橫跨支援幾個 PostgreSQL 版本,以便進行資料庫版本升級。在比較近期版本的升版操作流程上大致如下:
上圖呈現的是,採用 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
裝完之後就是啟用: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:這是網格資料(例如,空拍資料)
以上的三大類資料型態,在 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 分成以下幾種,分別可以指定單一個幾何資訊或是數個幾何資訊的集合
- 點
- 折線
- 多邊形
- 帶洞的多邊形
- 曲線
在 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 的操作,至於真正的應用,就留給各位願意讀到這裡的人分享~
這些內容都是半路出家湊出來的,有什麼錯誤還請見諒。由於網路上都找不太到有關資源,只好自己獻醜一下~
最後,歡迎各位留言指正,更歡迎把這篇拿去,改寫成更好的文章(因為我也懶的弄了 ┐(´д`)┌ )~ 只要記得註記一下曾經參考過這裡就好~
參考資料:
oracle spatial to shape file | Oracle Community
GeoSpatial Analytics at Massive Scale: PostGIS + Greenplum - YouTube
GeoSpatial Analytics at Massive Scale: PostGIS + Greenplum - YouTube
操作 QGIS 時,找來了解的一點點資料
相關專案:主要是天文資料上的應用
沒有留言:
張貼留言