• 金仓数据库 KingbaseGIS 使用手册(6.6. 几何对象校验函数、6.7. 空间参考系函数)


    6.6. 几何对象校验函数

    6.6.1. ST_IsValid

    ST_IsValid —如果ST_Geometry返回的值是满足WKT或EWKT或WKB或EWKB描述的,那么这个函数返回值是TRUE。

    用法

    boolean ST_IsValid(geometry g);
    boolean ST_IsValid(geometry g, integer flags);
    

    描述

    测试ST_Geometry 的值是否是符合规范的格式。如果geometry是无效的, KingbaseES 会提示该对象. 更多关于OGC规范定义的简单性和有效性,参考 "Ensuring OpenGIS compliancy of geometries"

    注意

    SQL-MM 规范定义了ST_IsValid (NULL) 值为 0, 而KGIS返回值为 NULL.

    • 该方法实现了规范 OpenGIS Simple Features Implementation Specification for SQL 1.1.

    • 该方法实现了规范 SQL/MM specification. SQL-MM 3: 5.1.9

    样例

    SELECT ST_IsValid(ST_GeomFromText('LINESTRING(0 0, 1 1)')) As good_line,
    ST_IsValid(ST_GeomFromText('POLYGON((0 0, 1 1, 1 2, 1 1, 0 0))')) As bad_poly;
    --results
    NOTICE: Self-intersection at or near point 0 0
    
    good_line  | bad_poly
    -----------+----------
    t          | f
    

    参考

    ST_IsSimple , ST_IsValidReason , ST_IsValidDetail , ST_Summary

    6.6.2. ST_IsValidDetail

    ST_IsValidDetail — 返回几何类型是否有效以及无效原因和无效的几何对象是哪些

    用法

    valid_detail ST_IsValidDetail(geometry geom);
    valid_detail ST_IsValidDetail(geometry geom, integer flags);
    

    描述

    返回几何类型是否有效以及无效原因和无效的几何对象是哪些函数。通常用来替代ST_IsValid与 ST_IsValidReason,用来生成无效geometry对象的明细报告。

    参数flags是一个bit参数,它有如下的值:

    1: 把自我相交的环形成的控当做是有效的,这也被称作 "the ESRI flag".注意着和OGC 的几何规范是相悖的。

    样例

    --First 3 Rejects from a successful quintuplet experiment
    SELECT gid, reason(ST_IsValidDetail(the_geom)), ST_AsText(location(ST_IsValidDetail( the_geom))) as location
    FROM
    (SELECT ST_MakePolygon(ST_ExteriorRing(e.buff), array_agg(f.line)) As the_geom, gid
    FROM (SELECT ST_Buffer(ST_MakePoint(x1*10,y1), z1) As buff, x1*10 + y1*100 + z1*1000 As gid
    FROM generate_series(-4,6) x1
    CROSS JOIN generate_series(2,5) y1
    CROSS JOIN generate_series(1,8) z1
    WHERE x1 > y1*0.5 AND z1 < x1*y1) As e
    INNER JOIN (SELECT
    ST_Translate(ST_ExteriorRing(ST_Buffer(ST_MakePoint(x1*10,y1), z1)),y1*1, z1*2) As line
    FROM generate_series(-3,6) x1
    CROSS JOIN generate_series(2,5) y1 CROSS
    JOIN generate_series(1,10) z1
    WHERE x1 > y1*0.75 AND z1 < x1*y1) As f
    ON (ST_Area(e.buff) > 78 AND ST_Contains(e.buff, f.line))
    GROUP BY gid, e.buff) As quintuplet_experiment
    WHERE ST_IsValid(the_geom) = false
    ORDER BY gid
    LIMIT 3;
    
    gid   | reason            | location
    ------+-------------------+-------------
    5330  | Self-intersection | POINT(32 5)
    5340  | Self-intersection | POINT(42 4.999999999999999)
    5350  | Self-intersection | POINT(52 4.999999999999999)
    
    --simple example
    SELECT * FROM ST_IsValidDetail('LINESTRING(220227 150406,2220227 150407,222020 150410)');
    
    valid  | reason | location
    -------+--------+----------
    t      |        |
    

    参考

    ST_IsValid, ST_IsValidReason

    6.6.3. ST_IsValidReason

    ST_IsValidReason —返回一个geometry是否是有效的,以及无效的原因

    用法

    text ST_IsValidReason(geometry geomA);
    text ST_IsValidReason(geometry geomA, integer flags);
    

    描述

    返回一个geometry是否是有效的,以及无效的原因.与函数ST_IsValid一起使用非常有用,可以用来查找生成无效的几何对象和无效原因的明细报告flags可以使用的值,请查看函数 ST_IsValidDetail 说明

    样例

    --First 3 Rejects from a successful quintuplet experiment
    SELECT gid,
    ST_IsValidReason(the_geom) as validity_info
    FROM
    (SELECT ST_MakePolygon(ST_ExteriorRing(e.buff), array_agg(f.line)) As the_geom, gid
    FROM (SELECT ST_Buffer(ST_MakePoint(x1*10,y1), z1) As buff, x1*10 + y1*100 + z1*1000 As gid
    FROM generate_series(-4,6) x1
    CROSS JOIN generate_series(2,5) y1
    CROSS JOIN generate_series(1,8) z1
    WHERE x1 > y1*0.5 AND z1 < x1*y1) As e
    INNER JOIN (SELECT
    ST_Translate(ST_ExteriorRing(ST_Buffer(ST_MakePoint(x1*10,y1), z1)),y1*1, z1*2) As line
    FROM generate_series(-3,6) x1
    CROSS JOIN generate_series(2,5) y1 CROSS
    JOIN generate_series(1,10) z1
    WHERE x1 > y1*0.75 AND z1 < x1*y1) As f
    ON (ST_Area(e.buff) > 78 AND ST_Contains(e.buff, f.line))
    GROUP BY gid, e.buff) As quintuplet_experiment
    WHERE ST_IsValid(the_geom) = false
    ORDER BY gid LIMIT 3;
    
    gid   | validity_info
    ------+--------------------------
    5330  | Self-intersection [32 5]
    5340  | Self-intersection [42 5]
    5350  | Self-intersection [52 5]
    
    --simple example
    SELECT ST_IsValidReason('LINESTRING(220227 150406,2220227 150407,222020 150410)');
    
    st_isvalidreason
    ------------------
    Valid Geometry
    

    参考

    ST_IsValid, ST_Summary

    6.6.4. ST_MakeValid

    ST_MakeValid —不丢弃顶点的情况下,尝试把无效的几何对象转换成有效的几何对象

    用法

    geometry ST_MakeValid(geometry input);
    

    描述

    不丢弃顶点的情况下,尝试把无效的几何对象转换成有效的几何对象。 已经是有效的几何对象,则不处理,直接返回。

    支持的输入类型有: POINTS, MULTIPOINTS, LINESTRINGS, MULTILINESTRINGS, POLYGONS, MULTIPOLYGONS和 GEOMETRYCOLLECTIONS(包含前面的任何类型以及它们的混合)。

    如果有部分或者全部维度折叠,输出的几何对象是一个更低维度几何对象的集合或者一个更低维度的几何对象有自相交的简单多边形可能会返回成MULTI-几何对象。

    • 这个函数支持3D对象,并且不会删除z坐标。

    参考

    ST_IsValid ST_CollectionExtract

    6.7. 空间参考系函数

    6.7.1. ST_SetSRID

    ST_SetSRID —把一个几何对象的 SRID 设置为一个给定的整型值。

    用法

    geometry ST_SetSRID(geometry geom, integer srid);
    

    描述

    把一个几何对象的 SRID 设置为一个给定的整型值。为便于查询构造 bounding box 时,需要用到它。

    注意

    该函数不做任何方式的坐标转换,它只是设置该对象的空间参考系的SRID元数据信息。可以使用函数ST_Transform来把指定的几何对象投影到新的坐标系统中。

    • 该函数方法实现了规范 OpenGIS Simple Features Implementation Specification for SQL 1.1。

    • 该函数支持CircularString和Curve几何类型对象。

    样例

    -- Mark a point as WGS 84 long lat --
    SELECT ST_SetSRID(ST_Point(-123.365556, 48.428611),4326) As wgs84long_lat;
    -- the ewkt representation (wrap with ST_AsEWKT) -
    SRID=4326;POINT(-123.365556 48.428611)
    -- Mark a point as WGS 84 long lat and then transform to web mercator (Spherical Mercator) --
    SELECT ST_Transform(ST_SetSRID(ST_Point(-123.365556, 48.428611),4326),3785) As spere_merc;
    -- the ewkt representation (wrap with ST_AsEWKT) -
    SRID=3785;POINT(-13732990.8753491 6178458.96425423)
    

    参考

    ST_AsEWKT , ST_Point , ST_SRID , ST_Transform , UpdateGeometrySRID

    6.7.2. ST_SRID

    ST_SRID —返回ST_Geometry值对应对象的SRID值,该值必须存在spatial_ref_sys表中。

    用法

    integer ST_SRID(geometry g1);
    

    描述

    返回ST_Geometry值对应对象的SRID值,该值必须存在spatial_ref_sys表中。

    样例

    SELECT ST_SRID(ST_GeomFromText('POINT(-71.1043 42.315)',4326));
    --result
    4326
    

    参考

    ST_GeomFromText , ST_SetSRID , ST_Transform

    6.7.3. ST_Transform

    ST_Transform — 返回一个根据给定的SRID转换成新的坐标系对象。

    用法

    geometry ST_Transform(geometry g1, integer srid);
    

    描述

    返回一个根据给定的SRID转换成新的坐标系对象,SRID值必须存在于 SPATIAL_REF_SYS 表中。ST_Transform 函数通常会和函数ST_SetSRID()混淆。 ST_Transform函数实际上会把一个几何对象坐标从一个参考系转换成另一个,而函数ST_SetSRID() 只是简单的修改输入的几何对象的SRID值。

    注意

    如果多次使用同一个转换,在经常使用该函数的列上添加该函数索引是很有用的,这样可以充分利用索引。

    样例

    Change Mass state plane US feet geometry to WGS 84 long lat
    SELECT ST_AsText(ST_Transform(ST_GeomFromText('POLYGON((743238 2967416,743238 2967450, 743265 2967450,743265.625 2967416,743238 2967416))',2249),4326)) As wgs_geom;
    
    wgs_geom
    ---------------------------
    POLYGON((-71.1776848522251 42.3902896512902,-71.1776843766326
    42.3903829478009,-71.1775844305465 42.3903826677917,-71.1775825927231
    42.3902893647987,-71.177684 8522251 42.3902896512902));
    (1 row)
    
    --3D Circular String example
    SELECT ST_AsEWKT(ST_Transform(ST_GeomFromEWKT('SRID=2249;CIRCULARSTRING(743238 2967416 1,743238 2967450 2,743265 2967450 3,743265.625 2967416 3,743238 2967416 4)'),4326));
    
    st_asewkt
    --------------------------------------------------------------------------------------
    SRID=4326;CIRCULARSTRING(-71.1776848522251 42.3902896512902 1,-71.1776843766326
    42.3903829478009 2,-71.1775844305465 42.3903826677917 3, -71.1775825927231
    42.3902893647987 3,-71.1776848522251 42.3902896512902 4)
    

    创建函数索引的例子.对于那些不确定将会记录哪些几何对象的表,最好的办法是使用 partial index 类型的索引,该索引会忽略掉NULL类型几何对象,节省存储空间并让索引更小更有效率。

    CREATE INDEX idx_the_geom_26986_parcels
    ON parcels
    USING gist
    (ST_Transform(the_geom, 26986))
    WHERE the_geom IS NOT NULL;
    

    配置转换方式

    在有网格偏移的情况下,坐标转换有时会失败,例如:在没有提供网格偏移文件或坐标不在文件定义的网格偏移范围内。 默认情况下,KGIS在没有提供网格偏移文件时候会抛出一个错误,但是这种方式可以通过改变在spatial_ref_sys table表中的proj4text值来配置每一个SRID基准。 例如:proj4text参数+datum=NAD87是如下+nadgrids参数的简单等效办法:

    +nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat
    

    参数 @ prefix 意义是如果没有提供网格偏移文件,将不会报错,但是如果搜索到文件列表结束后,没有找到合适的文件,将会报错。 相反,如果保证最基本的文件已经提供了,但扫描所有文件后了却没有找到对应的转换,应该使用下面的参数:

    +nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat,null
    

    这里的 null 网格偏移文件是一个有效的能够覆盖所有地方的网格偏移文件,作用是保证没有偏移。 因此作为一个完整的例子,如果想将一个不在正确范围内的参考系转换到 SRID=4267 坐标参考系中,并且保证不报ERROR,应该使用如下的方式:

    UPDATE spatial_ref_sys SET proj4text = '+proj=longlat +ellps=clrk66 +nadgrids=@conus,
    @alaska,@ntv2_0.gsb,@ntv1_can.dat,null +no_defs' WHERE srid = 4267;
    

    参考

    ST_AsText , ST_SetSRID , UpdateGeometrySRID

  • 相关阅读:
    Vue 3.4.5深度解析:从基础到高级,掌握Composition API与全局API精髓
    机器学习(12)---梯度下降(含手写公式、推导过程和手写例题)
    【PTA】蛇形矩阵
    MARKDOWN 文档图片编码嵌入方案
    Qt调用工业相机之海康威视相机SDK配置(完整版)
    编译并调试第一个so动态链接库文件
    Sqlserver关于tempdb临时数据库文件个数的最佳实践
    VPS8505 微功率隔离电源专用芯片2.3-6VIN/24V/1A 功率管 替代金升阳模块
    深入浅出学Verilog--数据类型
    Android手机防沉迷软件的基本原理
  • 原文地址:https://blog.csdn.net/arthemis_14/article/details/126247430