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

2023-11-15

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='空间位置信息'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

这里我创建了一张位置信息表,每个人对应的经纬度都会以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)'));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

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

1. 查询张三的经纬度信息
select name, astext(gis) gis from z_gis where name = '张三';
  • 1
  • astext()函数是将geometry类型转化为字符串

sql执行结果 

name gis
张三 POINT(108.9498710632 34.2588125935)
2. 修改张三的位置信息
update z_gis set gis = geomfromtext('point(108.9465236664 34.2598766768)') where name = '张三';
  • 1
  • 我用的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.
  • 1
  • 好像是除了用id修改,其他修改都会报这个错,下面这样设置一下就OK了 。
set sql_safe_updates = 0;
  • 1
3. 查询张三和李四之间的距离
select floor(st_distance_sphere(
    (select gis from z_gis where name= '张三'),
    gis
)) distance from z_gis where name= '李四';
  • 1
  • 2
  • 3
  • 4
  • 本来想格式化sql语句的,但是发现格式化之后的sql 基本全变成大写的了,我觉得辨识度更低了,所有大家就这样将就看吧,st_distance_sphere()函数是计算两点之间距离的,所以传两个参数,都是geometry类型的,floor()函数是把计算出的距离取整。

sql执行结果 

distance
329
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) < 500
        AND name != '张三';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

sql执行结果 

name distance point
李四 329 POINT(108.9465236664 34.2598766768)
王五 198 POINT(108.947725296 34.2590342786)
十九 317 POINT(108.9530360699 34.2599476152)
  • 如果表中数据非常多时,这样查效率会非常低,这时就会用到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) < 500
        AND name != '张三';  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 前面说过geohash是把经纬度转成字符串,建表的时候我定义让它转成8位字符,当两个点离得越近时,它生成的geohash字符串前面相同的位数越多,所以我在这里先用left()截取前6位字符,前6位相同的误差在±600米左右,然后模糊查询,查出大概符合条件的数据,最后再精确比较,下面是geohash官方文档对geohash长度和距离误差的说明:
geohash长度 误差距离(km)
1 ±2500
2 ±630
3 ±78
4 ±20
5 ±2.4
6 ±0.61
7 ±0.076
8 ±0.019
  • 注意:用geohash 查询会有边界问题,所以查询出来的结果又可能不准确,可以用程序(例如java代码)先查出当前点周围8个范围的geohash值,然后再匹配这9个范围的所有数据,这样就解决了geohash 的边界问题。
