PostgreSQL及PostGIS使用


基礎知識

參考文檔:http://www.postgis.net/docs/

PostGIS支持的GIS對象是OpenGIS Consortium(OGC)定義的“簡單特征”的超集。OpenGIS規范定義了兩種表達空間對象的標准方法:the Well-Known Text (WKT) form and the Well-Known Binary (WKB) form。WKT和WKB都包括有關對象類型和形成對象的坐標的信息。
WKT實例:
POINT(0 0)
LINESTRING(0 0,1 1,1 2)
POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))
MULTIPOINT((0 0),(1 2))
MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))
MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))
GEOMETRYCOLLECTION(POINT(2 3),LINESTRING(2 3,3 4))
OpenGIS規范還要求空間對象的內部存儲格式包括空間參考系統標識符(SRID)。創建空間對象以插入數據庫時​​,需要SRID。下面的接口可以轉換:

bytea WKB = ST_AsBinary(geometry);
text WKT = ST_AsText(geometry);
geometry = ST_GeomFromWKB(bytea WKB, SRID);
geometry = ST_GeometryFromText(text WKT, SRID);

例如,向geotable表插入數據:

INSERT INTO geotable ( the_geom, the_name )
  VALUES ( ST_GeomFromText('POINT(-126.4 45.32)', 312), 'A Place');

SRID/geometry和geography

空間參考標識符 (SRID) :是與特定坐標系、容差和分辨率關聯的唯一標識符。
SRID 的填充方式及其所示含義取決於存儲數據所用的數據庫。目前有多種公認的標准 SRID,例如歐洲石油測繪組 (EPSG) 定義的 SRID。某些數據庫和空間類型(如 PostgreSQL 中的 PostGIS 幾何或 SQL Server 中的地理類型)使用預定義的 EPSG 代碼子集,只可使用具有這些 SRID 的空間參考。其他情況下(如 Oracle、PostgreSQL、IBM DB2 和 Informix 中的 ST_Geometry 類型)可使用具有 Esri 定義的 SRID 的空間參考。
用得最多的是EPSG:4326球坐標,EPSG:3785的墨卡托投影坐標。
geometry:平面坐標系,支持平面對象也支持空間對象。
geography:地理坐標系,僅支持空間對象。
兩種坐標系
1、一種球坐標(地理坐標);地理坐標系(Geographic Coordinate System),是使用三維球面來定義地球表面位置,以實現通過經緯度對地球表面點位引用的坐標系。一個地理坐標系包括角度測量單位、本初子午線和參考橢球體三部分。在球面系統中,水平線是等緯度線或緯線。垂直線是等經度線或經線。
2、另一種平面坐標(投影坐標):投影坐標系 (Projection coordinatesystem)平面坐標系統地圖單位通常為米 ,也稱非地球投影坐標系統(notearth),或者是平面坐標。
無論使用哪種空間坐標系,測量返回的單位(ST_Distance,ST_Length,ST_Perimeter,ST_Area)和ST_DWithin的輸入均以米為單位。
SQL語句,當未指定srid時,創建具有2D點地理的表默認為4326。
不指定srid:
CREATE TABLE ptgeogwgs(gid serial PRIMARY KEY, geog geography(POINT) );
指定srid:
CREATE TABLE ptgeognad2(gid serial PRIMARY KEY, geog geography(POINT,4269) );
geography(a,b)類型支持兩個可選修飾符:一個類型修飾符,用於限制列中允許的形狀和尺寸類型; SRID修飾符,用於將坐標引用標識符限制為特定數字。
類型修飾符的允許值為:POINT,LINESTRING,POLYGON,MULTIPOINT,MULTILINESTRING,MULTIPOLYGON。修飾符還通過后綴支持維度限制:Z,M和ZM。因此,例如,“LINESTRINGM”的修飾符只允許包含三維的線串,並將第三維視為度量。同樣,'POINTZM'會期望四維數據。

創建表 帶GEOGRAPHY column:

CREATE TABLE global_points (
    id SERIAL PRIMARY KEY,
    name VARCHAR(64),
    location GEOGRAPHY(POINT,4326)
  );

查看帶GEOGRAPHY column的表:

SELECT * FROM geography_columns;

插入語句:

INSERT INTO global_points (name, location) VALUES ('Town', 'SRID=4326;POINT(-110 30)');
INSERT INTO global_points (name, location) VALUES ('Forest', 'SRID=4326;POINT(-109 29)');
INSERT INTO global_points (name, location) VALUES ('London', 'SRID=4326;POINT(0 49)');

創建索引:

CREATE INDEX global_points_gix ON global_points USING GIST ( location );

 查詢:

-- Distance calculation using GEOGRAPHY (122.2km)
  SELECT ST_Distance('LINESTRING(-122.33 47.606, 0.0 51.5)'::geography, 'POINT(-21.96 64.15)'::geography);
-- Distance calculation using GEOMETRY (13.3 "degrees")
  SELECT ST_Distance('LINESTRING(-122.33 47.606, 0.0 51.5)'::geometry, 'POINT(-21.96 64.15)'::geometry);

PostgreSQL及PostGIS安裝和使用可以參考:https://blog.csdn.net/ljg124034929/article/details/70142119

PostgreSQL9.6+PostGIS2.3學習筆記(一)導入shp文件:https://blog.csdn.net/u013420816/article/details/53572085


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM