PostGIS 快速入門

jopen 9年前發布 | 53K 次閱讀 PostGIS 地理信息系統GIS

PostGIS 快速入門

PostGIS 是 PostgreSQL 關系數據庫的空間操作擴展。它為 PostgreSQL 提供了存儲、查詢和修改空間關系的能力。本文中 ‘PostgreSQL’ 指代基本的關系數據庫功能,而 ‘PostGIS’ 指代擴展的空間操作特性。

客戶端-服務器構架

PostgreSQL 同眾多數據庫產品一樣,采用客戶端-服務器構架。客戶端向服務器發出請求并得到響應。這種機制同瀏覽器從網絡服務器獲取網頁類似。在 PostgreSQL 中,請求以 SQL 語言發出,而響應多為從數據庫提取的表單。

客戶端與服務器可以部署在同一臺設備上,即 PostgreSQL 可以在單一的計算機上使用。借由系統內部的 ‘loopback’ 通信機制,數據庫系統可以進行私密通訊。除非專門配置,外界是不能訪問這些信息的。

本位介紹三種客戶端:命令行, Quantum GISpgAdmin圖形化數據庫客戶端。

</div>

創造具有空間信息處理能力的數據庫

命令行客戶端在終端模擬器(Terminal Emulator)中運行。在 Applications 菜單的 Accessories 中打開一個終端模擬器,將顯示一個 Unix 風格的命令行界面。輸入:

psql -V
</blockquote>

回車確認,將顯示 PostgreSQL 版本號。

一個 PostgreSQL 服務器中,可以將不同的任務組織到不同的數據庫。每個數據庫獨立運作,擁有專門的表單、顯示、用戶等。訪問 PostgreSQL 數據庫時將指定一個數據庫。

服務器上數據庫列表通過以下命令查詢:

psql -l
</blockquote>

輸出將羅列 Live 上配置的幾個數據庫。這里演示新建一個。

PostgreSQL 使用createdb工具創建數據庫。這里建立的數據庫應帶有 PostGIS 的擴展功能,因此需要指定相應的模板。這里將新建數據庫稱為demo。命令為:

createdb -T template_postgis demo

現在執行psql -l應當可以看到demo數據庫。

也可以使用 SQL 語言創建 PostGIS 數據庫。首先使用dropdb命令刪除之前創建的數據庫,然后使用psql命令開啟 SQL 命令解析器:

dropdb demo
psql -d postgres

這樣就連接到了一個通用的系統數據庫postgres。輸入 SQL 命令建立新數據庫:

postgres=# CREATE DATABASE demo TEMPLATE=template_postgis;

現在可以轉換連接到新建的數據庫。若重新連接時可以使用psql -d demo命令。但在psql系統內部也可以使用以下命令:

postgres=# \c demo

一個信息頁面將顯示當前已連接demo數據庫。輸入\dt列出當前數據庫內的表單,輸出如下:

demo=# \dt
             List of relations
 Schema |       Name       | Type  | Owner
--------+------------------+-------+-------
 public | geometry_columns | table | user
 public | spatial_ref_sys  | table | user
(2 rows)

這兩個表格是 PostGIS 默認的。其中spatial_ref_sys存儲著合法的空間坐標系統。利用 SQL 查詢查看:

demo=# SELECT srid,auth_name,proj4text FROM spatial_ref_sys LIMIT 10;

srid | auth_name | proj4text ------+-----------+-------------------------------------- 3819 | EPSG | +proj=longlat +ellps=bessel +towgs... 3821 | EPSG | +proj=longlat +ellps=aust_SA +no_d... 3824 | EPSG | +proj=longlat +ellps=GRS80 +towgs8... 3889 | EPSG | +proj=longlat +ellps=GRS80 +towgs8... 3906 | EPSG | +proj=longlat +ellps=bessel +no_de... 4001 | EPSG | +proj=longlat +ellps=airy +no_defs... 4002 | EPSG | +proj=longlat +a=6377340.189 +b=63... 4003 | EPSG | +proj=longlat +ellps=aust_SA +no_d... 4004 | EPSG | +proj=longlat +ellps=bessel +no_de... 4005 | EPSG | +proj=longlat +a=6377492.018 +b=63... (10 rows)</pre></div>

