PostGIS 筆記一:簡單入門
Postgis是基于PostgreSQL的空間擴展木张。所以你懂得PostgreSQL不代表你就懂得Postgis咳蔚,你懂得Postgis也不代表你就懂得PostgreSQL。如果你看過我關于Spatialite的筆記锯茄,你具備了一定空間數據庫的基礎厢塘。
使用
Postgis分為兩個大版本,它們之間有較大幅度的更新肌幽,網上很多教程都是基于舊版本的postgis晚碾。在安裝的階段當中,新版本的postgis會出現“template_postgis
模板不存在”的問題喂急。解決方案有兩個:
一是參考postgis不具備template_postgis模板自建模板格嘁。
二是創(chuàng)建PostGIS擴展
CREATE EXTENSION postgis
同樣,很多第三方庫也會區(qū)分postgis的版本廊移,專門針對2.0版本后進行定制糕簿。
運用
空間字段可以分為geometry和geography兩種,大部分情況使用滿足opengis標準的geometry狡孔。
創(chuàng)建空間字段
方法一
打開空間擴展后懂诗,前提是你首先創(chuàng)建一張表,運用opengis標準推薦的方法創(chuàng)建空間字段苗膝。
SELECT AddGeometryColumn ('scheme'殃恒,'cities', 'the_geom', 4326, 'POINT', 2);
缺點在于這是一個擴展的方法,表名荚醒、字段名等參數是區(qū)分大小寫的芋类。
方法二
也可以使用geometry type的方法隆嗅,同時創(chuàng)建表界阁。
CREATE TABLE ROADS ( ID int4, ROAD_NAME varchar(25), geom geometry(LINESTRING,4326) );
或者修改表
ALTER TABLE roads ADD COLUMN geom2 geometry(LINESTRINGZ,4326);
插入一條數據
由于空間數據的描述相對復雜,空間數據的插入需要依靠別的數據格式進行轉換胖喳。ST_GeomFromText
是從文本進行轉換泡躯。
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)'), '北京' )
讀取一條數據
顯示數據可以將空間字段保存成不同的格式较剃。
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數據格式不用Geometry數據格式
新型的GEOGRAPHY格式允許你用
longitude/latitude coordinates
存數據,但是有一個代價:針對GEOGRAPHY很少方法被定義技健,而針對GEOMETRY相對較多写穴。而且這些方法都相對來說更消耗CPU。
你選擇這個數據類型必須是因為你應用的情況雌贱。你的數據如果是全球或者大陸范圍或者是一個洲啊送,一個國家或者一個城市偿短。
- 如果數據在一個很小的范圍內,你可能需要選擇一個恰當的投影馋没,用Geometry是最好的解決方案昔逗,因為性能優(yōu)先和功能可用。
- 你的數據是全球或者大范圍的篷朵,你會發(fā)現GEOGRAPHY讓你建立一個系統(tǒng)不用擔心投影信息勾怒。你可以用經緯度存起你的數據。
- 你不懂得投影声旺,你也不想去學投影笔链,你可以接受GEOGRAPHY的方法缺失,你應該選擇GEOGRAPHY而不是GEOMETRY艾少。因為這樣更方便你去加載用經緯度數據卡乾。