LBS计算附近的对象:MySQL 空间索引方式

news2024/12/29 8:37:35

目录

    • 1. MySQL空间数据类型的基本介绍
      • 1.1 什么是MySQL空间数据类型
      • 1.2 有哪些空间数据类型
      • 1.3 支持空间数据类型的引擎
      • 1.4 坐标系类型
    • 2. 存储坐标系的示例代码
      • 2.1 `geomtry`和`point`都可以存储坐标系,有什么区别呢?
      • 2.2 创建测试表
      • 2.3 新增坐标
      • 2.3 计算两地之间的距离
      • 2.5 列举距离我5km内的地址

1. MySQL空间数据类型的基本介绍

MySQL空间数据类型官方文档

1.1 什么是MySQL空间数据类型

MySQL空间数据类型是指MySQL数据库中支持的存储地理位置信息的数据类型,包括点、线、多边形等。这些数据类型可以用来存储地图坐标、地址信息等。
MySQL空间数据类型基于OpenGIS空间数据类型标准,提供了对空间数据进行索引和查询的功能,可以方便地实现地图应用、位置搜索等功能。

1.2 有哪些空间数据类型

  1. GEOMETRY:表示任意类型的几何对象,可以是点、线、面等,不受任何限制。
  2. POINT:表示一个点。
  3. LINESTRING:表示一条线。
  4. POLYGON:表示一个多边形。
  5. MULTIPOINT:表示多个点的集合。
  6. MULTILINESTRING:表示多条线的集合。
  7. MULTIPOLYGON:表示多个多边形的集合。
  8. GEOMETRYCOLLECTION:表示多个几何对象的集合。

空间数据类型之间存在继承关系、实例化和不可实例化,这些含义在后续的使用中体会下有什么区别。

1.3 支持空间数据类型的引擎

存储引擎空间数据类型及其对应函数空间索引非空间索引
InnoDBYYY
MyISAMYYY
NDBYNY
ARCHIVEYNY

总而言之,若无其它特殊需求,用InnoDB就好。

1.4 坐标系类型

既然是存储空间数据,那么就有不同的规范和标准。比如说gps、gcj02等,同一个位置,它的经纬度坐标是不一样的。在创建空间索引列的时候,可以通过SRID显示制定空间索引的类型。

SRID是空间参考系统标识符(Spatial Reference System Identifier)的缩写,用于标识空间数据的坐标系。在不同的坐标系中,相同的坐标点可能有不同的坐标值。SRID的存在可以帮助我们正确地对空间数据进行分析和处理。常见的SRID标识符有EPSG、ESRI和SR-ORG等。

中国的坐标绘制是不同于GPS的,也可以理解成中国地图反馈给我们的坐标是gps坐标偏移之后的。由于存储系统是国外的MySQL,自身不支持国内的坐标系,除非寻找相关的插件。比如说微信小程序获取到的坐标是gcj02标准下、百度地图的坐标是bd09,我们可以通过hutool提供的坐标转换工具类进行转换,将不同标准下坐标统一转换成SRID为4326(GPS坐标)的坐标存储并计算。

hutool版本 5.8.10+ cn.hutool.core.util.CoordinateUtil

2. 存储坐标系的示例代码

2.1 geomtrypoint都可以存储坐标系,有什么区别呢?

GEOMETRY 是通用的几何类型,它可以存储点、线、面等多种类型的空间数据,且可以在不同的坐标系中表示空间数据。在声明空间索引列时,可以使用 GEOMETRY 类型,MySQL 会根据数据的实际类型自动选择对应的索引类型。

POINT 是 GEOMETRY 类型的一种特殊情况,它专门用于存储点类型的空间数据。在声明空间索引列时,如果确定该列只存储点类型的数据,可以使用 POINT 类型,这样可以提高索引的查询效率。

因此,使用 GEOMETRY 类型声明空间索引列可以存储多种类型的空间数据,但可能会降低索引的查询效率;使用 POINT 类型声明空间索引列只能存储点类型的数据,但可以提高索引的查询效率。

