postgis学习(二)之几何图形

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 SQLSFSQL)规范,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;

在这里插入图片描述

  1. //查询点的经纬度
    SELECT ST_AsText(geom)
    FROM geometries
    WHERE name = 'Point';
    
    SELECT ST_X(geom), ST_Y(geom)
    FROM geometries
    WHERE name = 'Point';
    
  2. 线串

    //查询线
    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';
    
  3. 多边形

    //查询多边形
    
    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%';
    
  4. 集合
    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

      GeoJson

    • 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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值