geohash官方文档地址:https://en.wikipedia.org/wiki/Geohash

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


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


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql中geometry类型的简单使用(搜索附近的人) 的相关文章

  • Yii2 从 MySQL 中的表登录的分步指南

    我开始在 Yii2 中迈出第一步 到目前为止 我已经能够编写一个应用程序并将数据库中的表连接到它 就像我在 Yii1 中学到的那样 该表是contacts我的创建视图中的表单将数据发送到数据库 没有任何问题 问题是我只能在 Yii2 内置的
  • 如何设置 Hibernate 读取/写入不同的数据源?

    使用 Spring 和 Hibernate 我想写入一个 MySQL 主数据库 并从基于云的 Java Web 应用程序中的另一个复制从属数据库中读取数据 我找不到对应用程序代码透明的解决方案 我真的不想更改我的 DAO 来管理不同的 Se
  • 表被指定两次作为 INSERT 的目标和单独的数据源

    我做了这个查询 但它给了我错误 就像标题中一样 INSERT INTO data waktu vaksinasi id binatang id vaksin tanggal vaksin status vaksin VALUES 1 1 S
  • 如何使用WAMP登录phpMyAdmin,用户名和密码是什么?

    根 这个词是什么意思php我的管理员 http en wikipedia org wiki PhpMyAdmin 每当我写作时localhost phpmyadmin在地址栏上 我被要求输入用户名和密码 但我不知道它们是什么 我不记得何时何
  • 如何从java中的字符串时间戳中提取日期和时间

    我正在获取日期和时间String TIMESTAMP来自服务器的 MySQL 格式如下 2014 02 15 05 18 08 我想要的是提取日期DD MM YYYY格式和时间HH MM SS AM PM格式 而且这个时间戳的时区是不同的
  • java.sql.SQLException:已经关闭

    我们有一个在 Tomcat 上运行的 Web 应用程序 带有 MySQL 后端 有一段时间一切都很好 然后突然我们开始遇到这个异常java sql SQLException Already closed 整个堆栈跟踪是 DEBUG org
  • Hibernate HQL Join 查询 DOT 节点,没有左侧

    我有两个模型类 应用程序 java Entity Table name Application catalog mysqldb XmlRootElement public class Application extends BaseObje
  • 多人/单人测验游戏的数据库设计

    我在这里看到了很多问题 但没有人适合我的问题 我正在尝试创建一个可扩展的 ER 模型 如果我想添加更多数据 则不会破坏几乎任何东西 所以我尝试创建的是 有两种类型的用户 比如说管理员和工作人员 他们有不同的角色 管理员可以对问题进行 CRU
  • 如何更改Linux服务器中的MySQL表名不区分大小写?

    我正在开发一个旧网站 该网站曾经托管在 Apple 服务器上 当它迁移到新的 Linux 服务器时 它停止工作 我很确定这是因为 php 脚本中使用的所有 MySQL 查询对于表名都有不同的大小写组合 我不知道为什么原始开发人员在创建表名或
  • 数据库设计 - “推”模型,或写时扇出

    背景信息 我正在尝试检索我关注的人的图像 按最新时间排序 它就像 Twitter 新闻源 显示您朋友的最新动态 Plans 目前我只需要考虑一项 那就是图像 将来我计划分析用户的行为并将他们可能喜欢的其他图像添加到他们的提要中等 http
  • UTF-8、PHP 和 XML Mysql

    我在解决这个问题时遇到了很大的问题 我有一个编码 latin1 swedish ci 的 mysql 数据库和一个存储名称和地址的表 我正在尝试输出 UTF 8 XML 文件 但在使用以下字符串时遇到问题 Otiv gen它被输出为Otiv
  • MySQL Workbench 深色主题

    我刚刚开始学习 SQL 课程 并且一直在尝试不同的 GUI 我喜欢使用 MySQL Workbench 但白色背景刺瞎了我的眼睛 我已经搜索并找到了一些其他讨论编辑 xml 文件的相关帖子 我尝试用几种不同的方式对其进行编辑 但无济于事 我
  • SELECT COUNT() 与 mysql_num_rows();

    我有一个大表 60 数百万条记录 我正在使用 PHP 脚本来浏览该表 PHP 脚本 带分页 加载速度非常快 因为 表引擎是InnoDB因此SELECT COUNT 非常慢并且mysql num rows 不是一个选项 所以我将总行数 我用来
  • 删除 ibdata1 后 MySQL 表消失了

    几天前 经过一番谷歌搜索后 我发现了这篇文章 我无法再让 mysql 运行了 xampp XAMPP MySQL 意外关闭 https stackoverflow com questions 18022809 xampp mysql shu
  • Mysql使用触发器建表

    我尝试在 Mysql 触发器内创建表 但没有创建 如何使用触发器创建表 这里传递的表的名称是动态的 据我所知 在触发器内创建表是不可能的 看这里 http forums mysql com read php 99 121849 122609
  • 在 Bluemix 中激活 PHP 扩展

    这纯粹是 Bluemix 问题 我的代码在本地主机上顺利运行 但是当我将其迁移到 Bluemix 时 我的数据库连接失败了 检查日志 我发现问题 调用未定义的函数 mysqli init HTTP 响应 500 我发现扩展已被禁用以使其更小
  • MySQL 错误 1264:列的值超出范围

    As I SETMySQL 中的 cust fax 表如下所示 cust fax integer 10 NOT NULL 然后我插入这样的值 INSERT INTO database values 3172978990 但随后它说 错误 1
  • Laravel Eloquent with()-> 返回 null

    我正在尝试使用 Eloquent 来获取具有以下功能的特定产品 brand id映射到a的列brands表 该brand数组返回空 这里有什么明显需要改变的地方吗 product Product with images gt with br
  • InnoDB如何存储字符列?

    这个问题仅解决 短 的问题CHAR and VARCHAR列存储在 InnoDB 表中 Does a CHAR 10 列正好占用 10 个字节吗 尾随空格会发生什么情况 对于每个字符需要超过 1 个字节的字符集怎么办 如何VARCHAR 1
  • mysql 无法向用户授予权限,出现错误:ERROR 1819 (HY000): 您的密码不满足当前策略要求

    我正在将一个新应用程序迁移到包含 MySQL 数据库的生产环境 尝试使用以下命令授予所需权限时 GRANT ALTER CREATE ON MyDB to ThisUser 我收到错误 ERROR 1819 HY000 Your passw

