1.地理資料類型介紹
地理資料類型主要是用來提供以地理座標(我們常說的大地座標,或者經緯度)表示的空間要素的支援。地理座標屬於球面座標,以度(degree)來表示。
PostGIS幾何資料類型的基礎是一個平面,平面上兩點之間的最短距離是一條直線。因此,我們在計算幾何圖形的面積、距離、長度、交集等操作時可以使用笛卡爾數學計算公式(Cartesian mathematics)和直線向量(straight line vectors)。
相反,PostGIS地理資料類型的基礎是一個球體。球體上兩點之間的最短距離是大圓圓弧(great circle arc)。這意味著在進行相同的地理計算時需要更複雜的數學計算公式。如果要結果更加精確,則必須考慮我們真實世界的球體形狀,這樣將使計算變得更加複雜。因此,基於地理資料類型的功能函數要大大少於基於幾何資料類型的功能函數。但是隨著PostGIS版本的不斷更新,越來越多基於球面的演算法將會加入進來,地理資料類型的功能也會越來越強大。
現在PostGIS地理資料類型的一個弱勢在於它還只支援WGS84(SRID:4326)的經緯度座標。GEOS的所有功能函數都暫時還不支援這種新資料類型。
2.地理資料類型基礎
PostGIS地理資料類型現在僅支援最簡單的要素,包括點(Point),線(LineString),面(Polygon),多點(MultiPoint),多線(MultiLineString),多面(MultiPolygon)以及混合資料類型(GeometryCollection)。
建立帶有二維點資料的表可以如下例所示:
CREATE TABLE global_points(
id serial PRIMARY KEY,
name VARCHAR(64),
location geography(POINT, 4326)
);
上例中,location欄位屬於地理資料類型,它具有兩個可選的限制參數:前一個參數限制該欄位儲存圖形的類型及維數;後一個SRID限制了圖形的座標參考。在現在的版本中,只有SRID為4326的座標可以被支援。如果SRID沒有被指定,預設將會以0(undefined spheroid)來替代,但所有的計算還是會基於WGS84。當然,在未來的版本中,其他SRID也會被陸續支援。
另一點需要注意的是,與之前版本中幾何資料的建立不同,新的地理資料欄位不需要註冊在geometry_columns裡,而是在一個新的視圖裡註冊,稱為geography_columns。因此,不需要顯示的調用AddGeometryCollumn之類的功能函數。
一旦帶有地理資料欄位的表建好,就可以像下面的例子一樣往表裡插入資料:
INSERT INTO global_points (name, location)
VALUES ('Town', ST_GeographyFromText('SRID=4326; POINT (-110 30)'));
建立索引和幾何資料類型類似。
CREATE INDEX global_points_gis ON global_points USING GIST(location);
查詢與距離量算將以米為單位:
SELECT name FROM global_points WHERE ST_DWithin(location, ST_GeographyFromText('SRID=4326;POINT (-110 29)'), 1000000);
你可以通過查詢從西雅圖飛到倫敦的航線距離雷克雅未克的最短距離來體會地理資料類型的強大。
SELECT ST_Distance('LINESTRING(-122.33 47.606, 0.0 51.5)'::geography, 'POINT(-21.96 64.15)'::geography);
3.地理資料類型和幾何資料類型的選擇
地理資料類型使得我們可以將以經緯度表示的資料進行儲存,但需要耗費一定的代價:基於該類型的功能函數比較少;這些函數也要花費更多的CPU時間來計算。
選用地理資料類型還是幾何資料類型取決於使用者所研究的地區。你的研究區是遍布全球或比較大的地區,還是一個國家,一個城市,甚至於一個鄉村。如果你的研究區只是一個很小的地區,最好的選擇就是挑選合適的投影並基於幾何資料類型來計算。如果你的研究區遍布全球或是一個相當大的地區,你就應該將資料以經緯度儲存,選用地理資料類型來儲存,不需要考慮複雜的投影細節。如果你對投影不是很瞭解,你也不想去學習它們,那麼建議你使用地理資料類型。簡單的匯入你的資料就可以達到你的目的。