PostGIS簡介
PostGIS是對象關系型數據庫系統PostgreSQL的一個擴展,PostGIS提供如下空間信息服務功能:空間對象、空間索引、空間操作函數和空間操作符。同時,PostGIS遵循OpenGIS的規范。
PostGIS的版權被納入到GNU的GPL中,也就是說任何人可以自由得到PostGIS的源碼並對其做研究和改進。正是由於這一點,PostGIS得到了迅速的發展,越來越多的愛好者和研究機構參與到PostGIS的應用開發和完善當中。
PostGIS特性
PostGIS支持所有的空間數據類型,這些類型包括:點(POINT)、線(LINESTRING)、多邊形(POLYGON)、多點 (MULTIPOINT)、多線(MULTILINESTRING)、多多邊形(MULTIPOLYGON)和集合對象集 (GEOMETRYCOLLECTION)等。PostGIS支持所有的對象表達方法,比如WKT和WKB。
PostGIS支持所有的數據存取和構造方法,如GeomFromText()、AsBinary(),以及GeometryN()等。
PostGIS提供簡單的空間分析函數(如Area和Length)同時也提供其他一些具有復雜分析功能的函數,比如Distance。
PostGIS提供了對於元數據的支持,如GEOMETRY_COLUMNS和SPATIAL_REF_SYS,同時,PostGIS也提供了相應的支持函數,如AddGeometryColumn和DropGeometryColumn。
PostGIS提供了一系列的二元謂詞(如Contains、Within、Overlaps和Touches)用於檢測空間對象之間的空間關系,同時返回布爾值來表征對象之間符合這個關系。
PostGIS提供了空間操作符(如Union和Difference)用於空間數據操作。比如,Union操作符融合多邊形之間的邊界。兩個交迭的多邊形通過Union運算就會形成一個新的多邊形,這個新的多邊形的邊界為兩個多邊形中最大邊界。
PostGIS還提供以下功能:
數據庫坐標變換
數據庫中的幾何類型可以通過Transform函數從一種投影系變換到另一種投影系中。在OpenGIS中的幾何類型都將SRID作為自身結構的一部分,但不知什么原因,在OpenGIS的SFSQL規范中,並沒有引入Transform。
球體長度運算
存儲在普通地理坐標系中的集合類型如果不進行坐標變換是無法進行程度運算的,OpenGIS所提供的坐標變換使得積累類型的程度計算變成可能。
三維的幾何類型
SFSQL規范只是針對二維集合類型。OpenGIS提供了對三維集合類型的支持,具體是利用輸入的集合類型維數來決定輸出的表現方式。例如,即便 所有幾何對象內部都以三維形式存儲,純粹的二維交叉點通常還是以二維的形式返回。此外,還提供幾何對象在不同維度間轉換的功能。
空間聚集函數
在數據庫中,聚集函數是一個執行某一屬性列所有數據操作的函數。比如Sum和Average,Sum是求某一關系屬性列的數據總和,Average 則是求取某一關系屬性列的數據平均值。與此對應,空間聚集函數也是執行相同的操作,不過操作的對象是空間數據。例如聚集函數Extent返回一系列要素中 的最大的包裹矩形框,如“SELECT EXTENT(GEOM) FROM ROADS”這條SQL語句的執行結果是返回ROADS這個數據表中所有的包裹矩形框。
柵格數據類型
PostGIS通過一種新的數據類型片,提供對於大的柵格數據對象的存儲。片由以下幾個部分組成:包裹矩形框、SRID、類型和一個字節序列。通過 將片的大小控制在數據庫頁值(32×32)以下,使得快速的隨即訪問變成可能。一般大的圖片也是通過將其切成32×32像素的片然后再存儲在數據庫中的。
PostgreSQL + PostGIS 方案
由於源代碼安裝PostGIS需要安裝Proj4,GEOS,libxml2,json-c,GDAL等依賴包;最簡便的方法便是實用EDB的PostgreSQL安裝包,在安裝EDB的PostgreSQL安裝包時可以直接下載並安裝postGIS插件;安裝完成並啟動數據庫之后有如下擴展為安裝成功;
postgres=# select * from pg_available_extensions where name like 'postgis%';
name | default_version | installed_version | comment
------------------------+-----------------+-------------------+---------------------------------------------------------------------
postgis | 2.2.5 | | PostGIS geometry, geography, and raster spatial types and functions
postgis_topology | 2.2.5 | | PostGIS topology spatial types and functions
postgis_tiger_geocoder | 2.2.5 | | PostGIS tiger geocoder and reverse geocoder
(3 rows)
並且會自動創建一個GIS模板庫 template_postgis;有如下系統表信息;
template_postgis=# \d
List of relations
Schema | Name | Type | Owner
--------+-------------------+-------+----------
public | cities | table | postgres
public | geography_columns | view | postgres
public | geometry_columns | view | postgres
public | raster_columns | view | postgres
public | raster_overviews | view | postgres
public | spatial_ref_sys | table | postgres
若需要創建新的空間數據庫可以執行如下操作;
[postgres@localhost ~]$ psql -c "create database gis_db;"
Password:
CREATE DATABASE
[postgres@localhost ~]$ psql -d gis_db -c "create extension postgis;"
Password:
CREATE EXTENSION
[postgres@localhost ~]$ psql -d gis_db -c "create extension postgis_topology;"
Password:
CREATE EXTENSION
[postgres@localhost ~]$ psql -d gis_db
Password:
gis_db=# \d
List of relations
Schema | Name | Type | Owner
----------+-------------------+----------+----------
public | geography_columns | view | postgres
public | geometry_columns | view | postgres
public | raster_columns | view | postgres
public | raster_overviews | view | postgres
public | spatial_ref_sys | table | postgres
topology | layer | table | postgres
topology | topology | table | postgres
topology | topology_id_seq | sequence | postgres
(8 rows)
建空間表
gis_db=# create table cities (id int4, name varchar(20));
CREATE TABLE
添加幾何字段
gis_db=# select AddGeometryColumn('public', 'cities', 'shape', 4326, 'POINT', 2);
addgeometrycolumn
--------------------------------------------------
public.cities.shape SRID:4326 TYPE:POINT DIMS:2
(1 row)
創建索引
gis_db=# CREATE INDEX shape_index_cities ON cities USING gist (shape);
CREATE INDEX
ref:http://www.cnblogs.com/wuhenke/archive/2010/08/02/1790747.html
ref:http://www.cnblogs.com/kaituorensheng/p/4647901.html#_label3
ref:https://jimubiji.com/note/661
ref:http://mysql.taobao.org/monthly/2015/07/04/