PostGIS 快速入門
PostGIS 快速入門
PostGIS 是 PostgreSQL 關系數據庫的空間操作擴展。它為 PostgreSQL 提供了存儲、查詢和修改空間關系的能力。本文中 ‘PostgreSQL’ 指代基本的關系數據庫功能,而 ‘PostGIS’ 指代擴展的空間操作特性。
客戶端-服務器構架
PostgreSQL 同眾多數據庫產品一樣,采用客戶端-服務器構架。客戶端向服務器發出請求并得到響應。這種機制同瀏覽器從網絡服務器獲取網頁類似。在 PostgreSQL 中,請求以 SQL 語言發出,而響應多為從數據庫提取的表單。
客戶端與服務器可以部署在同一臺設備上,即 PostgreSQL 可以在單一的計算機上使用。借由系統內部的 ‘loopback’ 通信機制,數據庫系統可以進行私密通訊。除非專門配置,外界是不能訪問這些信息的。
本位介紹三種客戶端:命令行, Quantum GIS ,pgAdmin圖形化數據庫客戶端。
</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) 顯示一個維度的坐標:
</div>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)空間查詢:
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’ 并查看結果。
這里采取不同的橢球參數(橢球體名、半主軸長、扁率)計算:
</div>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)制圖
以 PostGIS 數據制圖需要相應的客戶端支持。包括 Quantum GIS、gvSIG、uDig 在內的多種客戶端均可以。以下使用 Quantum GIS:
從 Desktop GIS 菜單啟動 Quantum GIS 并在其 layer 菜單選擇Add PostGIS layers。連接到 Natural Earth PostGIS 數據庫的參數在 Connections 下拉菜單中有。這里可以定義和儲存其它的配置。點擊Edit可以查看具體參數。點擊Connect連接:
![]()
系統將顯示所有空間信息表供選擇:
![]()
選擇 lakes 湖泊表單并點擊底部的Add添加。頂部的Load可以載入新的數據庫連接配置。數據將被導入:
![]()
界面上顯示出湖泊的分布。QGIS 并不理解湖泊一詞的含義,也許不會自動使用藍色。請查看其手冊了解如何設置。這里縮放到加拿大一處著名的湖泊群。
</div>自動創建空間數據表單
OSGeo Live 的多數桌面 GIS 系統都可以將 shp 等文件導入數據庫。這里依然使用 QGIS 演示。
QGIS 中導入 shp 可以使用 PostGIS Manager 插件。在 Plugins 菜單選擇Fetch Plugins導入最新的官方插件列表(需要網絡連接)。找到PostGIS Manager點擊Install plugin安裝。
![]()
完成后,在 Plugin 菜單點擊 PostGIS Manager 啟動。也可以點擊工具欄上大象與地球的圖標。
該插件將連接 Natural Earth 數據庫。若提示輸入密碼,留空即可。在開啟的界面中,選擇表單可以顯示相應的信息。預覽(Preview)選項卡可以顯示地圖預覽。這里選擇了 populated places 圖層并縮放到一個小島:
![]()
接下來使用 PostGIS Manager 將 shp 導入數據庫。這里使用 R 統計擴展包含的 North Carolina sudden infant death syndrome (SIDS) 數據:
在Data菜單選擇Load data from shapefile選項。點擊...選中 Rmaptools中的sids.shp。
![]()
直接點擊Load即可:
![]()
數據將被導入 PostGIS 。關閉 PostGIS Manager 回到主界面。
使用 ‘Add PostGIS Layer’ 導入 SIDS 數據。略加調整,得到被卡洛萊娜州新生兒猝死率分布圖:
</div>
pgAdmin III
通過 Databases 菜單下的pgAdmin III可以進行非空間操作。該客戶端是 PostgreSQL 的官方產品,使用 SQL 語句操作。
![]()
</div>
進一步嘗試
可以嘗試其它一些操作:
- 嘗試st_buffer(the_geom)、st_transform(the_geom,25831)、x(the_geom)等空間操作,相關文檔位于 http://postgis.org/documentation/ 。
- 在命令行使用pgsql2shp將表單導出到 shp 。
- 在命令行使用ogr2ogr導入導出數據。
</ol> </div>其它信息
以下網站包含了有關 PostGIS 的大量信息:
PostGIS 主頁
</blockquote>PostGIS 文檔
</blockquote> </div> </div> 來自:http://live.osgeo.org/zh/quickstart/postgis_quickstart.html本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!sesese色