About PostGIS
PostGIS adds support for geographic objects to the PostgreSQL object-relational database. In effect, PostGIS "spatially enables" the PostgreSQL server, allowing it to be used as a backend spatial database for geographic information systems (GIS), much like ESRI's SDE or Oracle's Spatial extension. PostGIS follows the OpenGIS "Simple Features Specification for SQL" and has been certified as compliant with the "Types and Functions" profile.
PostGIS development was started by Refractions Research as a project in open source spatial database technology. PostGIS is released under the GNU General Public License. PostGIS continues to be developed by a group of contributors led by a Project Steering Committee and new features continue to be added.
譯文:
PostGIS 向 PostgreSQL 對象關系數據庫添加了對地理對象的支持。 實際上,PostGIS 在空間上啟用了 PostgreSQL 服務器,使其可以用作地理信息系統 (GIS) 的后端空間數據庫,就像 ESRI 的 SDE 或 Oracle 的 Spatial 擴展一樣。 PostGIS 遵循 OpenGIS“SQL 的簡單特征規范”,並已被認證為符合“類型和函數”配置文件。
PostGIS 的開發由 Refractions Research 作為開源空間數據庫技術中的一個項目啟動。 PostGIS 是在 GNU 通用公共許可證下發布的。 PostGIS 繼續由項目指導委員會領導的一組貢獻者開發,並繼續添加新功能。
友情提示:本文篇幅較長,共分為5篇文章,幾乎涵蓋了PostGIS的所有內容,PostGIS作為PostgreSQL的重要插件,是目前國內外GIS行業的首選數據庫的主要推動力。如果你感興趣的話,可以先收藏,再慢慢學習~
DownLoad
在下面的網址中,你可以選擇下載適合你的windows版本,如果你是用於生產環境,建議盡量不要選擇最近的release版本。在下載安裝PostGIS插件之前,你需要先具有PostgreSQL的運行環境。
在下面的網址中,我們在自己使用的PostGreSQL版本里面,選擇PostGIS插件,因為這些是被PostGIS官方團隊所驗證和支持的。
http://download.osgeo.org/postgis/windows/
在這個網址,你可以選擇適合你的其他版本安裝包,也包括免安裝的壓縮包形式文件。
http://postgis.net/install/
安裝
下載完成之后,進行安裝;
PostGIS
的安裝很簡單,一路下一步,但是需要注意的是,PostGIS
插件需要和PostgreSQL
安裝在同一個目錄(也就是PostGIS
需要選擇PostGreSQL
的根目錄進行安裝)。
安裝過程當中的空間數據庫可以創建也可以不創建,這個根據自己的情況來看,如果你要創建空間數據庫的話,就需要連接到當前的PostgreSQL
。
准備PostGIS
- 在開始菜單欄找到
PostGreSQL
,點擊里面的pgAdmin4
; - 點擊左上角的Server,根據提示輸入連接信息進行登錄;
- 登錄上之后,創建一個數據庫實例,並新建數據庫;
- 依次點擊:數據庫名-Extensions-右擊-create-extension,輸入:
postgis
;
使用PostGIS的前置知識
1. 常見的PostGIS支持的GIS對象
這些創建GIS對象的語法要熟悉,實際工作中很容易忘~
• 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. SRID——存儲空間對象的地理坐標系的編號,其輸入輸出可通過以下接口進行
bytea WKB = ST_AsBinary(geometry);
text WKT = ST_AsText(geometry);
geometry = ST_GeomFromWKB(bytea WKB, SRID);
geometry = ST_GeometryFromText(text WKT, SRID);
示例
SELECT (ST_GeomFromText('POINT(-126.4 45.32)', 312), 'A Place');
輸出如下:
(0101000020380100009A99999999995FC0295C8FC2F5A84640,"A Place")
3. 支持3D GIS對象的語法
PostGIS EWKB/EWKT增加了對3DM、3DZ、4D坐標的支持和嵌入式SRID信息。
• POINT(0 0 0) -- XYZ
• SRID=32632;POINT(0 0) -- XY with SRID
• POINTM(0 0 0) -- XYM
• POINT(0 0 0 0) -- XYZM
• SRID=4326;MULTIPOINTM(0 0 0,1 2 1) -- XYM with SRID
• MULTILINESTRING((0 0 0,1 1 0,1 2 1),(2 3 1,3 2 1,5 4 1))
• POLYGON((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0))
• MULTIPOLYGON(((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0)),((-1 -1 0,-1 -2 0,-2 -2 0,-2 -1 0,-1 -1 0)))
• GEOMETRYCOLLECTIONM( POINTM(2 3 9), LINESTRINGM(2 3 4, 3 4 5) )
• MULTICURVE( (0 0, 5 5), CIRCULARSTRING(4 0, 4 4, 8 4) )
• POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0
0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )
• TRIANGLE ((0 0, 0 9, 9 0, 0 0))
• TIN( ((0 0 0, 0 0 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 0 0 0)) )
3DM、3DZ、4D之間的轉換接口:
bytea EWKB = ST_AsEWKB(geometry);
text EWKT = ST_AsEWKT(geometry);
geometry = ST_GeomFromEWKB(bytea EWKB);
geometry = ST_GeomFromEWKT(text EWKT)
示例
SELECT 'SRID=4;POINT(0 0)'::geometry;
輸出如下:
01010000200400000000000000000000000000000000000000
4. 彎曲的幾何實體
SQL多媒體應用空間規范擴展了SQL規范的簡單功能,定義了一些 圓弧插值曲線。 SQL-MM的定義包括3DM、3DZ和4D坐標,但不允許嵌入SRID信息。 Well-Known Text擴展還沒有被完全支持。
下面是一些簡單的曲線幾何圖形的例子。
• CIRCULARSTRING(0 0, 1 1, 1 0)
• CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0)
• COMPOUNDCURVE(CIRCULARSTRING(0 0, 1 1, 1 0),(1 0, 0 1)) //類似於LINESTRING
• CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 3 3, 3 1, 1 1))//復合曲線
• MULTICURVE((0 0, 5 5),CIRCULARSTRING(4 0, 4 4, 8 4)) //復合曲線
5. 創建一張空間表
CREATE TABLE global_points (
id SERIAL PRIMARY KEY,
name VARCHAR(64),
location GEOGRAPHY(POINT,4326)
);
6. 插入數據
INSERT INTO global_points (name, location) VALUES ('Town', 'SRID=4326;POINT(-110 30)');
INSERT INTO global_points (name, location) VALUES ('Forest', 'SRID=4326;POINT(-109 29)');
INSERT INTO global_points (name, location) VALUES ('London', 'SRID=4326;POINT(0 49)');
7. 建立索引
Creating an index works the same as GEOMETRY. PostGIS will note that the column type is GEOGRAPHY and create an
appropriate sphere-based index instead of the usual planar index used for GEOMETRY.
CREATE INDEX global_points_gix ON global_points USING GIST ( location );
8. 查詢與計算
//查詢給位置1000公里之內的城鎮
SELECT name FROM global_points WHERE ST_DWithin(location, 'SRID=4326;POINT(-110 29)'::
geography, 1000000);
// 計算從西雅圖飛往倫敦的距離
SELECT ST_Distance('LINESTRING(-122.33 47.606, 0.0 51.5)'::geography, 'POINT(-21.96
64.15)'::geography);
//計算點線之間的距離
SELECT ST_Distance('LINESTRING(-122.33 47.606, 0.0 51.5)'::geometry, 'POINT(-21.96 64.15)
'::geometry);
9. spatial_ref_sys表
spatial_ref_sys表是一個包含PostGIS和OGC兼容的數據庫表,它列出了3000多個已知的空間參考系 系統以及在它們之間進行轉換/投影所需的細節。 雖然PostGIS的spatial_ref_sys表包含了3000多個比較常用的空間參考系統定義 的定義,但它並不包含所有已知的定義,如果你熟悉proj4的結構,你可以定義你自己的投影。
10. SRID
一個整數值,用於唯一識別數據庫中的空間參考系統(SRS)。
11. 創建一個空間數據表
//建表
CREATE TABLE ROADS (ID serial, ROAD_NAME text, geom geometry(LINESTRING,4326) );
//添加字段
ALTER TABLE roads ADD COLUMN geom2 geometry(LINESTRINGZ,4326);
12. 創建視圖,目的是簡化SQL語句
//創建視圖
CREATE VIEW public.vwmytablemercator AS
SELECT gid, ST_Transform(geom, 3395) As geom, f_name
FROM public.mytable;
//刪除視圖
DROP VIEW public.vwmytablemercator;
13. 加載 GIS (Vector) 數據
INSERT INTO roads (id, geom, road_name)
VALUES (1,'SRID=4326;LINESTRING(191232 243118,191108 243242)'::geometry,'Jeff Rd');
INSERT INTO roads (id, geom, road_name)
VALUES (2,'SRID=4326;LINESTRING(189141 244158,189265 244817)','Geordie Rd');
INSERT INTO roads (id, geom, road_name)
VALUES (3,'SRID=4326;LINESTRING(192783 228138,192612 229814)','Paul St');
INSERT INTO roads (id, geom, road_name)
VALUES (4,'SRID=4326;LINESTRING(189412 252431,189631 259122)','Graeme Ave');
INSERT INTO roads (id, geom, road_name)
VALUES (5,'SRID=4326;LINESTRING(190131 224148,190871 228134)','Phil Tce');
INSERT INTO roads (id, geom, road_name)
VALUES (6,'SRID=4326;LINESTRING(198231 263418,198213 268322)','Dave Cres');
COMMIT;
14. 導入數據
14.1 使用psql
psql -d [database] -f roads.sql
14.2 使用shp2pgsql
# shp2pgsql -c -D -s 4269 -i -I shaperoads.shp myschema.roadstable > roads.sql
# psql -d roadsdb -f roads.sql
14.3 Unix 命令
# shp2pgsql shaperoads.shp myschema.roadstable | psql -d roadsdb
15. 檢索數據
//全查
SELECT id, ST_AsText(geom) AS geom, road_name FROM roads;
//條件查詢
SELECT id, road_name
FROM roads
WHERE geom='SRID=312;LINESTRING(191232 243118,191108 243242)'::geometry;
//相交查詢
SELECT id, road_name
FROM roads
WHERE ST_Intersects(geom, 'SRID=312;POLYGON((...))');
//使用矩形框來查詢框內是否含有目標實體
SELECT ST_AsText(geom) AS geom
FROM roads
WHERE
geom && ST_MakeEnvelope(191232, 243117,191232, 243119,312,4326);
16. pgsql2shp
//語法模板
pgsql2shp [<options>] <database> [<schema>.]<table>
pgsql2shp [<options>] <database> <query>
17. 建立索引
索引使得處理空間數據庫大型數據集成為可能。
GiST Indexes
GiST是 "通用搜索樹 "的縮寫,是一種通用的索引形式。除了GIS索引之外,GiST還被用來加速 加快對各種不規則數據結構(整數陣列、光譜數據等)的搜索,這些結構不適合使用普通的B-Tree 索引。
//2D索引
CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] );
//n維索引
CREATE INDEX [indexname] ON [tablename] USING GIST ([geometryfield] gist_geometry_ops_nd);
//確保索引在更新或者建立時,依然可以對表進行寫操作;
CREATE INDEX CONCURRENTLY [indexname] ON [tablename] USING GIST ( [geometryfield] );
//收集表的統計數據報告,以便優化查詢SQL
VACUUM ANALYZE [table_name] [(column_name)];
BRIN Indexes
BRIN是 "塊范圍索引 "的意思,是PostgreSQL 9.5中引入的一種通用的索引形式。BRIN是 是一種有損失的索引,它的主要用途是為讀和寫的性能提供一個折中。它的主要目標是 處理非常大的表,其中一些列與它們在表中的物理位置有一些自然的關聯。 表內的物理位置有一些自然的關聯。除了GIS索引之外,BRIN還被用來加快對各種規則或不規則數據結構的搜索速度 (整數、數組等)
//普通2D索引
CREATE INDEX [indexname] ON [tablename] USING BRIN ( [geometryfield] );
//3D索引
CREATE INDEX [indexname] ON [tablename] USING BRIN ([geometryfield]
brin_geometry_inclusion_ops_3d);
//4D索引
CREATE INDEX [indexname] ON [tablename] USING BRIN ([geometryfield]
brin_geometry_inclusion_ops_4d);
//修改默認的塊大小
CREATE INDEX [indexname] ON [tablename] USING BRIN ( [geometryfield] ) WITH (
pages_per_range = [number]);
SP-GiST Indexes
SP-GiST是 "空間分割的通用搜索樹 "的縮寫,是一種通用的索引形式,支持分割的 搜索樹,如四叉樹、K-D樹和弧度樹(tries)。這些數據結構的共同特點是,它們 重復地將搜索空間划分為不需要同等大小的分區。除了GIS索引之外,SP-GiST還被用來 加快對許多種數據的搜索,如電話路由、IP路由、子串搜索等。 與GiST索引一樣,SP-GiST索引也是有損失的,因為它們存儲的是包含空間對象的邊界盒。 對象。SP-GiST索引可以被看作是GiST索引的替代品。性能測試表明,SP-GiST 索引在有許多重疊對象的情況下特別有用,也就是所謂的 "面條數據"。 一旦GIS數據表超過幾千行,就可以使用SP-GiST索引來加快數據的空間搜索速度。
//2D索引
CREATE INDEX [indexname] ON [tablename] USING SPGIST ( [geometryfield] );
//3D索引
CREATE INDEX [indexname] ON [tablename] USING SPGIST ([geometryfield]
spgist_geometry_ops_3d);
//確保索引在更新或者建立時,依然可以對表進行寫操作;
CREATE INDEX CONCURRENTLY [indexname] ON [tablename] USING SPGIST ( [geometryfield] );
//收集表的統計數據,以便優化查詢SQL
VACUUM ANALYZE [table_name] [(column_name)];
關於空間索引的具體使用和操作符介紹,請大家參考這篇文章,這里就不具體一一展開了。
那其實准確的來講空間索引不是PostGreSQL
提供的,而是由PostGIS
提供的功能,這也正體現插件擴展的的意義就是存在於無形,卻作用無處不在!
18. 復雜查詢示例
//距離匹配查詢
SELECT the_geom
FROM geom_table
WHERE ST_Distance(the_geom, 'SRID=312;POINT(100000 200000)')
//指定100的緩沖區的范圍內查詢
SELECT the_geom
FROM geom_table
WHERE ST_DWithin(the_geom, 'SRID=312;POINT(100000 200000)', 100)
19. raster2pgsql
//柵格數據轉為sql文件
raster2pgsql raster_options_go_here raster_file someschema.sometable > out.sql
//實操示例,柵格數據入庫
raster2pgsql -s 4326 -I -C -M *.tif -F -t 100x100 public.demelevation > elev.sql
psql -d gisdb -f elev.sql
//Unix下柵格數據入庫的操作命令
raster2pgsql -s 4326 -I -C -M *.tif -F -t 100x100 public.demelevation | psql -d gisdb
//創建一個全視圖、2和4級的概述表,使用復制模式插入
raster2pgsql -I -C -e -Y -F -s 26986 -t 128x128 -l 2,4 bostonaerials2008/*.jpg aerials.
boston | psql -U postgres -d gisdb -h localhost -p 5432
// get a list of raster types supported:
raster2pgsql -G
//創建一張存儲柵格數據的表
CREATE TABLE myrasters(rid serial primary key, rast raster);
//建立索引
CREATE INDEX myrasters_rast_st_convexhull_idx ON myrasters USING gist( ST_ConvexHull(
rast) );
20. PostGIS Geometry/Geography/Box Data Types
box2d
box2d是一種空間數據類型,用於表示一個幾何體或幾何體集合的二維圍合盒。例如 例如,ST_Extent聚合函數返回一個box2d對象。 該表示法包含xmin、ymin、xmax、ymax的值。這些是X和Y軸的最小值和最大值。 和Y擴展的最小值和最大值。
box3d
box3d是一個postgis空間數據類型,用於表示一個幾何體或幾何體集合的三維包圍盒。 幾何體的三維包圍盒。例如,ST_3DExtent聚合函數返回一個box3d對象。 該表示法包含xmin, ymin, zmin, xmax, ymax, zmax的值。這些是X、Y和Z的最小和最大 X、Y和Z軸的極限值。
geometry
geometry是PostGIS的一個基本空間數據類型,用於表示平面(歐幾里得)坐標系中的一個特征。 對幾何體的所有空間操作都使用幾何體所在的空間參考系統的單位。
geometry_dump
geometry_dump是一個包含字段的復合數據類型。
- geom - 對一個幾何體組件的引用
- path[] - 一個一維的整數數組,定義了傾倒的幾何體到geom組件的導航路徑。 路徑數組從1開始(例如,path[1]是第一個元素。) 它被ST_Dump*系列函數用作輸出類型,將一個復雜的幾何體分解成其組成部分。
geography
geography是一種空間數據類型,用於在大地坐標系中表示一個特征。大地坐標系的模型 使用一個橢圓體對地球進行建模。 通過考慮到橢圓體模型,對地理學類型的空間操作可以提供更准確的結果。
總結
這篇文章,我們主要對PostGIS 的背景、下載、安裝,以及一些常用的前置知識進行了較為系統的介紹。
如果你對PostGIS有興趣,希望可以幫助到你~