使用geography这种数据类型时,PostGIS的内部计算是基于实际地球球体来计算的;
而使用geometry这种数据类型时,PostGIS的内部计算是基于平面来计算的。
1.1 几何类型(Geometry Type)
Geometry(几何对象类型)是PG的一个基本存储类型,PostGIS的空间数据都会以Geometry的形式存储在PostgreSQL里,本质是个二进制对象。
1.1.1 OGC的WKB和WKT格式
PostGIS在Geometry对象上实现了一系列的GIS Object(地物对象),使用了OGC推荐的WKT(Well-Known Text)和WKB(Well-Known Binary)格式进行描述,大幅增加了易用性,例如WKT的7个基本类型:
点:POINT(0 0)
线:LINESTRING(0 0,1 1,1 2)
面(多边形):POLYGON((0 0,4 0,4 4,0 4,0 0)) 简单多边形
POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1)) 多边形有一个内部的"孔洞(hole)"
多点: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))
2.1.2 EWKT、EWKB和Canonical格式
PostGIS自身又在WKT和WKB基础上扩展实现了EWKT和EWKB来满足更复杂的场景需求,EWKT和EWKB相比OGC WKT和WKB格式主要的扩展有3DZ、3DM、4D坐标和内嵌空间参考支持。
2.2 地理类型(Geography Type)
地理类型提供支持本地空间特性的“地理”坐标(有时称为“大地”坐标,或“纬度/经度”,或“经度/纬度”)。它的几何基础是球面。
计算两点间的距离相当于计算圆弧的距离,不能使用平面几何原理,需要通过其他参考方法计算。
PostGresSQL8.3推出一张表辅助空间参考表:spatial_ref_sys表,它存放的是OGC规范的空间参考。辅助转化。我们取我们最熟悉的4326参考看一下:
它的srid存放的就是空间参考的Well-Known ID,对这个空间参考的定义主要包括两个字段,srtext存放的是以字符串描述的空间参考,proj4text存放的则是以字符串描述的PROJ.4 投影定义(PostGIS使用PROJ.4实现投影)
如下创建表:
CREATE TABLE global_points (
id SERIAL PRIMARY KEY,
name VARCHAR(64),
location GEOGRAPHY(POINT,4326)
);
# 插入数据
INSERT INTO global_points (name, location) VALUES
('London', ST_GeographyFromText('SRID=4326; POINT(-72.1235 42.3521)'));
二:PostGIS函数
创建了一个表,然后向该表中插入5个几何图形数据(geometry):
一个点(POINT)
一条线(LINESTRING)
一个多边形(POLYGON)
一个内含空洞的多边形(POLYGON with a hole)
一个图形集合(GEOMETRYCOLLECTION)
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)))');
二、元数据表
为了符合Simple Features for SQL(SFSQL)规范,PostGIS提供了两张表用于追踪和报告数据库中的几何图形:
第一张表spatial_ref_sys —— 定义了数据库已知的所有空间参照系统,稍后将对其进行更详细的说明。
第二张表(实际上是视图-view)geometry_columns —— 提供了数据库中所有空间数据表的描述信息。
注意:如果nyc数据库的表没有指定26918的srid,那该怎么办呢?通过更新表很容易修复:
SELECT UpdateGeometrySRID('nyc_neighborhoods','geom',26918);
三、表示真实世界的对象
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)
ST_X(geometry) —— 返回X坐标
ST_Y(geometry) —— 返回Y坐标
ST_Z(geometry) —— 返回Z坐标
ST_M(geometry) —— 返回M信息
SELECT ST_AsText(geom),ST_X(geom),st_y(geom),st_z(geom),st_m(geom)
FROM geometries
WHERE name = 'Point';
3.2、线串(Linestring)
线串既可以是闭合的,也可以是简单的。
如果线串的起始点和结束点是同一个点,则称其是闭合的(closed),可以使用ST_IsClosed函数进行测试。
如果线串不与自身交叉或接触(如果线串是闭合的,则排除结束点),则称其是简单的(simple),可以使用ST_IsSimple函数进行测试。
用于处理线串的一些特定空间函数包括:
ST_Length(geometry) —— 返回线串的长度
ST_StartPoint(geometry) —— 将线串的第一个坐标作为点返回
ST_EndPoint(geometry) —— 将线串的最后一个坐标作为点返回
ST_NPoints(geometry) —— 返回线串的坐标数量
SELECT ST_AsText(geom),st_length(geom),st_startpoint(geom),st_astext(st_endpoint(geom)),st_npoints(geom)
FROM geometries
WHERE name = 'Linestring';
关于多边形图形的一些特定空间函数包括:
ST_Area(geometry) —— 返回多边形的面积
ST_NRings(geometry) —— 返回多边形中环的数量(通常为1个,其他是孔)
ST_ExteriorRing(geometry) —— 以线串的形式返回多边形最外面的环
ST_InteriorRingN(geometry, n) —— 以线串形式返回指定的内部环
ST_Perimeter(geometry) —— 返回所有环的长度
SELECT name, ST_Area(geom),st_nrings(geom),st_exteriorring(geom),st_interiorringn(geom,1),st_perimeter(geom)
FROM geometries
WHERE name LIKE 'Polygon%';
结果:
3.4、图形集合(Collection)
有四种图形集合(Collection)类型,它们将多个简单几何图形组合为图形集合:
MultiPoint —— 点集合
MultiLineString —— 线串集合
MultiPolygon —— 多边形集合
GeometryCollection —— 由任意几何图形(包括其他GeometryCollection)组成的异构集合
SELECT name, ST_AsText(geom),st_numgeometries(geom),st_astext(st_geometryn(geom,2)),st_length(geom)
FROM geometries
WHERE name = 'Collection';
①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
SELECT name, st_astext(geom), st_asewkt(geom)
FROM geometries
WHERE name LIKE 'Polygon%';
SELECT name, st_asbinary(geom), st_asewkb(geom)
FROM geometries
WHERE name LIKE 'Polygon%';
SELECT name, st_asgeojson(geom)
FROM geometries
WHERE name LIKE 'Polygon%';