2.2 创建测试表

检查数据库是否支持SRID为4326的坐标系系统

SELECT *
FROM INFORMATION_SCHEMA.ST_SPATIAL_REFERENCE_SYSTEMS
WHERE SRS_ID = 4326;

DDL

CREATE TABLE point_test ( 
  ID INT(11) unsigned not null auto_increment comment '主键', 
  address VARCHAR ( 64 ) NOT NULL comment '名称', 
  coordinate geometry NOT NULL SRID 4326 comment '位置坐标',
  primary key (ID),
  spatial index `spi_coordinate` (`coordinate`)
) ENGINE = INNODB charset = utf8;

2.3 新增坐标

工具一:gcj02坐标系在线拾取
工具二:gcj02wgs84坐标系在线转换

通过工具一获取到三个位置的gcj02坐标,然后通过工具二转换成wgs84(SRID=4326)坐标。分别是:

位置名称gcj02wgs84
上海虹桥机场121.34,31.20121.33543277248731,31.201919080690047
上海虹桥火车站121.32,31.19121.31547880904075,31.191962005342543
上海野生动物园121.72,31.06121.71564763519164,31.062121772948835
insert into point_test(
address, coordinate
) values
('上海虹桥机场', st_geomFromText('point(31.201919080690047 121.33543277248731)', 4326));

查询
查询结果

新增时point()函数里的坐标是没有用逗号分隔的。

输入时的st_geomFromText(‘point({纬度} {经度})’, 4326),point()里的经纬度顺序变成了纬经度,查询时coordinate的POINT()确实经纬度,这是由于4326下的坐标系在新增时point的顺序是纬经度。可以通过下面的方式更换新增时的顺序。

insert into point_test(
address, coordinate
) values
('上海虹桥火车站', st_geomFromText('point(121.31547880904075 31.191962005342543)', 4326, 'axis-order=long-lat'));

查询结果

st_geomFromText(...)可通过'axis-order=long-lat'来调整经纬度顺序。

把剩下一条也新增进来

insert into point_test(
address, coordinate
) values
('上海野生动物园', st_geomFromText('point(121.71564763519164 31.062121772948835)', 4326, 'axis-order=long-lat'));

2.3 计算两地之间的距离

官方函数列表:https://dev.mysql.com/doc/refman/8.0/en/built-in-function-reference.html

st_distance_sphere 返回值单位:米

select st_distance_sphere((select coordinate from point_test where id = 1), (select coordinate from point_test where id = 2)) 
as distance;

查询结果

2197.2655430832847

意思是虹桥机场距离虹桥火车站的球面距离约为2197米,即2.1公里。

这里的球面距离不代表行使总路程,毕竟甚少有路是点对点的,多少要走几个弯路。

执行计划显示查询性能较好
执行计划

2.5 列举距离我5km内的地址

有两种方式,一是通过st_distance_sphere计算距离,然后在where条件里面筛选,这样做是不走空间索引的,由于你给空间索引coordinate用了函数。
另一种方式是通过MBRContains函数,接下来重点介绍该函数。
假设我目前处于虹桥火车站,即我的坐标是121.31547880904075,31.191962005342543
步骤一:利用st_buffer(...)生成我的坐标为圆心,5000米为半径的圆形区域。

st_buffer https://dev.mysql.com/doc/refman/8.0/en/spatial-operator-functions.html#function_st-buffer
官方的介绍有点复杂,尤其是第三个参数。

st_buffer第一个参数是geometry。当你的geometry的SRID为4326的时候,st_buffer的第二个参数的含义是(🤮)。在你以点为圆心,5km为半径生成区域的时候,需要将5m转换为度。计算公式如:距离(米)= 度数 × 111.32千米,那5km对应的度数=5000/11132。(不算了,具体让SQL自己去算,省的有放大误差)。

