postgis学习(二)之几何图形
一.介绍
//创建一个表
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)))');
//查询数据
SELECT name, ST_AsText(geom) FROM geometries;
插入的数据分别是:点,线,面,空洞的多边形,图形集合
二.元数据表
分成一张表和一个视图的表
为了符合Simple Features for SQL(SFSQL)规范,PostGIS提供了两张表用于追踪和报告数据库中的几何图形(这两张表中的内容相当于元数据)
- 第一张表spatial_ref_sys —— 定义了数据库已知的所有空间参照系统,稍后将对其进行更详细的说明。
- 第二张表(实际上是视图-view)geometry_columns —— 提供了数据库中所有空间数据表的描述信息。
查询视图:
SELECT * FROM geometry_columns;
-
f_table_catalog,f_table_schema,和f_table_name提供各个几何图形(geometry)的要素表(feature table)—— 即空间数据表 —— 的完全限定名称,分别是数据库名、模式名、空间数据表名。
-
f_geometry_column包含对应空间数据表中用于记录几何信息的属性列的列名**。**
-
coord_dimension定义几何图形的维度(2维、3维或4维)
-
srid定义引用自spatial_ref_sys表的空间参考标识符
-
type列定义了几何图形的类型。比如"点(Point)"和"线串(Linestring)"等类型。
通过查询该表,GIS客户端和数据库可以确定检索数据时的预期内容,并可以执行任何必要的投影、处理、渲染而无需检查每个几何图形(geometry)—— 这些就是元数据所带来的作用。
注意:如果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;
-
点
//查询点的经纬度 SELECT ST_AsText(geom) FROM geometries WHERE name = 'Point'; SELECT ST_X(geom), ST_Y(geom) FROM geometries WHERE name = 'Point';
-
线串
//查询线 SELECT ST_AsText(geom) FROM geometries WHERE name = 'Linestring';
- ST_Length(geometry) —— 返回线串的长度
- ST_StartPoint(geometry) —— 将线串的第一个坐标作为点返回
- ST_EndPoint(geometry) —— 将线串的最后一个坐标作为点返回
- ST_NPoints(geometry) —— 返回线串的坐标数量
SELECT ST_Length(geom) FROM geometries WHERE name = 'Linestring';
-
多边形
//查询多边形 SELECT ST_AsText(geom) FROM geometries WHERE name LIKE 'Polygon%';
- ST_Area(geometry) —— 返回多边形的面积
- ST_NRings(geometry) —— 返回多边形中环的数量(通常为1个,其他是孔)
- ST_ExteriorRing(geometry) —— 以线串的形式返回多边形最外面的环
- ST_InteriorRingN(geometry, n) —— 以线串形式返回指定的内部环
- ST_Perimeter(geometry) —— 返回所有环的长度
SELECT name, ST_Area(geom) FROM geometries WHERE name LIKE 'Polygon%';
-
集合
MultiPoint —— 点集合
MultiLineString —— 线串集合
MultiPolygon —— 多边形集合
GeometryCollection —— 由任意几何图形(包括其他GeometryCollection)组成的异构集合SELECT name, ST_AsText(geom) FROM geometries WHERE name = 'Collection';
- ST_NumGeometries(geometry) —— 返回集合中的组成部分的数量
- ST_GeometryN(geometry, n) —— 返回集合中指定的组成部分
- ST_Area(geometry) —— 返回集合中所有多边形组成部分的总面积
- ST_Length(geometry) —— 返回所有线段组成部分的总长度
四、几何图形输入和输出
在数据库中,几何图形(Geometry)以仅供PostGIS使用的格式存储在磁盘上。为了让外部程序插入和检索有用的几何图形信息,需要将它们转换为其他应用程序可以理解的格式。
幸运的是,PostGIS支持以多种格式进行几何图形的输入和输出。
①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
-
ST_AsGeoJSON(geometry) —— 返回text
⑥Scalable Vector Graphics(SVG)
-
ST_AsSVG(geometry) —— 返回text
以上函数最常见的用法是将几何图形的文本(text)表示形式转换为内部表示形式:
请注意,除了具有几何图形表示形式的文本参数外,还可以指定一个提供几何图形SRID的数字参数。
以下SQL查询展示了一个WKB表示形式的示例(将二进制输出转换为ASCII格式以进行打印时,需要调用encode()):
SELECT encode(
ST_AsBinary(ST_GeometryFromText('LINESTRING(0 0,1 0)')),
'hex');
使用GML输入和输出JSON的示例
SELECT ST_AsGeoJSON(ST_GeomFromGML('<gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point>'));
五、从文本转换
到目前为止,我们看到的WKT字符串都是’text’类型,我们使用PostGIS的函数ST_GeomFromText()将它们转换为’gometry’类型。
PostgreSQL包含一个简短形式的语法,允许数据从一种类型转换到另一种类型,即类型转换语法:
olddata::newtype
例如,将double类型转换为文本字符串类型:
SELECT 0.9::text;
以下SQL语句将一个WKT字符串转换成一个几何图形(geometry):
SELECT 'POINT(0 0)'::geometry;
关于使用类型转换语法创建几何图形,需要注意一点:除非指定SRID,否则将得到一个包含未知SRID的几何图形。
可以使用EWKT形式指定SRID,该形式在前面包含一个SRID:
SELECT 'SRID=4326;POINT(0 0)'::geometry;
函数合集
sum(expression) aggregate to return a sum for a set of records
count(expression) aggregate to return the size of a set of records
ST_GeometryType(geometry) returns the type of the geometry
ST_NDims(geometry) returns the number of dimensions of the geometry
ST_SRID(geometry) returns the spatial reference identifier number of the geometry
ST_X(point) returns the X ordinate
ST_Y(point) returns the Y ordinate
ST_Length(linestring) returns the length of the linestring
ST_StartPoint(geometry) returns the first coordinate as a point
ST_EndPoint(geometry) returns the last coordinate as a point
ST_NPoints(geometry) returns the number of coordinates in the linestring
ST_Area(geometry) returns the area of the polygons
ST_NRings(geometry) returns the number of rings (usually 1, more if there are holes)
ST_ExteriorRing(polygon) returns the outer ring as a linestring
ST_InteriorRingN(polygon, integer) returns a specified interior ring as a linestring
ST_Perimeter(geometry) returns the length of all the rings
ST_NumGeometries(multi/geomcollection) returns the number of parts in the collection
ST_GeometryN(geometry, integer) returns the specified part of the collection
ST_GeomFromText(text) returns geometry
ST_AsText(geometry) returns WKT text
ST_AsEWKT(geometry) returns EWKT text
ST_GeomFromWKB(bytea) returns geometry
ST_AsBinary(geometry) returns WKB bytea
ST_AsEWKB(geometry) returns EWKB bytea
ST_GeomFromGML(text) returns geometry
ST_AsGML(geometry) returns GML text
ST_GeomFromKML(text) returns geometry
ST_AsKML(geometry) returns KML text
ST_AsGeoJSON(geometry) returns JSON text
ST_AsSVG(geometry) returns SVG text