随机推荐

  • mysql数据库管理-FEDERATED存储引擎远程链接MYSQL+ORACLE

    一 FEDERATED存储引擎 01 从5 1 26开始 默认MySQL不启用federated存储引擎 所以需要在my cnf中加入federated选项 02 或是在命令行用 federated选项启动mysqld 1 1 说明 mys
  • ubuntu下修改用户的默认目录

    linux系统下 不同的用户有对应的默认目录设置 这些设置都被保存在配置文件 etc passwd中 由上我们可以看出 对于用户名为JACK的用户 其系统默认目录为 home JACK 那么有时候我们可能在JACK目录下新建了一个目录 co
  • 大模型:如何利用旧的tokenizer训练出一个新的来?

    背景 我们在用chatGPT或者SD的时候 发现如果使用英语写提示词得到的结果比我们使用中文得到的结果要好很多 为什么呢 这其中就有一个叫做tokenizer的东西在作怪 训练一个合适的tokenizer是训练大模型的基础 我们既可以从头开
  • actuator--基础--6.3--端点解析--loggers端点

    actuator 基础 6 3 端点解析 loggers端点 代码位置 https gitee com DanShenGuiZu learnDemo tree master actuator learn actuator01 1 介绍 用于
  • 使用Selenium自动化测试web程序

    Selenium 是目前用的最广泛的Web UI 自动化测试框架 核心功能就是可以在多个浏览器上进行自动化测试 支持多平台 windows linux MAC 支持多浏览器 ie ff safari opera chrome 多语言C ja
  • GB28181设备接入侧如何支持H.265?

    技术背景 一直以来 GB28181 2022之前的规范版本让人诟病的一点 没有明确针对H 265的说明 特别是监控摄像机 H 265已然成为标配 GB T28181 2022规范 终于针对H 265做了明确的说明 让我们来一起解读下规范 基
  • differential privacy 差分隐私入门 (二)

    书接上回 对差分隐私比较感兴趣 看了几篇文章 了解一下大概的思想 现在决定重新看一下 发现有些文章内容不是很懂 干脆就一边翻译一边看了 不懂的地方我会加下划线 如果有人看到了 还请不吝指教 注 文章是Cynthia Dwork的 Di er
  • JavaSE复习:数组

    数组 Array 是多个相同类型数据按一定顺序排列 的集合 并使用一个名字命名 并通过编号的方式 对这些数据进行统一管理 数组的常见概念 数组名 下标 或索引 元素 数组的长度 1 数组本身是引用数据类型 而数组中的元素可以是任何数据类型
  • curl访问https报错:Cert verify failed: BADCERT_NOT_TRUSTED

    这个错跟https blog csdn net lixuande19871015 article details 88788699里面的错误看上去有些不太一样 curl v https www baidu com Cert verify f
  • 神经网络记忆_带记忆的神经网络

    神经网络记忆 深度学习 DEEP LEARNING We always heard that Neural Networks NNs are inspired by biological neural networks This huge
  • 初探TVM--TVM优化resnet50

    测试用TVM编译出的resnet50在CPU上的效果 测试resnet50在CPU上的效果 编译后的resnet50模型 图像预处理 运行编译后的模型 查看输出结果 resnet50自动调优 模型调优 auto tune 编译调优过的模型
  • Java: Observer Patterns

    版权所有 2022 涂聚文有限公司 许可信息查看 描述 观察者模式 Observer Patterns 也叫做发布 订阅模式 Publist Subscribe 模型 视图模式 Model View 源 监听器 Source Listene
  • [毕业设计]最新通信工程专业毕设选题题目推荐汇总

    文章目录 1前言 2 如何选题 3 通信工程选题方向 3 1 移动通信方向 3 2 嵌入式开发方向 3 3 人工智能方向 3 4 物联网方向 3 5 算法研究方向 3 6 移动应用开发方向 3 7 网络通信方向 3 8 学长作品展示 4 最
  • DevOps到底是什么意思?

    提到DevOps这个词 我相信很多人一定不会陌生 作为一个热门的概念 DevOps近年来频频出现在各大技术社区和媒体的文章中 备受行业大咖的追捧 也吸引了很多吃瓜群众的围观 那么 DevOps是什么呢 有人说它是一种方法 也有人说它是一种工
  • 为什么要在测试集中不需要使用fit_transform的原因?

    假设我们有一组数据 10 20 30 则标准化之后的数据为 array 1 22474487 0 1 22474487 这组数据的均值为 20 0 标准差为 8 16496580927726 标准化之后的这组数据 其标准差为1 均值为0 假
  • 张钜楷:1.22黄金原油下周实时行情趋势分析及黄金独家操作建议指导

    黄金行情走势分析 周五 1月21日 国际金价进一步走低 远离隔夜创下的11月22日以来高位1847 87美元 盎司 金价对美国升息很敏感 利率上升会降低持有无孳息黄金的吸引力 但金价周线有望连续第二周收阳 本周到目前为止累计涨幅逾0 8 因
  • sql查找一列中某一数值出现次数大于2的记录

    sql查找一列中某一数值出现次数大于2的记录 百度知道
  • 机械臂控制——4

    Robot Drivers 机器人驱动程序可以控制连接到计算机的真实机器人 机器人驱动程序使用通用软件接口来控制和监视特定的机器人控制器 使计算机能够控制工业机器人 机器人驱动程序提供了脱机编程的替代方案 程序被模拟 生成 然后传输到机器人
  • python人工智能应用实例_90后博士说,从Python到人工智能只差这35个趣味案例,越学越有趣...

    有趣的生活每个人都向往 有趣的Python编程学习方式却不是每个人都体验过 以这35个趣味案例开始 让兴趣成为学习Python最好的动力 看看这35个趣味案例 几乎是每个案例都对应着一个Python的知识点 比如 以照猫画虎的案例 教你剖析
  • mysql中geometry类型的简单使用(搜索附近的人)

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