SELECT ST_Buffer(ST_GeomFromText('POINT(121.31547880904075 31.191962005342543)'), 5000 / 111320);

MBContaine和St_containe的区别?
MBRContains和ST_Contains是MySQL中用于空间查询的两个函数,它们的功能类似,但存在一些区别。
MBRContains函数是MySQL提供的较早的空间查询函数,它接受一个矩形框和一个几何对象作为输入,并返回一个布尔值来指示矩形框是否包含该几何对象。MBRContains函数的计算基于几何对象的最小外接矩形(MBR),而不考虑几何对象的实际形状。
ST_Contains函数是MySQL提供的较新的空间查询函数,它接受两个几何对象作为输入,并返回一个布尔值来指示第一个几何对象是否包含第二个几何对象。与MBRContains函数不同,ST_Contains函数计算基于几何对象的实际形状,而不是最小外接矩形。
因此,ST_Contains函数通常比MBRContains函数更准确和更精细。如果您需要更精确的空间查询结果,则应该使用ST_Contains函数。但是,由于ST_Contains函数需要比MBRContains函数更多的计算和处理,因此在某些情况下可能会更慢。

select * from point_test
where ST_Contains(ST_Buffer(ST_GeomFromText('POINT(121.31547880904075 31.191962005342543)'), 5000 / 111320), coordinate)

执行报错

3643 - The SRID of the geometry does not match the SRID of the column ‘coordinate’. The SRID of the geometry is 0, but the SRID of the column is 4326. Consider changing the SRID of the geometry or the SRID property of the column

意思就是st_buffer生成的geometry的SRID为0,但point_test的coordinate的SRID为4326,两个标准不一样。那怎么半呢?

st_buffer函数有这样的说明:

The result is in the same SRS as the geometry argument.

即st_buffer函数返回的SRID和入参中的一致。

上述的版本基于MySQL 8.0.23。

事实证明,MySQL 8.0.23的st_buffer函数有bug,我换了最新的MySQL版本8.0.32,可以参考我的其它文章(docker安装mysql),就可以正常使用了。

下述的版本基于MySQL 8.0.32。
而且它返回的srid和目标srid是一致的。

select st_srid(st_buffer((select coordinate from point_test where id = 1), 5000));

这个查询也可以正常用了

SELECT ST_Buffer(st_geomFromText('point(121.71564763519164 31.062121772948835)', 4326, 'axis-order=long-lat'), 5000);
SELECT ST_Buffer(st_geomFromText('point(121.71564763519164 31.062121772948835)', 4326, 'axis-order=long-lat'), 5000);

注意:在MySQL 8.0.32中,st_buffer第二个参数的含义是

通过st_distance_sphere校验一下

select st_distance_sphere(st_geometryFromText('point(121.71564763519164 31.062121772948835)', 4326, 'axis-order=long-lat'), 
  st_geometryFromText('point(121.715700047596 31.1072192878852)', 4326, 'axis-order=long-lat'))
as distance;

发现结果是5014.624253057652,可以看到存于米级别的误差。

查询5000米之内的地址

select * from point_test
where MBRContains(ST_Buffer(ST_GeomFromText('POINT(121.31547880904075 31.191962005342543)', 4326,'axis-order=long-lat'), 5000), coordinate)

查看查询计划,发现也是走索引的

explain select * from point_test
where MBRContains(ST_Buffer(ST_GeomFromText('POINT(121.31547880904075 31.191962005342543)', 4326,'axis-order=long-lat'), 5000), coordinate)

加一个按照距离生序

select *, st_distance_sphere(ST_GeomFromText('POINT(121.31547880904075 31.191962005342543)', 4326,'axis-order=long-lat'), coordinate) as distance
from point_test
where MBRContains(ST_Buffer(ST_GeomFromText('POINT(121.31547880904075 31.191962005342543)', 4326,'axis-order=long-lat'), 5000), coordinate)
order by distance 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/417060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计组2.1——计算机中的数据

