mysql中geometry类型的简单使用

编写本文的目的:

让和两天前的我一样的初学者,能够更快的使用geometry类型存储空间点数据

也是为了自己加深印象,更熟练的使用geometry类型

建表脚本

CREATE TABLE `z_gis` (

`id` varchar(45) NOT NULL,

`name` varchar(10) NOT NULL COMMENT '姓名',

`gis` geometry NOT NULL COMMENT'空间位置信息',

`geohash` varchar(20) GENERATED ALWAYS AS (st_geohash(`gis`,8)) VIRTUAL,

PRIMARY KEY (`id`),

UNIQUE KEY `id` (`id`),

SPATIAL KEY `idx_gis` (`gis`),

KEY `idx_geohash` (`geohash`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='空间位置信息'

这里我创建了一张位置信息表,每个人对应的经纬度都会以geometry类型存在表中,geohash字段是把坐标系分成很多小方格,然后将经纬度转化成字符串,其原理可自行百度,在这里就不多说了。

哦,对了,geometry类型好像不能为null,所以建表时必须为not null。

插入表数据

insert into z_gis(id,name,gis) values

(replace(uuid(),'-',''),'张三',geomfromtext('point(108.9498710632 34.2588125935)')),

(replace(uuid(),'-',''),'李四',geomfromtext('point(108.9465236664 34.2598766768)')),

(replace(uuid(),'-',''),'王五',geomfromtext('point(108.9477252960 34.2590342786)')),

(replace(uuid(),'-',''),'赵六',geomfromtext('point(108.9437770844 34.2553719653)')),

(replace(uuid(),'-',''),'小七',geomfromtext('point(108.9443349838 34.2595663206)')),

(replace(uuid(),'-',''),'孙八',geomfromtext('point(108.9473497868 34.2643456798)')),

(replace(uuid(),'-',''),'十九',geomfromtext('point(108.9530360699 34.2599476152)'));

名字是我随便起的,不要喷我哦,经纬度是我在地图上随便取的点,geomfromtext()函数是将字符串格式的点坐标,转化成geometry类型,还有个字段geohash是根据gis字段的值自动生成的,可以仔细看看建表脚本。

接下来是几个简单的查询例子

1. 查询张三的经纬度信息

select name, astext(gis) gis from z_gis where name = '张三';

astext()函数是将geometry类型转化为字符串

sql执行结果

2. 修改张三的位置信息

update z_gis set gis = geomfromtext('point(108.9465236664 34.2598766768)') where name = '张三';

我用的Mysql Workbench工具,修改时报错如下:

You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.

好像是除了用id修改,其他修改都会报这个错,下面这样设置一下就OK了 。

set sql_safe_updates = 0;

3. 查询张三和李四之间的距离

selectfloor(st_distance_sphere(

(select gis from z_gis where name= '张三'),

gis

)) distancefrom z_gis where name= '李四';

本来想格式化sql语句的,但是发现格式化之后的sql 基本全变成大写的了,我觉得辨识度更低了,所有大家就这样将就看吧,st_distance_sphere()函数是计算两点之间距离的,所以传两个参数,都是geometry类型的,floor()函数是把计算出的距离取整。

sql执行结果

4. 查询距离张三500米内的所有人

SELECT

name,

FLOOR(ST_DISTANCE_SPHERE((SELECT

gis

FROM

z_gis

WHERE

name= '张三'),

gis)) distance,

astext(gis) point

FROM

z_gis

WHERE

ST_DISTANCE_SPHERE((SELECT

gis

FROM

z_gis

WHERE

name= '张三'),

gis)< 500AND name!= '张三';

sql执行结果

如果表中数据非常多时,这样查效率会非常低,这时就会用到geohash字段查询

sql语句如下:

SELECT

name,

floor(ST_DISTANCE_SPHERE((SELECT

gis

FROM

z_gis

WHERE

name= '张三'),

gis)) distance,

astext(gis) point

FROM

z_gis

WHERE

geohash like concat(left((select geohash from z_gis where name = '张三'),6),'%')

AND ST_DISTANCE_SPHERE((SELECT

gis

FROM

z_gis

WHERE

name= '张三'),

gis)< 500AND name!= '张三';

前面说过geohash是把经纬度转成字符串,建表的时候我定义让它转成8位字符,当两个点离得越近时,它生成的geohash字符串前面相同的位数越多,所以我在这里先用left()截取前6位字符,前6位相同的误差在±600米左右,然后模糊查询,查出大概符合条件的数据,最后再精确比较,下面是geohash官方文档对geohash长度和距离误差的说明:

注意:用geohash 查询会有边界问题,所以查询出来的结果又可能不准确,可以用程序(例如java代码)先查出当前点周围8个范围的geohash值,然后再匹配这9个范围的所有数据,这样就解决了geohash 的边界问题。

geohash官方文档地址:https://en.wikipedia.org/wiki/Geohash

之前没用过markdown编辑器,所以文档格式排版很乱,请大家见谅,上面有解释不对的地方,也请大佬们及时指出来,毕竟我也算是小白,还有很多地方需要学习。

---------------------

作者:MinjerZhang

来源:CSDN

原文:https://blog.csdn.net/MinjerZhang/article/details/78137795

版权声明:本文为博主原创文章,转载请附上博文链接!

以上就是mysql中geometry类型的简单使用的全部内容。

mysql geometry 怎么 操作_mysql中geometry类型的简单使用相关推荐

  1. mysql characterencoding 枚举值_mysql中enum类型理解,读完之后,大部分程序员收藏了......

    ENUM是枚举类型,它虽然只能保存一个值,却能够处理多达65535个预定义的值.下面是我写的一个mysql语句 CREATE TABLE student(id INT(11) PRIMARY key ...

  2. mysql datetime timestamp 索引_MYSQL中时间类型底层存储,DATETIME ,TIMESTAMP,INT 如何选择?...

    在优化索引时,思考了一个问题,DATE, DATETIME, TIMESTAMP,还有INT存储的时间,在索引中哪个效率更高一些? 索引存储的,如果单纯的测试,而不去了解底层存储的方式和类型就不能断言 ...

  3. mysql获取当月最后一天_mysql中获取本月第一天、本月最后一天、上月第一天、上月最后一天

    mysql获取当月最后一天_mysql中获取本月第一天.本月最后一天.上月第一天.上月最后一天等等 转自: https://blog.csdn.net/min996358312/article/det ...

  4. mysql geometry 附近的人_mysql中geometry类型的简单使用(搜索附近的人)

    mysql中geometry类型的简单使用 编写本文的目的: 让和两天前的我一样的初学者,能够更快的使用geometry类型存储空间点数据 也是为了自己加深印象,更熟练的使用geometry类型 建表 ...

  5. mysql根据时间回退_MySQL 中的日期时间类型

    日期时间类型中包含以下几种数据类型: 各类型都有具体的取值范围,超出或非法的其他值时,MySQL 会回退到 0.TIMESTAMP 类型是个例外,给它设置一个超出范围的值时,将保存上该类型允许的最大值 ...

  6. mysql浮点数据怎么_MySQL数据浮点类型的实际应用操作

    MySQL数据浮点类型的实际应用操作 发布时间:2020-06-03 14:43:58 来源:51CTO 阅读:193 作者:三月 下文主要给大家带来MySQL数据浮点类型的实际应用操作,希望这些内容 ...

  7. mysql timestamp 默认值是什么#039;_MYSQL中TIMESTAMP类型的默认值

    MYSQL中TIMESTAMP类型可以设定默认值,就像其他类型一样.1.自动UPDATE 和INSERT 到当前的时间:表:/*DDL Information For - test.t1*/----- ...

  8. mysql 修改字段类型为字符串_MySQL中字段类型与合理的选择字段类型

    原标题:MySQL中字段类型与合理的选择字段类型 字段类型 数值 MySQL 的数值数据类型可以大致划分为两个类别,一个是 整数,另一个是 浮点数或小数. 许多不同的子类型对这些类别中的每一个都是可用 ...

  9. mysql 生明变量_MySql中的变量定义

    根据mysql手册,mysql的变量分为两种:系统变量和用户变量.但是在实际使用中,还会遇到诸如局部变量.会话变量等概念.根据个人感觉,mysql变量大体可以分为四种类型: 一.局部变量. 局部变量一 ...

最新文章

  1. jsp截取字符串前几位_7. Python3轻食丨丛林里的野蛮生长:无处不在的字符串(一)
  2. WPF MVVM从入门到精通1:MVVM模式简介
  3. 【深度学习】神经网络知识专题总结
  4. P3287-[SCOI2014]方伯伯的玉米田【二维树状数组,dp】
  5. php起始符大全,PHP 符号大全
  6. 阿里云官方网站免费套餐怎么抢
  7. 友情提示!距离CVPR 2020截稿还剩2天!
  8. ftp 查看不了图片_几个常见的ftp错误问题及解决办法
  9. 487-3279 (poj1002)
  10. XML解析模型(完整版)
  11. 仙剑四--IT的同仁有,是仙剑迷的请浏览
  12. 韩国appleid17+认证流程
  13. 微信html5活动页面制作,完整的微信H5活动页面设计规范
  14. c语言中puts的作用是,C语言的字符串输出puts()函数
  15. 第八章 高级搜索树 (b4)B-树: 插入
  16. 统计中文文本中人物出现次数
  17. 小程序开发-准备工作
  18. 基于matlab的神经网络设计,神经网络模型matlab例子
  19. 【融职教育】Web全栈工程师课程安排
  20. 翻转和旋转计算机教学,小学信息技术《翻转/旋转》教学设计及教学反思

热门文章

  1. [C]二维数组的初始化规则
  2. Spring Cloud 系列之 ZooKeeper 注册中心
  3. c++变幻的矩阵_C++课程设计c++矩阵类(简洁版)
  4. 安装thunderbird_在Thunderbird中创建签名
  5. 常用于应届生面试的24道面试题
  6. 贪心---排序不等式、绝对值不等式、推公式
  7. 杭州城市数据大脑发布:首战交通拥堵
  8. 7-85 根据输入的空气污染指数,输出相应的信息。7-86 分支结构——大小写字母判断7-87 A±B
  9. Charmer--viv【并查集】【最小生成树】
  10. 微信公众号网页H5跳转微信小程序