OGC的WKB和WKT格式

OGC定义了两种描述几何对象的格式,分别是WKB(Well-Known Binary)和WKT(Well-Known Text)。

在SQL语句中,用以下的方式可以使用WKT格式定义几何对象:

几何要素 WKT格式

点 POINT(0 0)

线 LINESTRING(0 0,1 1,1 2)

面 POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))

多线 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)))

以下语句可以使用WKT格式插入一个点要素到一个表中,其中用到的GeomFromText等函数在后面会有详细介绍:

INSERT INTO table (SHAPE,NAME)

VALUES (GeomFromText('POINT(116.39 39.9)', 4326), '北京');

EWKT、EWKB和Canonical格式

EWKT和EWKB相比OGC WKT和WKB格式主要的扩展有3DZ、3DM、4D坐标和内嵌空间参考支持。

以下以EWKT语句定义了一些几何对象:

几何类型 格式

3D点 POINT(0 0 0)

内嵌空间参考的点 SRID=32632;POINT(0 0)

带M值的点 POINTM(0 0 0)

带M值的3D点 POINT(0 0 0 0)

内嵌空间参考的带M值的多点 SRID=4326;MULTIPOINTM(0 0 0,1 2 1)

以下语句可以使用EWKT格式插入一个点要素到一个表中:

INSERT INTO table (SHAPE, NAME)

VALUES(GeomFromEWKT('SRID=4326;POINTM(116.39 39.9 10)'), '北京')

Canonical格式是16进制编码的几何对象,直接用SQL语句查询出来的就是这种格式。

SQL-MM格式

SQL-MM格式定义了一些插值曲线,这些插值曲线和EWKT有点类似,也支持3DZ、3DM、4D坐标,但是不支持嵌入空间参考。

以下以SQL-MM语句定义了一些插值几何对象:

几何类型 格式

插值圆弧 CIRCULARSTRING(0 0, 1 1, 1 0)

插值复合曲线 COMPOUNDCURVE(CIRCULARSTRING(0 0, 1 1, 1 0),(1 0, 0 1))

曲线多边形 CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 3 3, 3 1, 1 1))

多曲线 MULTICURVE((0 0, 5 5),CIRCULARSTRING(4 0, 4 4, 8 4))

多曲面 MULTISURFACE(CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 3 3, 3 1, 1 1)),((10 10, 14 12, 11 10, 10 10),(11 11, 11.5 11, 11 11.5, 11 11)))

PostGIS中空间信息处理的实现

spatial_ref_sys表

在基于PostGIS模板创建的数据库的public模式下,有一个spatial_ref_sys表,它存放的是OGC规范的空间参考。

srid存放的就是空间参考的Well-Known ID,对这个空间参考的定义主要包括两个字段,srtext存放的是以字符串描述的空间参考,proj4text存放的则是以字符串描述的PROJ.4 投影定义(PostGIS使用PROJ.4实现投影)。

geometry_columns表

geometry_columns表存放了当前数据库中所有几何字段的信息,比如我当前的库里面有两个空间表,在geometry_columns表中就可以找到这两个空间表中几何字段的定义

其中f_table_schema字段表示的是空间表所在的模式,f_table_name字段表示的是空间表的表名,f_geometry_column字段表示的是该空间表中几何字段的名称,srid字段表示的是该空间表的空间参考。

在PostGIS中创建一个空间表

在PostGIS中创建一个包含几何字段的空间表分为2步:第一步创建一个一般表,第二步给这个表添加几何字段。

以下先在test模式下创建一个名为cities的一般表:

create table test.cities (id int4, name varchar(20))

再给cities添加一个名为shape的几何字段(二维点):

select AddGeometryColumn('test', 'cities', 'shape', 4326, 'POINT', 2)

PostGIS对几何信息的检查

PostGIS可以检查几何信息的正确性,这主要是通过IsValid函数实现的。

以下语句分辨检查了2个几何对象的正确性,显然,(0, 0)点和(1,1)点可以构成一条线,但是(0, 0)点和(0, 0)点则不能构成,这个语句执行以后的得出的结果是TRUE,FALSE。

?

1

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))

这时当我们往这个表试图插入一个错误的空间对象的时候,会得到一个错误:

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

PostGIS中的空间索引

数据库对多维数据的存取有两种索引方案,R-Tree和GiST(Generalized Search Tree),在PostgreSQL中的GiST比R-Tree的健壮性更好,因此PostGIS对空间数据的索引一般采用GiST实现。

以下的语句给sde模式中的cities表添加了一个空间索引shape_index_cities,在pgAdmin中也可以通过图形界面完成相同的功能。

CREATE INDEX shape_index_cities

ON sde.cities

USING gist

(shape);

另外要注意的是,空间索引只有在进行基于边界范围的查询时才起作用,比如“&&”操作。

mysql 几何对象,几何(geometry)对象类型相关推荐

  1. java mysql geometry_java程序操作Geometry对象

    Geometry 空间地理对象,Oracle中存储Geometry对象的字段类型是 MDSYS.SDO_GEOMETRY,在数据库中构建Geometry对象的方法: v_pointarray MDSY ...

  2. 使用Blender中的几何节点创建程序对象

    大小解压后:2.4G 持续时间3h 30m 1280X720 MP4 语言:英语+中英文字幕(根据原英文字幕机译更准确) 使用Blender中的几何节点按程序创建对象 信息: 使用Blender中的几 ...

  3. [转自 Flyingis]Geometry 对象浅析

    作者:Flyingis ArcEngine Geometry库定义了基本几何图形的矢量表达形式,顶级的几何图形有Points.Multipoints.Polylines.Polygons.Multip ...

  4. 【沐风老师】3DMAX几何投影插件Geometry Projection使用详解

    [几何投影插件] 描述 3DMAX几何投影插件Geometry Projection,将一个或多个对象或它的顶点选择沿全局或局部 x.y 或 z 轴投影到另一个对象上. 适用版本 3dMax2013或 ...

  5. geometry java_java程序操作Geometry对象(示例代码)

    Geometry 空间地理对象,Oracle中存储Geometry对象的字段类型是 MDSYS.SDO_GEOMETRY,在数据库中构建Geometry对象的方法: v_pointarray MDSY ...

  6. java geometry mysql_java程序操作Geometry对象

    Geometry 空间地理对象,Oracle中存储Geometry对象的字段类型是 MDSYS.SDO_GEOMETRY,在数据库中构建Geometry对象的方法: v_pointarray MDSY ...

  7. 【数据库迁移系列】从MySQL到openGauss的数据库对象迁移实践

    在之前这一篇中我们分享过使用chameleon工具完成MySQL到openGauss的全量数据复制.实时在线复制.9.30新发布的openGauss 3.1.0版本 ,工具的全量迁移和增量迁移的性能不 ...

  8. GeoJson的生成与解析,JSON解析,Java读写geojson,geotools读取shp文件,Geotools中Geometry对象与GeoJson的相互转换

    GeoJson的生成与解析 一.wkt格式的geometry转成json格式 二.json格式转wkt格式 三.json格式的数据进行解析 四.Java读写geojson 五.geotools读取sh ...

  9. 微软免费图书《Introducing Microsoft LINQ》翻译Chapter2.1:C# 3.0 特性(对象初始化表达式\匿名类型\查询表达式)...

    本书翻译目的为个人学习和知识共享,其版权属原作者所有,如有侵权,请告知本人,本人将立即对发帖采取处理. 允许转载,但转载时请注明本版权声明信息,禁止用于商业用途! 博客园:韩现龙 Introducin ...

  10. 大对象简介+大对象的4种类型+lob类型的优点+lob的组成

    大对象简介 1用来存储大型数据,如图片,视频,音乐等 2可用于存储二进制数据,字符数据,引用外部文件的指针的数据类型 大对象的4种类型 1BLOB数据类型 1)它是用来存储二进制数据. 2)可以存储的 ...

最新文章

  1. 【 C 】高级字符串查找之查找标记(token)函数 strtok介绍
  2. 中国电梯行业动态调研与未来发展趋势展望报告2022-2028年版
  3. 【LeetCode笔记】剑指Offer 19. 正则表达式匹配(Java、动态规划)
  4. 用java输出图形_java基础-输出一个简单的图形。
  5. Linux pwd命令:显示当前路径
  6. QT [007] QT UI 的控件操控问题 - 如何操控多嵌套的UI控件
  7. Git笔记(21) 分布式工作流程
  8. Stanford CS230深度学习(五)CNN和ResNet
  9. 微博热榜排行榜zset
  10. pyQT5 designer5.15.0的汉化问题,如何解决
  11. Java Sigar Windows 监控系统
  12. typescript获取时间戳
  13. Idea中jclasslib的安装与使用
  14. 魔兽和星际的最大差别
  15. Java学习笔记-不定时更新
  16. k8s 二进制集群部署
  17. ncnn opencv VS2017 window10 yolov5调用摄像头实时目标检测
  18. Google Earth Engine(GEE)——海洋总测深图数据集(GEBCO)
  19. Agilent E4407B/安捷伦E4407B频谱分析仪
  20. Android AlarmManagerService TIME_TICK 广播发送流程

热门文章

  1. (转)cd命令为何要实现成shell内建命令
  2. 解决“鼠标关机后仍然发光”的方法
  3. 图形学相关的一些数学知识(链接)
  4. 《Ray Tracing in One Weekend》——Chapter 11: Defocus Blur
  5. 二叉树遍历的非递归算法
  6. python报表自动化系列 - 获取某月日历并以列表形式返回(公历)
  7. mysql外键可以是空吗_带外键的表列可以为NULL吗?
  8. 用函数实现字符串拼接_JDK拍了拍你:字符串拼接一定记得用MessageFormat#format
  9. Apple Watch新玩法:手势操控无人机
  10. OCM_第十一天课程:Section5 —》数据仓库