以上顯示確認了該數據庫已經建立空間操作功能。數據庫中的geometry_columns用于記錄那些表格是有空間信息的。

</div>

手工建立空間數據表格

空間數據庫已經建立,現在可以建立具有空間信息的表格。

首先建立一個常規的表格存儲有關城市(cities)的信息。這個表格有兩欄,一個是 ID 編號,一個是城市名:

demo=# CREATE TABLE cities ( id int4, name varchar(50) );

現在添加一個空間欄用于存儲城市的位置。習慣上這個欄目叫做the_geom。它記錄了數據為什么類型(點、線、面)、有幾維(這里是二維)以及空間坐標系統。此處使用 EPSG:4326 坐標系統:

demo=# SELECT AddGeometryColumn ('cities', 'the_geom', 4326, 'POINT', 2);

完成后,查詢 cities 表單應當顯示這個新欄目。同時頁面將顯示當前表達沒有記錄(0 rows)。

demo=# SELECT * from cities;
 id | name | the_geom
----+------+----------
(0 rows)

為添加記錄,需要使用 SQL 命令。對于空間欄,使用 PostGIS 的ST_GeomFromText可以將文本轉化為坐標與參考系號的記錄:

demo=# INSERT INTO cities (id, the_geom, name) VALUES (1,ST_GeomFromText('POINT(-0.1257 51.508)',4326),'London, England');
demo=# INSERT INTO cities (id, the_geom, name) VALUES (2,ST_GeomFromText('POINT(-81.233 42.983)',4326),'London, Ontario');
demo=# INSERT INTO cities (id, the_geom, name) VALUES (3,ST_GeomFromText('POINT(27.91162491 -33.01529)',4326),'East London,SA');

當然,這樣的輸入方式難以操作。其它方式可以更快的輸入數據。就目前來說,表格內已經有了一些城市數據,可以先進行查詢等操作。

</div>

簡單查詢

標準的 SQL 操作都可以用于 PostGIS 表單:

demo=# SELECT * FROM cities;
 id |      name       |                      the_geom
----+-----------------+----------------------------------------------------
  1 | London, England | 0101000020E6100000BBB88D06F016C0BF1B2FDD2406C14940
  2 | London, Ontario | 0101000020E6100000F4FDD478E94E54C0E7FBA9F1D27D4540
  3 | East London,SA  | 0101000020E610000040AB064060E93B4059FAD005F58140C0
(3 rows)

這里的坐標是無法閱讀的 16 進制格式。要以 WKT 文本顯示,使用 ST_AsText(the_geom) 或 ST_AsEwkt(the_geom) 函數。也可以使用 ST_X(the_geom) 和 ST_Y(the_geom) 顯示一個維度的坐標:

demo=# SELECT id, ST_AsText(the_geom), ST_AsEwkt(the_geom), ST_X(the_geom), ST_Y(the_geom) FROM cities;
 id |          st_astext           |               st_asewkt                |    st_x     |   st_y
----+------------------------------+----------------------------------------+-------------+-----------
  1 | POINT(-0.1257 51.508)        | SRID=4326;POINT(-0.1257 51.508)        |     -0.1257 |    51.508
  2 | POINT(-81.233 42.983)        | SRID=4326;POINT(-81.233 42.983)        |     -81.233 |    42.983
  3 | POINT(27.91162491 -33.01529) | SRID=4326;POINT(27.91162491 -33.01529) | 27.91162491 | -33.01529
(3 rows)
</div>

空間查詢:

PostGIS 為 PostgreSQL 擴展了許多空間操作功能。以上已經涉及了轉換空間坐標格式的 ST_GeomFromText 。多數空間操作以 ST(spatial type)開頭,在 PostGIS 文檔相應章節有羅列。這里回答一個具體的問題:以米為單位并假設地球是完美橢球,上面三個城市相互的距離是多少?

demo=# SELECT p1.name,p2.name,ST_Distance_Sphere(p1.the_geom,p2.the_geom) FROM cities AS p1, cities AS p2 WHERE p1.id > p2.id;
      name       |      name       | st_distance_sphere
-----------------+-----------------+--------------------
 London, Ontario | London, England |   5875766.85191657
 East London,SA  | London, England |   9789646.96784908
 East London,SA  | London, Ontario |   13892160.9525778
 (3 rows)

