“MySQL中的空间索引技术深度解析:利用Spatial Key优化地理空间数据查询“

news2024/11/23 10:35:10

目录

简介

空间数据类型

GEOMETRY(抽象基类)

POINT

LINESTRING

POLYGON

MULTIPOINT

MULTILINESTRING

MULTIPOLYGON

GEOMETRYCOLLECTION

总结

函数

ST_GeomFromText()

ST_X

ST_Y

ST_AsText

空间函数

总结

坐标系

WGS 84坐标系(EPSG:4326)(默认/常用)

Web Mercator Projection (EPSG:3857)

China Geodetic Coordinate System 2000 (CGCS2000) / EPSG:4490

UTM (Universal Transverse Mercator) 系统

State Plane Coordinate System (SPCS)

British National Grid (BNG) / EPSG:27700

European Terrestrial Reference System 1989 (ETRS89) / EPSG:4258

Pulkovo 1942 / EPSG:4284

空间索引

创建一个有空间列的表

添加空间索引

给表中插入不同子数据类型的数据

注意事项


简介

MySQL中的空间索引是一种针对空间数据类型的特殊索引,主要用于优化地理空间数据的查询性能。这类索引主要应用于存储几何对象如点、线、面、多边形等数据类型的列上,比如POINT, LINESTRING, POLYGON, 和 GEOMETRY等。空间索引利用R-Tree或其变种等数据结构来组织空间数据,使得数据库能高效地执行包含空间运算的SQL语句,如查找某个区域内的所有点、计算两个几何对象之间的距离、判断一个对象是否包含在另一个对象中等空间查询操作。通过使用空间索引,MySQL能够大幅度减少在大数据集上进行复杂空间分析和位置相关查询所需的时间,特别适用于地理信息系统(GIS)、位置服务、地图应用等领域。

空间数据类型

GEOMETRY(抽象基类)

虽然我们不直接创建GEOMETRY类型的列作为空间索引,但它作为所有空间数据类型的基类,理解其概念是基础。比如,在设计数据库时,可以声明一个表的某一列为GEOMETRY类型,但实际上会具体到POINT、LINESTRING等子类型。

POINT

POINT:用于存储点的坐标。

POINT(15 20)

LINESTRING

用于存储线段,可以由一个或多个点组成。

LINESTRING(0 0, 10 10, 20 25, 50 60)

POLYGON

用于存储多边形,即闭合的线段,带一个外环, 一个内环。

POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))

MULTIPOINT

用于存储多个点的集合。

MULTIPOINT(0 0, 20 20, 60 60)

MULTILINESTRING

用于存储多条线段的集合,多个LineString值。

MULTILINESTRING((10 10, 20 20), (15 15, 30 15))

MULTIPOLYGON

用于存储多个多边形的集合,多个 Polygon值。

MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))

GEOMETRYCOLLECTION

用于存储多种类型的空间对象的集合,比如由两个组成 Point值和一个 LineString

GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))

总结

官方文档:

MySQL :: MySQL 8.0 Reference Manual :: 13.4.3 Supported Spatial Data Formats

函数

ST_GeomFromText()

ST_GeomFromText() 是一个在许多数据库系统中用于处理地理空间数据的功能函数,尤其是在PostGIS(PostgreSQL的扩展)中广泛使用。这个函数的主要目的是将一个表示几何对象的Well-Known Text (WKT)格式的字符串转换为数据库内部的二进制几何类型,以便于进行空间分析和查询。

基本语法:

ST_GeomFromText(text WKT[, integer srid])

ST_X

这个函数用于从一个点几何对象中提取经度坐标(x坐标),即点在水平方向的位置。在地理坐标系统中,这通常指的是经度值。

基本语法:

  ST_X(point)

ST_Y

相对地,这个函数用于从同一个点几何对象中提取纬度坐标(y坐标),即点在垂直方向的位置。在地理坐标系统中,这对应于纬度值。

基本语法:

ST_Y(point)

ST_AsText

将点转换为Well-Known Text (WKT)格式的字符串表示,这个函数在上面提到的几种数据类型中是通用的

基本语法:

ST_AsText(point)

