PostGIS 筆記一:簡(jiǎn)單入門
Postgis是基于PostgreSQL的空間擴(kuò)展。所以你懂得PostgreSQL不代表你就懂得Postgis,你懂得Postgis也不代表你就懂得PostgreSQL。如果你看過(guò)我關(guān)于Spatialite的筆記,你具備了一定空間數(shù)據(jù)庫(kù)的基礎(chǔ)。
- 1簡(jiǎn)單的入門
- 2CLI Cheat Sheet
- 3python for Spatialite
- 4NET平臺(tái)使用spatilite擴(kuò)展
- 5Spatiliate2GeoJson數(shù)據(jù)的轉(zhuǎn)換
使用
Postgis分為兩個(gè)大版本,它們之間有較大幅度的更新,網(wǎng)上很多教程都是基于舊版本的postgis。在安裝的階段當(dāng)中,新版本的postgis會(huì)出現(xiàn)“template_postgis
模板不存在”的問(wèn)題。解決方案有兩個(gè):
一是參考postgis不具備template_postgis模板自建模板。
二是創(chuàng)建PostGIS擴(kuò)展
CREATE EXTENSION postgis
同樣,很多第三方庫(kù)也會(huì)區(qū)分postgis的版本,專門針對(duì)2.0版本后進(jìn)行定制。
運(yùn)用
空間字段可以分為geometry和geography兩種,大部分情況使用滿足opengis標(biāo)準(zhǔn)的geometry。
創(chuàng)建空間字段
方法一
打開空間擴(kuò)展后,前提是你首先創(chuàng)建一張表,運(yùn)用opengis標(biāo)準(zhǔn)推薦的方法創(chuàng)建空間字段。
SELECT AddGeometryColumn ('scheme','cities', 'the_geom', 4326, 'POINT', 2);
缺點(diǎn)在于這是一個(gè)擴(kuò)展的方法,表名、字段名等參數(shù)是區(qū)分大小寫的。
方法二
也可以使用geometry type的方法,同時(shí)創(chuàng)建表。
CREATE TABLE ROADS ( ID int4, ROAD_NAME varchar(25), geom geometry(LINESTRING,4326) );
或者修改表
ALTER TABLE roads ADD COLUMN geom2 geometry(LINESTRINGZ,4326);
插入一條數(shù)據(jù)
由于空間數(shù)據(jù)的描述相對(duì)復(fù)雜,空間數(shù)據(jù)的插入需要依靠別的數(shù)據(jù)格式進(jìn)行轉(zhuǎn)換。ST_GeomFromText
是從文本進(jìn)行轉(zhuǎn)換。
INSERT INTO roads (road_id, roads_geom, road_name) VALUES (3,ST_GeomFromText('LINESTRING(192783 228138,192612 229814)',-1),'Paul St');
或者用wkt,可以參考WKT&WKB 筆記一:格式介紹。
INSERT INTO table ( SHAPE, NAME )VALUES ( GeomFromEWKT('SRID=4326;POINTM(116.39 39.9 10)'), '北京' )
讀取一條數(shù)據(jù)
顯示數(shù)據(jù)可以將空間字段保存成不同的格式。
SELECT id, ST_AsText(the_geom), ST_AsGeoJson(the_geom), ST_AsEwkt(the_geom), ST_X(the_geom), ST_Y(the_geom) FROM cities;
用Geography數(shù)據(jù)格式不用Geometry數(shù)據(jù)格式
新型的GEOGRAPHY格式允許你用
longitude/latitude coordinates
存數(shù)據(jù),但是有一個(gè)代價(jià):針對(duì)GEOGRAPHY很少方法被定義,而針對(duì)GEOMETRY相對(duì)較多。而且這些方法都相對(duì)來(lái)說(shuō)更消耗CPU。
你選擇這個(gè)數(shù)據(jù)類型必須是因?yàn)槟銘?yīng)用的情況。你的數(shù)據(jù)如果是全球或者大陸范圍或者是一個(gè)洲,一個(gè)國(guó)家或者一個(gè)城市。
- 如果數(shù)據(jù)在一個(gè)很小的范圍內(nèi),你可能需要選擇一個(gè)恰當(dāng)?shù)耐队埃肎eometry是最好的解決方案,因?yàn)樾阅軆?yōu)先和功能可用。
- 你的數(shù)據(jù)是全球或者大范圍的,你會(huì)發(fā)現(xiàn)GEOGRAPHY讓你建立一個(gè)系統(tǒng)不用擔(dān)心投影信息。你可以用經(jīng)緯度存起你的數(shù)據(jù)。
- 你不懂得投影,你也不想去學(xué)投影,你可以接受GEOGRAPHY的方法缺失,你應(yīng)該選擇GEOGRAPHY而不是GEOMETRY。因?yàn)檫@樣更方便你去加載用經(jīng)緯度數(shù)據(jù)。