輸出顯示了距離數據。注意 ‘WHERE’ 部分防止了輸出城市到自身的距離(0)或者兩個城市不同排列的距離數據(London, England 到 London, Ontario 和 London, Ontario 到 London, England 的距離是一樣的)。嘗試取消 ‘WHERE’ 并查看結果。

這里采取不同的橢球參數(橢球體名、半主軸長、扁率)計算:

demo=# SELECT p1.name,p2.name,ST_Distance_Spheroid(
        p1.the_geom,p2.the_geom, 'SPHEROID["GRS_1980",6378137,298.257222]'
        )
       FROM cities AS p1, cities AS p2 WHERE p1.id > p2.id;
      name       |      name       | st_distance_spheroid
-----------------+-----------------+----------------------
 London, Ontario | London, England |     5892413.63776489
 East London,SA  | London, England |     9756842.65711931
 East London,SA  | London, Ontario |     13884149.4140698
(3 rows)
</div>

制圖

以 PostGIS 數據制圖需要相應的客戶端支持。包括 Quantum GIS、gvSIG、uDig 在內的多種客戶端均可以。以下使用 Quantum GIS:

從 Desktop GIS 菜單啟動 Quantum GIS 并在其 layer 菜單選擇Add PostGIS layers。連接到 Natural Earth PostGIS 數據庫的參數在 Connections 下拉菜單中有。這里可以定義和儲存其它的配置。點擊Edit可以查看具體參數。點擊Connect連接:

Connect to Natural Earth

系統將顯示所有空間信息表供選擇:

Natural Earth Layers

選擇 lakes 湖泊表單并點擊底部的Add添加。頂部的Load可以載入新的數據庫連接配置。數據將被導入:

My First PostGIS layer

界面上顯示出湖泊的分布。QGIS 并不理解湖泊一詞的含義,也許不會自動使用藍色。請查看其手冊了解如何設置。這里縮放到加拿大一處著名的湖泊群。

</div>

自動創建空間數據表單

OSGeo Live 的多數桌面 GIS 系統都可以將 shp 等文件導入數據庫。這里依然使用 QGIS 演示。

QGIS 中導入 shp 可以使用 PostGIS Manager 插件。在 Plugins 菜單選擇Fetch Plugins導入最新的官方插件列表(需要網絡連接)。找到PostGIS Manager點擊Install plugin安裝。

Fetch PostGIS Manager Plugin

完成后,在 Plugin 菜單點擊 PostGIS Manager 啟動。也可以點擊工具欄上大象與地球的圖標。

該插件將連接 Natural Earth 數據庫。若提示輸入密碼,留空即可。在開啟的界面中,選擇表單可以顯示相應的信息。預覽(Preview)選項卡可以顯示地圖預覽。這里選擇了 populated places 圖層并縮放到一個小島:

PostGIS Manager Preview

接下來使用 PostGIS Manager 將 shp 導入數據庫。這里使用 R 統計擴展包含的 North Carolina sudden infant death syndrome (SIDS) 數據:

Data菜單選擇Load data from shapefile選項。點擊...選中 Rmaptools中的sids.shp

Find the shapefile

直接點擊Load即可:

Import a shapefile

數據將被導入 PostGIS 。關閉 PostGIS Manager 回到主界面。

使用 ‘Add PostGIS Layer’ 導入 SIDS 數據。略加調整,得到被卡洛萊娜州新生兒猝死率分布圖:

SIDS data mapped </div>

pgAdmin III

通過 Databases 菜單下的pgAdmin III可以進行非空間操作。該客戶端是 PostgreSQL 的官方產品,使用 SQL 語句操作。

pgAdmin III pgAdmin III </div>

進一步嘗試

可以嘗試其它一些操作:

  1. 嘗試st_buffer(the_geom)st_transform(the_geom,25831)x(the_geom)等空間操作,相關文檔位于 http://postgis.org/documentation/
  2. 在命令行使用pgsql2shp將表單導出到 shp 。
  3. 在命令行使用ogr2ogr導入導出數據。
  4. </ol> </div>

    其它信息

    以下網站包含了有關 PostGIS 的大量信息:

    PostGIS 主頁

    </blockquote>

    PostGIS 文檔

    </blockquote> </div> </div> 來自:http://live.osgeo.org/zh/quickstart/postgis_quickstart.html

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!