空间函数

  • ST_Contains: 判断一个几何对象是否包含另一个几何对象。
  • ST_Distance: 计算两个几何对象之间的距离。
  • ST_Buffer: 根据给定的距离,在几何对象周围创建一个缓冲区。
  • ST_Intersection: 计算两个几何对象的交集。
  • ST_Union: 计算多个几何对象的并集。

总结

上面介绍的函数是常用的,下面的这些函数(针对不同的数据类型)用到的比较少

  • ST_StartPoint(line):返回线段的起始点。
  • ST_EndPoint(line):返回线段的终点。
  • ST_NumPoints(line):返回线段中的点数。
  • ST_PointN(line, n):返回线段中的第n个点。
  • ST_Area(poly):计算多边形的面积。
  • ST_Centroid(poly):计算多边形的质心。
  • ST_Perimeter(poly):计算多边形的周长。
  • ST_NumGeometries(multipoint):返回多点集合中的点数。
  • ST_GeometryN(multipoint, n):返回多点集合中的第n个几何对象。
  • 类似于MULTIPOINT,使用ST_NumGeometries()ST_GeometryN()等函数来访问和操作其中的线段。
  • 同样使用ST_NumGeometries()ST_GeometryN()等函数来操作多边形集合中的每个多边形。
  • ST_NumGeometries(collection):返回集合中的几何对象数量。
  • ST_GeometryN(collection, n):返回集合中的第n个几何对象。

坐标系

WGS 84坐标系(EPSG:4326)(默认/常用)

  • 经度(Longitude):从本初子午线(通过英国格林尼治的经线)向东或向西测量的角度,范围从-180°到+180°。
  • 纬度(Latitude):从赤道测量到南北极点的角度,范围从-90°(南极)到+90°(北极)。

官方文档:

MySQL :: MySQL 8.0 Reference Manual :: 13.4.5 Spatial Reference System Support

Web Mercator Projection (EPSG:3857)

这是网络地图服务中广泛使用的一种投影方式,如Google Maps、OpenStreetMap等。它基于墨卡托投影,适用于快速显示和可视化,但高纬度地区会有较大形变。

China Geodetic Coordinate System 2000 (CGCS2000) / EPSG:4490

中国自有的大地坐标系统,类似于WGS 84,但有自己定义的参考框架,适用于中国地区的高精度测量和制图。

UTM (Universal Transverse Mercator) 系统

UTM是一种全球分带的墨卡托投影坐标系统,将地球分为60个6度带,每个带都有自己的坐标系,常用于军事、航空、地形图等领域,便于局部地区的高精度测量和制图。EPSG代码根据具体的带号和北/南半球有所不同。

State Plane Coordinate System (SPCS)

美国的一种坐标参考系统,分为多个区域,旨在提供美国境内更精确的测量和制图,包括两种投影类型:横轴墨卡托和兰伯特锥形。每个州或区域有特定的EPSG代码。

British National Grid (BNG) / EPSG:27700

英国使用的一种坐标系,基于Transverse Mercator投影,适用于英国及周边岛屿的测量和地图制作。

European Terrestrial Reference System 1989 (ETRS89) / EPSG:4258

为欧洲设计的一种地心坐标参考系统,与WGS 84非常接近但在欧洲大陆内部提供了更高的长期稳定性,适用于欧洲的地理信息系统和测量工作。

Pulkovo 1942 / EPSG:4284

旧苏联及一些东欧国家曾经使用的坐标系,基于普尔科沃天文台的地理位置。

空间索引

创建一个有空间列的表

