一、介紹

在前面的章節中,我們已經往資料庫中載入了數據,現在讓我們來先看一些簡單的例子。

在pgAdmin中,再次選擇nyc資料庫並打開SQL查詢工具。將下面的SQL代碼粘貼到pgAdmin SQL Editor窗口中(刪除默認情況下可能存在的任何文本),然後執行。

CREATE TABLE geometries (name varchar, geom geometry);

INSERT INTO geometries VALUES
(Point, POINT(0 0)),
(Linestring, LINESTRING(0 0, 1 1, 2 1, 2 2)),
(Polygon, POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))),
(PolygonWithHole, POLYGON((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 1 2, 2 2, 2 1, 1 1))),
(Collection, GEOMETRYCOLLECTION(POINT(2 0),POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))));

SELECT name, ST_AsText(geom) FROM geometries;

上面的示例創建了一個(geometries),然後向該中插入5個幾何圖形數據(geometry):

  • 一個(POINT)
  • 一條(LINESTRING)
  • 一個多邊形(POLYGON)
  • 一個內含空洞的多邊形(POLYGON with a hole)
  • 一個圖形集合(COLLECTION)

最後,查詢表中的數據並輸出。

二、元數據表

為了符合Simple Features for SQL(SFSQL)規範,PostGIS提供了兩張表用於追蹤和報告資料庫中的幾何圖形(這兩張表中的內容相當於元數據):

  • 第一張表spatial_ref_sys —— 定義了資料庫已知的所有空間參照系統,稍後將對其進行更詳細的說明。
  • 第二張表(實際上是視圖-view)geometry_columns —— 提供了資料庫中所有空間數據表的描述信息。
geometry_columns視圖的結構

讓我們來看一下資料庫中的geometry_columns表,像原先那樣將以下命令粘貼到查詢工具中:

SELECT * FROM geometry_columns;

  • f_table_catalog,f_table_schema,和f_table_name提供各個幾何圖形(geometry)的要素表(feature table)—— 即空間數據表 —— 的完全限定名稱,分別是資料庫名、模式名、空間數據表名。
  • f_geometry_column包含對應空間數據表中用於記錄幾何信息的屬性列的列名
  • coord_dimension定義幾何圖形的維度(2維、3維或4維)
  • srid定義引用自spatial_ref_sys表的空間參考標識符
  • type列定義了幾何圖形的類型。比如"(Point)"和"線串(Linestring)"等類型。

通過查詢該表,GIS客戶端和資料庫可以確定檢索數據時的預期內容,並可以執行任何必要的投影、處理、渲染而無需檢查每個幾何圖形(geometry)—— 這些就是元數據所帶來的作用。

注意:如果nyc資料庫沒有指定26918的srid,那該怎麼辦呢?通過更新很容易修復:

SELECT UpdateGeometrySRID(nyc_neighborhoods,geom,26918);

三、表示真實世界的對象

Simple Features for SQL(SFSQL)規範是PostGIS開發的原始指導標準,它定義瞭如何表示真實世界的對象。

通過形成連續的圖形並以固定的解析度對其進行數字化,實現了對真實世界的合理表示。

SFSQL只規定了對真實世界對象的二維表示,然而,PostGIS已將其擴展到3維和4維的表示。最近,SQL-Multimedia Part 3(SQL/MM)規範正式定義了它們自己的三維表示。

示例的包含不同幾何圖形類型的混合。我們可以使用讀取幾何圖形元數據的函數獲取每個對象的基本信息:

  • ST_GeometryType(geometry) —— 返回幾何圖形的類型
  • ST_NDims(geometry) —— 返回幾何圖形的維數
  • ST_SRID(geometry) —— 返回幾何圖形的空間參考標識碼

SELECT name, ST_GeometryType(geom), ST_NDims(geom), ST_SRID(geom)
FROM geometries;

3.1、點(Points)

空間(Point)表示地球上的單個位置。由單個坐標表示(包括2維、3維或4維)。

當詳細的細節(例如形狀和大小)在目標空間尺度上不重要時,真實世界中的對象可以直接用表示。

例如,世界地圖上的城市可以描述為,而在一幅州地圖中可以將城市表示為多邊形

SELECT ST_AsText(geom)
FROM geometries
WHERE name = Point;

針對的一些特定空間函數包括:

  • ST_X(geometry) —— 返回X坐標
  • ST_Y(geometry) —— 返回Y坐標

所以,我們這樣來讀取一個圖形的坐標值:

