在講解PostGIS的時候發(fā)現(xiàn)很多人對于PostGIS到底能做什么不是很清晰筋粗,在此寫一篇基本介紹策橘,內容比較多會分期寫
1.PostGIS是啥
PostGIS是在對象關系型數(shù)據(jù)庫PostgreSQL上增加了存儲管理空間數(shù)據(jù)的能力的開源GIS數(shù)據(jù)庫。
GIS數(shù)據(jù)庫娜亿,也叫空間數(shù)據(jù)庫(Spatial database)丽已,是負責存儲處理位置(空間)數(shù)據(jù)和非空間數(shù)據(jù)的數(shù)據(jù)庫。
任何真實世界的對象(也叫物體)都能表示成數(shù)據(jù)庫中的對象买决,其中一部分真實世界的對象會跟地理位置有關沛婴,我們管他們叫“地物”(Features),對地物的存儲和處理就是空間(GIS)數(shù)據(jù)庫的基本功能督赤。
在O2O嘁灯、LBS、物聯(lián)網(wǎng)躲舌、新零售等這些越來越傾向線下業(yè)務的互聯(lián)網(wǎng)概念中丑婿,本質都繞不開對“地物”的處理,不管是動的對象(人没卸、機器人羹奉、動物、汽車约计、自行車诀拭、無人機、地鐵等)還是不動的對象(商店煤蚌、公司耕挨、廣場、水系铺然、停車點等)俗孝,這些都是“地物”,都需要做存儲和運算魄健,互聯(lián)網(wǎng)開發(fā)人員如果掌握了PostGIS赋铝,就相當于掌握了處理“地物”的利器,多了一把在上述行業(yè)中披荊斬棘的斧子沽瘦。
PostGIS是一群國外GISer在PostgreSQL實現(xiàn)的插件革骨,PostgreSQL是著名的老牌數(shù)據(jù)庫,特點是功能全析恋,什么都能干(當數(shù)倉良哲、做業(yè)務庫、當MQ助隧、做MPP等)筑凫,社區(qū)活躍,業(yè)內對標的是oracle。開源后使用率年年上升巍实,現(xiàn)壓mongodb穩(wěn)穩(wěn)全球排名第四滓技,而且還在上升中(mongo幾乎沒有增長)。
PostgresQL的標志是只大象:
PostGIS強大的空間數(shù)據(jù)庫功能依托于PostgreSQL的兩個重要特性:
1.Geometry對象
Geometry(幾何對象類型)是PG的一個基本存儲類型棚潦,PostGIS的空間數(shù)據(jù)都會以Geometry的形式存儲在PostgreSQL里令漂,本質是個二進制對象。
2.Gist索引
Gist(Generalized Search Tree)丸边,通用搜索樹叠必,本身是索引框架,一種平衡樹結構的訪問方法妹窖,用戶可以針對不同場景基于Gist定制自己的索引纬朝。
Gist的索引建立依賴于聚合運算(聚合運算的實現(xiàn)接口PG也開放出來了,用戶甚至可以自己寫)嘱吗,適合多維數(shù)據(jù)類型和集合數(shù)據(jù)類型玄组。
PG針對Geometry對象已經(jīng)寫好了一套Gist索引滔驾,用于空間檢索谒麦。
PostGIS是“踩在巨人肩膀上”實現(xiàn)的空間數(shù)據(jù)存儲與檢索,自身又基于OGC(Open Geospatial Consortium哆致,開放地理協(xié)會)的規(guī)范實現(xiàn)了專業(yè)的功能和合理的類型擴展绕德,加上最終的開源,讓他成為了現(xiàn)金最流行的空間數(shù)據(jù)庫摊阀。
2.PostGIS都能做啥
這個話題其實就是“一個好的空間數(shù)據(jù)庫都能做啥耻蛇?”
答案是:能做
1.空間數(shù)據(jù)存儲
2.空間數(shù)據(jù)輸出
3.空間數(shù)據(jù)訪問
4.空間數(shù)據(jù)編輯
5.空間數(shù)據(jù)處理
6.空間數(shù)據(jù)關系判斷和測量
7.空間拓撲實現(xiàn)
1.空間數(shù)據(jù)存儲
PostGIS基于OGC的“Simple Feature for Specification for SQL”規(guī)范,在Geometry對象上實現(xiàn)了一系列的GIS Object(地物對象)胞此,使用了OGC推薦的WKT(Well-Known Text)和WKB(Well-Known Binary)格式進行描述臣咖,大幅增加了易用性,例如WKT的7個基本類型:
點:
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))
WKB是WKT的二進制版本漱牵,還有一個TWKB是WKB的壓縮版
PostGIS自身又在WKT和WKB基礎上擴展實現(xiàn)了EWKT和EWKB來滿足更復雜的場景需求夺蛇,例如EWKT的類型:
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)) )
POINT(0 0 0)可以存三維坐標,POINTM(0 0 0) 可以存額外自定義維度酣胀,例如時間(很適合存軌跡點)等刁赦。
下面用個例子說明EWKT跟Geometry的關系:
SELECT 'SRID=4;POINT(0 0)'::geometry;
::geometry的作用是把格式強制轉換成geometry,EWKT的文字描述就被轉成了Geometry格式的二進制對象闻镶,語句執(zhí)行結果:
geometry
----------------------------------------------------
01010000200400000000000000000000000000000000000000
(1 row)
上述的空間數(shù)據(jù)在一張表里的表現(xiàn)形式與其他類型數(shù)據(jù)沒有差別甚脉,只是一個字段而已,字段類型是Geometry铆农。
PostGIS還有一種額外的空間數(shù)據(jù)類型Geography(地理對象)牺氨,跟Geometry的區(qū)別是Geography的空間運算都是基于EPSG:4326大地坐標系下的橢球面運算(Geometry的運算使用的都是笛卡爾平面直角坐標系),非常實用但會有額外開銷,個人推薦存儲時用Geometry猴凹,做距離面積等測量運算的時候在轉換為Geography酝豪。
可以看出PostGIS有著豐富的GIS Object(地物)描述類型,和擁抱OGC標準的數(shù)據(jù)結構精堕,他也是系統(tǒng)化學習GIS的好工具孵淘。
(未完)