问题:数据如何在计算机中表示? 运算器如何进行数字运算和逻辑运算? 计组2.11.进制转化:2. BCD码3.字符和字符串1.ASCII2.汉字编码3.字符串4.奇偶校验码1. 校验原理3. 奇偶校验5.汉明码6.循环冗余校验码1.进制转化: #me…

【C语言】关于文件操作你知多少?

目录 一.引入 二. 什么是文件 2.1 什么是文件 2.2 程序文件 2.3 数据文件 2.4 文件名 三.文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 四.文件的顺序读写 4.1 函数汇总 4.2 printf/fprintf/sprintf 4.3 scanf/fscanf/sscanf 五. 文件的随机读写 5.1 引入 5.2 fsee…

HTML5 <ins> 标签、HTML5 <link> 标签

HTML5 <ins> 标签 实例 一段带有已删除部分和新插入部分的文本&#xff1a; <p>My favorite color is <del>blue</del> <ins>red</ins>!</p> 尝试一下 浏览器支持 所有主流浏览器都支持 <ins> 标签。 标签定义及使用说明 …

Sentry安装使用(最全最细)

Sentry安装使用(最全最细&#xff0c;包括解决邮箱发送问题&#xff0c;https上传问题&#xff0c;https访问问题&#xff0c;安装此教程配置即可) ##服务器操作系统为2核8G,CentOS7.9 ##安装Docker-ce yum install -y yum-utils \device-mapper-persistent-data \lvm2yum-c…

日撸 Java 三百行day27

文章目录说明day27 Hanoi 塔问题1.思路2.代码3.图示说明 闵老师的文章链接&#xff1a; 日撸 Java 三百行&#xff08;总述&#xff09;_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了github上维护&#xff1a;https://github.com/fulisha-ok/sampledata day27 Hanoi 塔…

部署LAMP架构和论坛

引言 LAMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整套系统和相关软件&#xff0c;能够提供动态Web站点服务及其应用开发环境。LAMP是一个缩写词&#xff0c;具体包括Linux操作系统、Apache网站服务器、MySQL数据库服务器、PHP&#xff08;或Perl、…

Win10,详细永久关闭更新方法(附图文)

一、服务设置 1.同时按下键盘 Win R&#xff0c;打开运行对话框&#xff0c;然后输入命令 services.msc &#xff0c;点击下方的“确定”打开服务。 2.找到 Windows Update 这一项&#xff0c;并双击打开。 3.停止该服务&#xff0c;启动类型设置为禁用 4.点击恢复&#…

webrtc入门系列(二)easy_webrtc_server 入门example测试

《webrtc入门系列&#xff08;一&#xff09;easy_webrtc_server 入门环境搭建》 《webrtc入门系列&#xff08;二&#xff09;easy_webrtc_server 入门example测试》 《webrtc入门系列&#xff08;三&#xff09;云服务器coturn环境搭建》 《webrtc入门系列&#xff08;四&…

好用的免费 PDF 密码删除工具有哪些?

被锁定在文档之外可能会令人沮丧&#xff0c;尤其是当唯一挡路的是一个讨厌的弹出窗口要求您输入密码时。 如果您创建了 PDF 文档或有权访问它&#xff0c;您可以尝试一些行之有效的技巧来删除密码保护。 例如&#xff0c;您可以使用网络浏览器或文档阅读器中的打印设置将 PD…

Windows权限提升—令牌窃取、UAC提权、进程注入等提权

Windows权限提升—令牌窃取、UNC提权、进程注入等提权1. 前言2. at本地命令提权2.1. 适用范围2.2. 命令使用2.3. 操作步骤2.3.1. 模拟提权2.3.2. at配合msf提权2.3.2.1. 生成木马文件2.3.2.2. 设置监听2.3.2.3. 设置反弹2.3.2.4. 查看反弹效果3. sc本地命令提权3.1. 适用范围3.…

QT在线换源安装

Win11上Pytorch的安装并在Pycharm上调用PyTorch最新超详细 网上资源越来越多&#xff0c;关于PyTorch的安装教程各式各样&#xff0c;下面我将详细介绍在安装过程中的操作步骤。 经过上述流程图的介绍我们心中对安装过程有了一个大致的轮廓。下面我将对每一步进行细致的说明 步…

深度分析Palantir的投资价值,Palantir2023年将实现强劲反弹?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 在本文中&#xff0c;猛兽财经将通过对Palantir的股票关键指标、商业模式、盈利能力、影响Palantir2023年股价的关键利好因素等方面&#xff0c;对Palantir进行全面、深度的分析。 Palantir股票的关键指标 自从Palantir(PL…

p74 应急响应-winlinux 分析后门勒索病毒攻击

数据来源 操作系统(windows,linux)应急响应&#xff1a; 常见危害&#xff1a;暴力破解&#xff0c;漏洞利用&#xff0c;流量攻击&#xff0c;木马控制(Webshell,PC 木马等)&#xff0c;病毒感染(挖矿&#xff0c;蠕虫&#xff0c;勒索等)常见分析&#xff1a;计算机账户&…

postman汉化教程

文章目录1. 下载对应版本的postman2.下载对应版本的汉化包2.1. github下载地址 : &#xff08;9.12.2&#xff09;2.2 百度网盘&#xff08;9.12.2&#xff09;3. 打开postman安装位置4. 压缩包解压到/resources目录下5. 重启postman即可汉化成中文了1. 下载对应版本的postman …

Runtime命令参数字符串和数组比较

问题 最近有个问题本地执行 ssh -p 8084 root10.224.122.51 \"ssh -p 22 root192.168.5.157 mkdir -p /opt/dw-release/pdld-admin\"程序执行总是报错&#xff1a; No such file or directory 但是直接在终端执行正常&#xff0c;这就很奇怪。肯定能推出是程序执行…

OSI七层网络模型与TCP/IP四层模型

一、OSI七层网络模型 OSI 七层模型 是国际标准化组织提出一个网络分层模型&#xff0c;其大体结构以及每一层提供的功能如下图所示&#xff1a; 但由于各方面原因&#xff0c;OSI 七层模型并没有被广泛应用&#xff0c;更多的是作为网络分层的一种基础理论模型。 二、TCP/IP…

Oauth2+vue前后端实现单点登录

Oauth2单点登录流程实现 oauth2-demo 介绍 这是一个基于spring cloud oauth2和vue实现的前后端分离的单点登录示例。示例代码:szile/oauth2-demo 后端服务 auth-server 认证服务 ,对应域名:auth.szile.com auth-client 资源服务,对应域名:client.szile.com 角色 浏览器…

肿瘤预测案例中应用自动特征选择

肿瘤预测案例中应用自动特征选择 描述 当特征数量比较多时&#xff0c;模型容易变得更复杂&#xff0c;过拟合的可能性也会增加。这时除了进行降维处理外&#xff0c;还可以通过自动化特征选择选出最重要的部分特征&#xff0c;抛弃对结果影响不大的特征&#xff0c;从而得到…

【创作赢红包】项目信息分析表

项目的背景和问题 项目背景&#xff1a; 很多父母都希望他们的孩子成为优秀的人&#xff0c;但是在实践中&#xff0c;他们的教育方式往往会出现一些与期望不符的情况。这可能是因为这些父母很大程度上是按照自己的父母的教育方式来教育孩子的&#xff0c;这导致一些不太好的…

思科ASA防火墙:控制防火墙不让访问指定网站

环境&#xff1a; 内网客户机&#xff1a;win10 思科asa防火墙 外网客户机&#xff1a;server 2016 win10可以通过域名访问网站 进入asa全局模式 access-list http permit tcp 192.168.6.0 255.255.255.0 any eq www access-list 名字 permit 协议 要被控制的网段 子网…