CREATE TABLE `places` (                                                             
             `id` int NOT NULL AUTO_INCREMENT,                                                 
             `name` varchar(255) DEFAULT NULL,                                                 
             `location` geometry NOT NULL SRID 4326                               
              PRIMARY KEY (`id`)                                                                
            ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ;

添加空间索引

alter table places add spatial spatial_index(location);

看到这里可能有人会问了,为什么不在创建表的时候就创建号空间索引,要在后面单独添加那,这是因为空间索引不能和其他的索引在创建表的同时创建,因为使用的数据结构不一样

给表中插入不同子数据类型的数据

INSERT INTO places (name, location) VALUES ('Place A', ST_GeomFromText('POINT(1 1) ', 4326));
INSERT INTO places (name, location) VALUES ('Place B', ST_GeomFromText('LINESTRING(1 1,2 2,3 3))', 4326));
INSERT INTO places (name, location) VALUES ('Place C', ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5)) ', 4326));
INSERT INTO places (name, location) VALUES ('Place D', ST_GeomFromText('MULTIPOINT((0 0),(20 20),(60 60)) ', 4326));
INSERT INTO places (name, location) VALUES ('Place E', ST_GeomFromText('MULTILINESTRING((10 10,20 20),(15 15,30 15)) , 4326));
INSERT INTO places (name, location) VALUES ('Place F', ST_GeomFromText('GEOMETRYCOLLECTION(POINT(10 10),POINT(30 30),LINESTRING(15 15,20 20))', 4326));
INSERT INTO places (name, location) VALUES ('Beijing', ST_GeomFromText('POINT(39.9042 116.4074) ', 4326));

注意事项

  1. 空间列必须是NOT NULL
  2. spatial key不可以和no spatial key一起创建
  3. 创建空间列的时候需要指定SRID,不然MySQL优化器不会使用索引, 官方文档:

MySQL :: MySQL 8.4 Reference Manual :: 13.4.10 Creating Spatial Indexes

  1. point数据类型是按(纬度,经度)存储的,和WGS 84(经度,纬度)相反
  2. 插入数据的时候指定的SRID必须和创建表的时候指定的SRID是一致的,官方文档:

MySQL :: MySQL 8.0 Reference Manual :: 10.3.3 SPATIAL Index Optimization

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

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

相关文章

03 LVS+Keepalived群集

3.1 Keepalived 双机热备基础知识 Keepalived 起初是专门针对 LVS 设计的一款强大的辅助工具,主要用来提供故障切换(Failover)和健康检査(HealthChecking)功能--判断LVS 负载调度器、节点服务器的可用性,当 master 主机出现故障及时切换到 backup 节点保…

(二十二)【Jmeter】深入刨析监听器:常用监听器常用使用场景、优缺点及操作实例

简述 在Jmeter中,监听器(Listener)是一个重要的组件,用于收集和显示测试结果。监听器的作用包括: 收集测试结果:监听器可以实时收集JMeter测试执行过程中的数据,包括请求和响应的各种信息。显示测试结果:监听器可以将收集到的测试结果以不同的方式展示出来,例如以树状…

【第七节】python多线程及网络编程

目录 一、python多线程 1.1 多线程的作用 1.2 python中的 threading 模块 1.3 线程锁 二、python网络编程 2.1 通过socket访问网络 2.2 python2.x中的编码问题 2.3 python3的编码问题 一、python多线程 1.1 多线程的作用 多线程技术在计算机编程中扮演着重要的角色&a…

五大避坑要点,让你轻松避开99%的雷区!随身wifi京东口碑排行榜,随身wifi推荐第一名!

在数字浪潮中,随身WiFi成为我们不可或缺的伴侣,但市场纷繁复杂,如何挑选成为难题。以下五大避坑要点,让你轻松避开99%的雷区! 1.避小就大,信赖旗舰店:远离无名小品牌,选择知名品牌的…

Javacript 高级程序设计(系统学习)

以下为阅读 《Javacript 高级程序设计》部分笔记,待继续完善,后续会进行章节拆分。 第1章 什么是 javascript 历史回顾js 实现 / es / dom / bomjs 版本 javascript 最初为什么设计为单线程? JavaScript 最初设计为单线程的主要原因是出于简…

体验 Whisper ,本地离线部署自己的 ASR 语音识别服务

需求背景 最近看视频,过几天后经常忘记内容,所以有了把重点内容总结提炼到自己知识库的需求,这涉及到了提取视频中的音频数据、离线语音识别等功能。 提取视频中的音频数据,可以使用格式工厂或 FFmpeg 等工具, FFmpe…

详细解析socket

我最近开了几个专栏,诚信互三! > |||《算法专栏》::刷题教程来自网站《代码随想录》。||| > |||《C专栏》::记录我学习C的经历,看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

书生大模型实战营第三期——入门岛——Git基础知识

第三关:Git基础知识 任务如下: 任务描述 破冰活动:自我介绍 每位参与者提交一份自我介绍。 提交地址:GitHub - InternLM/Tutorial: LLM&VLM Tutorial 的 camp3 分支~实践项目:构建个人项目 创建一个个人…

PDF发票解析并将信息回填到前端(2)前端页面

本人前端基础薄弱,此处的前端仅仅是一个练习展示 1. 创建一个前端项目 打开终端使用以下命令创建一个基于webpack模板的新项目 vue init webpack my-project输入命令之后一直点击enter知道项目创建完成即可 进入项目,安装并运行 $ cd my-project //…

ExtJS生成日历组件

文章目录 1.添加日历组件代码2.引入日历组件,创建了补签和取消签到,以及翻页显示的事件 1.添加日历组件代码 首先找到自己项目中对应的Ext的目录,并将日历组件添加到calendar这个目录下,我的是KwDatePicker.js 日历组件代码如下: Ext.define(Ext.calendar.KwDatePicker, {ex…

python six模块是什么

six模块是Python2和3兼容性库,它是为了解决Python2和Python3代码兼容性而产生的,众所周知Python2和Python3版本的分裂给Python开发者们带来了很大的烦恼,为了使代码同时兼容两个版本,往往要增加大量的代码,典型的就有u…

著名人工智能新经济数字经济新能源新质生产力讲师培训师教授专家唐兴通分享人工智能社会学商业模式创新人工智能就业工作与教育学习出海跨境数字化转型数字营销数字销售

添加图片注释,不超过 140 字(可选) 2024 年是人工智能在工作中真正应用的一年。根据微软和领英进行的调查(2024年5月),在过去六个月中,生成式人工智能的使用量几乎翻了一番,全球75%的…

领夹麦克风哪个品牌音质最好?八月领夹式麦克风排行榜

随着移动互联技术的飞速发展,视频内容的消费与创作正以前所未有的速度增长。从直播带货的兴起,到短视频平台的火爆,音频质量作为内容体验的重要组成部分,越来越受到创作者的重视。在这一背景下,无线领夹麦克风凭借其小…

6-8 残差网络(ResNet)

随着我们设计越来越深的网络,深刻理解“新添加的层如何提升神经网络的性能”变得至关重要。更重要的是设计网络的能力,在这种网络中,添加层会使网络更具表现力, 为了取得质的突破,我们需要一些数学基础知识。 残差网络…

Web端高效元件库——高端元件,匠心设计

原型设计,不仅是产品从构想到落地不可或缺的桥梁,更是深化用户体验优化策略的核心环节。Axure,作为原型设计领域的领航者,凭借其卓越的交互设计引擎与无与伦比的灵活性,赢得了产品设计师们的广泛赞誉,成为他…

NiFi :1 初识这把“十年一剑”的利器

--->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<--- “现在AI和数据处理密不可分&#xff0c;80%的企业可以利用Apache NiFi轻松解决复杂的数据问题&#xff0c;快速完成场景建设。犹如花上百来块钱在家享受一顿不亚于五星级西餐厅的法式大餐。对…

非负数、0和正数 限制最大值且保留两位小数在elementpuls表单中正则验证

一、结构 <el-form-item label="单价:" prop="price"><el-inputv-model.trim="formData.price"placeholder="请输入"@blur="formMethod.fixTwo"><template #append>(元)</template></el-input…

电源芯片测试系统NSAT2000对比传统ATE测试软件有哪些优势?

随着近几年电源芯片的研究和发展&#xff0c;电源芯片向着高度的集成化、智能化的趋势发展&#xff0c;电源芯片想不过去有了更全面的功能&#xff0c;更稳定可靠的优势。相应的市场中电源芯片的测试系统同样也百花齐放&#xff0c;各类ATE测试软件层出不穷。其中纳米软件的NSA…

系统出现高CPU可能风险因素整理

文章目录 死循环无限递归序列化加解密正则表达式计算密集型任务大流量Full GC资源竞争/死锁I/O阻塞外部接口调用 死循环 死循环是最常见的原因之一。当代码中存在无穷循环&#xff08;例如在多线程环境下的HashMap线程不安全问题或分页查询条件不明确导致的无限循环&#xff0…

C++分析红黑树

目录 红黑树介绍 红黑树的性质与平衡控制关系 红黑树节点的插入 情况1&#xff1a;不需要调整 情况2&#xff1a;uncle节点为红色 情况3&#xff1a;uncle节点为黑色 总结与代码实现 红黑树的删除&#xff08;待实现&#xff09; 红黑树的效率 红黑树介绍 红黑树是第二种平衡二…