• PostGIS函数


    一: 空间数据存储

    使用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))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    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)'));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    二: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)))');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    二、元数据表
    为了符合Simple Features for SQL(SFSQL)规范,PostGIS提供了两张表用于追踪和报告数据库中的几何图形:

    第一张表spatial_ref_sys —— 定义了数据库已知的所有空间参照系统,稍后将对其进行更详细的说明。
    第二张表(实际上是视图-view)geometry_columns —— 提供了数据库中所有空间数据表的描述信息。
    注意:如果nyc数据库的表没有指定26918的srid,那该怎么办呢?通过更新表很容易修复:

    SELECT UpdateGeometrySRID('nyc_neighborhoods','geom',26918);
    
    • 1

    三、表示真实世界的对象
    ST_GeometryType(geometry) —— 返回几何图形的类型
    ST_NDims(geometry) —— 返回几何图形的维数
    ST_SRID(geometry) —— 返回几何图形的空间参考标识码

    SELECT name, ST_GeometryType(geom), ST_NDims(geom), ST_SRID(geom)
    FROM geometries;
    
    • 1
    • 2

    结果:
    在这里插入图片描述
    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';
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    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';
    
    • 1
    • 2
    • 3

    结果:
    在这里插入图片描述

    3.3、多边形(Polygon)
    在这里插入图片描述

    关于多边形图形的一些特定空间函数包括:

    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%';
    
    • 1
    • 2
    • 3

    结果:
    在这里插入图片描述
    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';
    
    • 1
    • 2
    • 3

    结果:
    在这里插入图片描述

    四、几何图形输入和输出

    ①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%';
    
    • 1
    • 2
    • 3

    结果:
    在这里插入图片描述

    SELECT name, st_asbinary(geom), st_asewkb(geom)
    FROM geometries
    WHERE name LIKE 'Polygon%';
    
    • 1
    • 2
    • 3

    结果:
    在这里插入图片描述

    SELECT name, st_asgeojson(geom)
    FROM geometries
    WHERE name LIKE 'Polygon%';
    
    • 1
    • 2
    • 3

    结果:
    在这里插入图片描述

  • 相关阅读:
    依赖的作用域范围
    【云原生】Kubernetes网络管理实操
    数据库内核面试中我不会的问题(4)
    串口触摸屏的键盘控制
    数据库-范式
    利用综合微生物指数评估富营养化危险沿海湿地生态状况
    Python批量将Photoshop文件保存为图片
    C++之std::function的介绍
    CFTC可能比SEC更可怕,将监管炮口直接对准DeFi?
    C++二义性、多态、纯虚函数、模板函数
  • 原文地址:https://blog.csdn.net/qq_34748010/article/details/126920098