SELECT ST_X(geom), ST_Y(geom)
FROM geometries
WHERE name = Point;

紐約市地鐵站(nyc_subway_stations)表是一個以表示的數據集。以下SQL查詢將返回一個圖形數據(在ST_AsText列中):

SELECT name, ST_AsText(geom)
FROM nyc_subway_stations
LIMIT 1;

3.2、線串(Linestring)

線串(Linestring)是表示兩個或多個位置之間的路徑,它的形式是由兩個或多個組成的有序序列。道路和河流通常表示為線串

如果線串的起始點和結束點是同一個,則稱其是閉合的(closed)。

如果線串不與自身交叉或接觸(如果線串是閉合的,則排除結束點),則稱其是簡單的(simple)。

線串既可以是閉合的,也可以是簡單的

紐約的街道網路數據(nyc_streets)在前面的章節中已經載入到資料庫中了,這個數據集包含名稱類型等詳細信息。

一條真實的街道可能由許多線串組成,每條線串代表一段具有不同屬性特徵的道路。

以下SQL查詢將返回一個線串圖形的信息(在ST_AsText列中)

SELECT ST_AsText(geom)
FROM geometries
WHERE name = Linestring;

用於處理線串的一些特定空間函數包括:

  • ST_Length(geometry) —— 返回線串的長度
  • ST_StartPoint(geometry) —— 將線串的第一個坐標作為點返回
  • ST_EndPoint(geometry) —— 將線串的最後一個坐標作為點返回
  • ST_NPoints(geometry) —— 返回線串的坐標數量

所以,我們的線串的長度為:

SELECT ST_Length(geom)
FROM geometries
WHERE name = Linestring;

3.3、多邊形(Polygon)

多邊形(Polygon)是區域的表示形式。多邊形的外部邊界由一個(Ring)表示,這個是一個線串,如上面定義的,它既是閉合的,又是簡單的。多邊形中的(hole)也由表示

多邊形用於表示重視大小形狀這兩個特徵的地理對象。城市邊界、公園、建築或水體都通常需要表示為多邊形,當比例尺足夠大時,可以觀測它們的面積。道路和河流有時也可以表示為多邊形

以下SQL查詢將返回兩個多邊形圖形的信息(在ST_AsText列中):

SELECT ST_AsText(geom)
FROM geometries
WHERE name LIKE Polygon%;

注意:我們不是在WHERE子句中使用"="符號,而是使用LIKE運算符執行字元串匹配操作。你可能習慣使用"*"符號作為模式匹配中的單字元或多字元匹配,但在SQL中,使用"%"符號和LIKE運算符來告訴系統執行全局匹配。

第一個多邊形只有一個,第二個多邊形有一個內部的"孔洞(hole)",大多數圖形系統都包含多邊形的概念,但GIS系統在允許多邊形方面是比較獨特的。

關於多邊形圖形的一些特定空間函數包括:

  • ST_Area(geometry) —— 返回多邊形的面積
  • ST_NRings(geometry) —— 返回多邊形中環的數量(通常為1個,其他是孔)
  • ST_ExteriorRing(geometry) —— 以線串的形式返回多邊形最外面的環
  • ST_InteriorRingN(geometry, n) —— 以線串形式返回指定的內部環
  • ST_Perimeter(geometry) —— 返回所有環的長度

我們可以使用空間函數計算多邊形的面積:

SELECT name, ST_Area(geom)
FROM geometries
WHERE name LIKE Polygon%;

請注意,帶多邊形的面積是多邊形外環的面積(10 x 10正方形)減去的面積(1 x 1正方形)

3.4、集合(Collection)

有四種集合(Collection)類型,它們將多個簡單幾何圖形組合為圖形集合

  • MultiPoint —— 點集合
  • MultiLineString —— 線串集合
  • MultiPolygon —— 多邊形集合
  • GeometryCollection —— 由任意幾何圖形(包括其他GeometryCollection)組成的異構集合

集合更多地出現在GIS軟體中,而不是在通用圖形軟體中。

集合對於將真實世界的對象直接建模為空間對象非常有用。例如,如何對被路權路權指交通參與者的權利)分割的多個道路部分進行建模?答案是將其作為MultiPolygon,其組成部分位於路權的兩側。

我們示例中的幾何圖形集合包含一個多邊形和一個點:

SELECT name, ST_AsText(geom)
FROM geometries
WHERE name = Collection;

