博客
关于我
MySQL中地理位置数据扩展geometry的使用心得
阅读量:789 次
发布时间:2023-02-11

本文共 3622 字,大约阅读时间需要 12 分钟。

MySQL Geometry类型入门与实践指南

最近在学习MySQL的Geometry数据存储和计算,下面是我理解的内容。

环境

Geometry推荐在5.6版本以上使用,尽管大部分功能在5.5版本中已经可用,除了距离计算函数st_distance等新增函数。

Geometry类型分类

Geometry是所有几何类型的基类,其子类包括Point、LineString、Polygon等。Geometry具有以下共同属性:

  • type:几何对象的类型(如Point、LineString、Polygon等)。
  • SRID:定义几何对象的坐标空间的空间坐标系统ID。默认使用WGS84坐标系。
  • coordinates:几何对象的坐标值。
  • interior/boundary/exterior:分别表示几何对象的内部、边界和外部。
  • MBR:几何对象的最小包围矩形(Bounding Box)。
  • simple/not simple:几何对象是否是简单的。
  • closed/not closed:几何对象是否封闭。
  • dimension:几何对象的维度(Point:0维,LineString:1维,Polygon:2维)。
  • Geometry类型的具体实现

    Point(点)

    Point是几何类型中最简单的,它具有一个坐标值,没有长度、面积或边界。例如:

    POINT(121.213342 31.234532)

    LineString(线段)

    LineString由一系列点连接而成。如果线段没有交叉且端点不重复,则为简单线段;如果起点和终点重合,则为封闭线段。例如:

    LINESTRING(121.342423 31.542423, 121.345664 31.246790, 121.453178 31.456862)

    Polygon(多边形)

    Polygon可以是一个实心平面形(没有内部边界)或具有空洞。例如:

    POLYGON((121.342423 31.542423, 121.345664 31.246790, 121.453178 31.456862), (121.563633 31.566652, 121.233565 31.234565, 121.568756 31.454367))

    Geometry对象的数据存储格式

    MySQL支持三种几何对象存储格式:

  • WKT(文本键值格式):最简单易读的格式。
  • WKB(二进制键值编码):适合高效存储和比较。
  • MySQL内部格式:优化了存储和查询性能。
  • 本文将重点介绍WKT格式。

    WKT格式示例

    • Point
      POINT(121.213342 31.234532)
    • LineString
      LINESTRING(121.342423 31.542423, 121.345664 31.246790, 121.453178 31.456862)
    • Polygon
      POLYGON((121.342423 31.542423, 121.345664 31.246790, 121.453178 31.456862), (121.563633 31.566652, 121.233565 31.234565, 121.568756 31.454367))
    • 集合类
      • MULTIPOINT:
        MULTIPOINT(0 0, 20 20, 60 60)
      • MULTILINESTRING:
        MULTILINESTRING((10 10, 20 20), (15 15, 30 15))
      • MULTIPOLYGON:
        MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))
      • GEOMETRYCOLLECTION:
        GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))

    创建Geometry对象

    MySQL提供了多种函数用于创建几何对象:

    • GeomFromText(wkt):将WKT格式转换为Geometry对象。
    • PointFromText(wkt):创建Point对象。
    • LineStringFromText(wkt):创建LineString对象。
    • PolygonFromText(wkt):创建Polygon对象。

    支持空间几何的表结构

    表结构示例

    CREATE TABLE `t_geo_test` (    `ID` int(11) NOT NULL AUTO_INCREMENT,    `NAME` varchar(64) NOT NULL,    `SHAPE` geometry NOT NULL,    PRIMARY KEY (`ID`)) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC

    插入数据

    INSERT INTO `t_geo_test` (ID, NAME, SHAPE) VALUES (1, 'P1', geomFromText('POINT(121.474103 31.232862)'));
    INSERT INTO `t_geo_test` (ID, NAME, SHAPE) VALUES (2, 'L1', geomFromText('LINESTRING(121.474103 31.232862, 121.472462 31.231339, 121.471984 31.232821)'));
    INSERT INTO `t_geo_test` (ID, NAME, SHAPE) VALUES (5, 'POLYGON_1', geomfromtext('POLYGON((121.474243 31.234504, 121.471775 31.233348, 121.470724 31.23155, 121.471603 31.230229, 121.472655 31.230357, 121.475777 31.232045, 121.474243 31.234504))'));

    获取数据

    使用AsText()函数将几何对象转换为WKT格式:

    SELECT AsText(SHAPE) FROM `t_geo_test` WHERE ID = 1;

    常用函数

    属性获取函数

    • Dimension(g):返回几何对象g的维度。
    • Envelope(g):返回几何对象g的最小包围矩形(MBR)。
    • GeometryType(g):返回几何对象g的类型字符串。
    • IsClosed(g):判断几何对象是否封闭。
    • IsSimple(g):判断几何对象是否简单。

    点操作函数

    • X(p):返回点p的X坐标。
    • Y(p):返回点p的Y坐标。

    LineString操作函数

    • EndPoint(line):返回线段的终点。
    • StartPoint(line):返回线段的起点。
    • PointN(line, N):返回线段中的第N个点。

    Polygon操作函数

    • ExteriorRing(poly):返回多边形的外环。
    • InteriorRingN(poly, N):返回多边形的第N个内环。
    • NumInteriorRings(poly):返回多边形的内环数。

    空间操作函数

    综合操作函数

    • st_union(g1, g2):将g1和g2合并为一个集合类对象。
    • st_difference(g1, g2):返回g1与g2的点集合差异。
    • st_intersection(g1, g2):返回g1与g2的点集合交集。
    • st_within(g1, g2):判断g1是否在g2内部。

    交叉与包含关系

    • st_contains(g1, g2):判断g1是否完全包含g2。
    • st_crosses(g1, g2):判断g1与g2是否相交。
    • st_intersects(g1, g2):判断g1与g2是否有交集。
    • st_disjoint(g1, g2):判断g1与g2是否不相交。

    空间索引

    geometry类型字段创建空间索引可以显著提升查询性能。例如:

    CREATE SPATIAL INDEX i_shape ON `t_geo_test`(SHAPE);

    删除索引:

    DROP INDEX i_shape ON `t_geo_test`;

    注意事项

  • MySQL默认使用WGS84坐标系,建议在输入坐标时使用该坐标系。
  • 使用st_distance等函数进行距离、长度或面积计算时,可能存在一定误差,建议谨慎使用。
  • 创建空间索引时,确保引擎支持空间索引功能(默认支持)。
  • 以上就是对MySQL Geometry类型的理解和实践总结。

    转载地址:http://opbfk.baihongyu.com/

    你可能感兴趣的文章
    Mysql——深入浅出InnoDB底层原理
    查看>>
    MySQL“被动”性能优化汇总
    查看>>
    MySQL、HBase 和 Elasticsearch:特点与区别详解
    查看>>
    MySQL、Redis高频面试题汇总
    查看>>
    MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
    查看>>
    mysql一个字段为空时使用另一个字段排序
    查看>>
    MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
    查看>>
    MYSQL一直显示正在启动
    查看>>
    MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
    查看>>
    MySQL万字总结!超详细!
    查看>>
    Mysql下载以及安装(新手入门,超详细)
    查看>>
    MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
    查看>>
    MySQL不同字符集及排序规则详解:业务场景下的最佳选
    查看>>
    Mysql不同官方版本对比
    查看>>
    MySQL与Informix数据库中的同义表创建:深入解析与比较
    查看>>
    mysql与mem_细说 MySQL 之 MEM_ROOT
    查看>>
    MySQL与Oracle的数据迁移注意事项,另附转换工具链接
    查看>>
    mysql丢失更新问题
    查看>>
    MySQL两千万数据优化&迁移
    查看>>
    MySql中 delimiter 详解
    查看>>