PostGreSQL(四)PostGIS-空间数据存储
空间数据存储
使⽤geography这种数据类型时,PostGIS的内部计算是基于实际地球球体来计算的;⽽使⽤geometry这种数据类型时,PostGIS的内部计算是基于平⾯来计算的。
⼏何类型(Geometry Type)
Geometry(⼏何对象类型)是PG的⼀个基本存储类型,PostGIS的空间数据都会以Geometry的形式存储在PostgreSQL⾥,本质是个⼆进制对象。
OGC的WKB和WKT格式
PostGIS基于OGC的“Simple Feature for Specification for SQL”规范,在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))
EWKT、EWKB和Canonical格式
PostGIS⾃⾝⼜在WKT和WKB基础上扩展实现了EWKT和EWKB来满⾜更复杂的场景需求,EWKT和EWKB相⽐OGC WKT和WKB格式主要的扩展有3DZ、3DM、4D坐标和内嵌空间参考⽀持
SQL-MM格式
SQL-MM格式定义了⼀些插值曲线,这些插值曲线和EWKT有点类似,也⽀持3DZ、3DM、4D坐标,但是不⽀持嵌⼊空间参考。
地理类型(Geography Type)
地理类型提供⽀持本地空间特性的“地理”坐标(有时称为“⼤地”坐标,或“纬度/经度”,或“经度/纬度”)。它的⼏何基础是球⾯。计算两点间的距离相当于计算圆弧的距离,不能使⽤平⾯⼏何原理,需要通过其他参考⽅法计算。由于底层算法复杂,定义的地理类型⽐空间类型少很多,随之算法的增加,将出现新的地理类型。
PostGresSQL8.3推出⼀张表辅助空间参考表:spatial_ref_sys表,它存放的是OGC规范的空间参考。辅助转化。 地理类型只⽀持简单的简单的元素。标准⼏何类型数据将⾃动转换到地理WGS84坐标。还可以使⽤EWKT和EWKB约定来插⼊数据。
patial_ref_sys表,它存放的是OGC规范的空间参考。我们取我们最熟悉的4326参考看⼀下:
它的srid存放的就是空间参考的Well-Known ID,对这个空间参考的定义主要包括两个字段,srtext存放的是以字符串描述的空间参
考,proj4text存放的则是以字符串描述的PROJ.4 投影定义(PostGIS使⽤PROJ.4实现投影)
SRID 4326声明了地理空间参考系统
如下创建表:
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对⼏何信息的检查
PostGIS可以检查⼏何信息的正确性,这主要是通过IsValid函数实现的。以下语句分辨检查了2个⼏何对象的正确性,显然,(0, 0)点和(1,1)
点可以构成⼀条线,但是(0, 0)点和(0, 0)点则不能构成,这个语句执⾏以后的得出的结果是TRUE,FALSE。
select IsValid('LINESTRING(0 0, 1 1)'), IsValid('LINESTRING(0 0,0 0)')
默认PostGIS并不会使⽤IsValid函数检查⽤户插⼊的新数据,因为这会消耗较多的CPU资源(特别是复杂的⼏何对象)。当你需要使⽤这个功能的时候,你可以使⽤以下语句为表新建⼀个检查约束:
ALTER TABLE cities
ADD CONSTRAINT geometry_valid CHECK (IsValid(shape))
这时当我们往这个表试图插⼊⼀个错误的空间对象的时候,会得到⼀个错误:
gis字符串是什么INSERT INTO test.cities ( shape, name )
VALUES ( GeomFromText('LINESTRING(0 0,0 0)', 4326), '北京');
ERROR: new row for relation "cities" violates check constraint "geometry_valid"
SQL 状态: 23514

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。