用於處理集合的一些特定空間函數

  • ST_NumGeometries(geometry) —— 返回集合中的組成部分的數量
  • ST_GeometryN(geometry, n) —— 返回集合中指定的組成部分
  • ST_Area(geometry) —— 返回集合中所有多邊形組成部分的總面積
  • ST_Length(geometry) —— 返回所有線段組成部分的總長度

四、幾何圖形輸入和輸出

在資料庫中,幾何圖形(Geometry)以僅供PostGIS使用的格式存儲在磁碟上。為了讓外部程序插入和檢索有用的幾何圖形信息,需要將它們轉換為其他應用程序可以理解的格式。

幸運的是,PostGIS支持以多種格式進行幾何圖形的輸入和輸出。

①Well-known text(WKT)

  • ST_GeomFromText(text, srid) —— 返回geometry
  • ST_AsText(geometry) —— 返回text
  • ST_AsEWKT(geometry) —— 返回text

②Well-known binary(WKB)

  • ST_GeomFromWKB(bytea) —— 返回geometry
  • ST_AsBinary(geometry) —— 返回bytea
  • ST_AsEWKB(geometry) —— 返回bytea

③Geographic Mark-up Language(GML)

  • ST_GeomFromGML(text) —— 返回geometry
  • ST_ASGML(geometry) —— 返回text

④Keyhole Mark-up Language(KML)

  • ST_GeomFromKML(text) —— 返回geometry
  • ST_ASKML(geometry) —— 返回text

⑤GeoJson

  • ST_AsGeoJSON(geometry) —— 返回text

⑥Scalable Vector Graphics(SVG)

  • ST_AsSVG(geometry) —— 返回text

以上函數最常見的用法是將幾何圖形文本(text)表示形式轉換為內部表示形式:

請注意,除了具有幾何圖形表示形式的文本參數外,還可以指定一個提供幾何圖形SRID的數字參數。

以下SQL查詢展示了一個WKB表示形式的示例(將二進位輸出轉換為ASCII格式以進行列印時,需要調用encode()):

SELECT encode(
ST_AsBinary(ST_GeometryFromText(LINESTRING(0 0,1 0))),
hex);

在本教程中,將使用WKT,以確保你能夠理解我們正在查看的幾何圖形

但是,在大多數實際生產環境中(如查看GIS應用程序中的數據、將數據傳輸到web客戶端或遠程處理數據),WKB是首選的格式。

由於WKT和WKB是在SFSQL規範中定義的,因此它們不能處理3維或4維的幾何圖形。對於這些情況,PostGIS定義了Extended Well Known Text(EWKT)Extended Well Known Binary(EWKB)格式以用於處理3維或4維的幾何圖形

它們提供了與WKT和WKB相同的格式化功能,並且是在增加了維度的情況下。

以下是WKT中三維(3D)線串示例:

SELECT ST_AsText(ST_GeometryFromText(LINESTRING(0 0 0,1 0 0,1 1 2)));

注意:文本表示形式發生了變化!這是因為PostGIS的文本輸入程序在使用方面是自由的。它可以使用:

  • 十六進位編碼的EWKB
  • 擴展的WKT
  • ISO標準的WKT

在輸出端,ST_AsText()只返回ISO標準的WKT。

除了用於各種形式(WKT、WKB、GML、KML、JSON、SVG)的輸出函數外,PostGIS還有基於四種形式(WKT、WKB、GML、KML)的輸入函數

大多數應用程序使用WKT或WKB幾何圖形創建函數,但是也可以使用其他形式的幾何圖形創建函數。

下面是一個使用GML輸入和輸出JSON的示例:

SELECT ST_AsGeoJSON(ST_GeomFromGML(<gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point>));

五、從文本轉換

到目前為止,我們看到的WKT字元串都是text類型,我們使用PostGIS的函數ST_GeomFromText()將它們轉換為gometry類型。

PostgreSQL包含一個簡短形式的語法,允許數據從一種類型轉換到另一種類型,即類型轉換語法:

olddata::newtype

例如,將double類型轉換為文本字元串類型:

SELECT 0.9::text;

以下SQL語句將一個WKT字元串轉換成一個幾何圖形(geometry):

SELECT POINT(0 0)::geometry;

關於使用類型轉換語法創建幾何圖形,需要注意一點:除非指定SRID,否則將得到一個包含未知SRID的幾何圖形

可以使用EWKT形式指定SRID,該形式在前面包含一個SRID:

SELECT SRID=4326;POINT(0 0)::geometry;


推薦閱讀:
相關文章