当前位置: 首页 > article >正文

MySQL 空间数据类型 GIS:地图功能的数据库实现

开场白做 LBS基于位置的服务的时候很多人直接用经纬度两个字段存然后算距离用公式在应用层算。数据量小的时候没问题数据一大每次查附近的人都要全表扫描算一遍距离性能根本扛不住。我之前做一个附近的门店查询功能10 万条门店数据每条都要算一遍距离再排序直接把接口拖到 5 秒以上。后来换成 MySQL 的空间数据类型和空间索引查询时间降到了 50 毫秒以内。空间数据类型MySQL 支持的空间数据类型类型说明示例GEOMETRY空间数据的基类可以存任何几何类型通用POINT点经纬度门店位置LINESTRING线一组有序的点路线POLYGON多边形封闭的区域商圈MULTIPOINT多个点-MULTILINESTRING多条线-MULTIPOLYGON多个多边形复杂区域GEOMETRYCOLLECTION混合集合-最常用的是 POINT 和 POLYGON。创建空间列CREATETABLEstores(idBIGINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(100),locationPOINTNOTNULLSRID4326,SPATIALINDEXidx_location(location));SRID 4326 是 WGS84 坐标系就是 GPS 用的经纬度坐标系。MySQL 8.0 开始支持指定 SRID不同 SRID 的空间数据不能互相计算。 ## 插入和查询空间数据 ### 插入数据 sql-- 用 ST_GeomFromText 插入INSERTINTOstores(name,location)VALUES(星巴克国贸店,ST_GeomFromText(POINT(116.461447 39.908714),4326));-- MySQL 8.0 推荐用 ST_PointINSERTINTOstores(name,location)VALUES(瑞幸望京店,ST_Point(116.480817,39.993378,4326));注意 POINT 的参数顺序是POINT(经度 纬度)即 X经度Y纬度。这个顺序和很多人习惯的纬度在前不一样搞反了距离计算会出问题。我之前就搞反过查出来的附近门店全都不对。 ### 查询坐标 sql-- 获取 WKT 格式SELECTid,name,ST_AsText(location)FROMstores;-- 获取经度和纬度SELECTid,name,ST_Longitude(location)ASlng,ST_Latitude(location)ASlatFROMstores;计算距离-- 计算两个点之间的距离米使用 WGS84 椭球体SELECTid,name,ST_Distance_Sphere(location,ST_Point(116.397128,39.916527,4326))ASdistanceFROMstoresORDERBYdistanceLIMIT10;ST_Distance_Sphere返回的是球面距离单位是米考虑了地球曲率比简单的勾股定理准确得多。 ### 查询范围内的点 sql-- 查询 5 公里内的门店SELECTid,name,ST_Distance_Sphere(location,ST_Point(116.397128,39.916527,4326))ASdistanceFROMstoresWHEREST_Contains(ST_Buffer(ST_Point(116.397128,39.916527,4326),5000),location)ORDERBYdistance;等等ST_Buffer 在经纬度坐标系下单位是度不是米5 公里不是 5000 度。正确做法是用 MBRTContains sql-- 先算 5km 对应的经纬度范围近似SETlat39.916527;SETlng116.397128;SETdistance5000;-- 5km-- 纬度方向 1 度约 111kmSETlat_deltadistance/111000;-- 经度方向 1 度约 111km * cos(纬度)SETlng_deltadistance/(111000*COS(RADIANS(lat)));-- 用矩形范围过滤SELECTid,name,ST_Distance_Sphere(location,ST_Point(lng,lat,4326))ASdistanceFROMstoresWHEREST_Longitude(location)BETWEENlng-lng_deltaANDlnglng_deltaANDST_Latitude(location)BETWEENlat-lat_deltaANDlatlat_deltaANDST_Distance_Sphere(location,ST_Point(lng,lat,4326))distanceORDERBYdistance;这个写法先用矩形粗筛走索引再用球面距离精筛兼顾性能和精度。 ## 空间索引 空间索引是 R-Tree 索引和 B-Tree 不一样专门用于空间数据的范围查询。 ### 创建空间索引 sql-- 建表时创建CREATETABLEstores(idBIGINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(100),locationPOINTNOTNULLSRID4326,SPATIALINDEXidx_location(location));-- 后续添加ALTERTABLEstoresADDSPATIALINDEXidx_location(location);空间索引的要求列必须声明为 NOT NULLMySQL 8.0 建议指定 SRID只能对单列建空间索引不支持复合空间索引的查询优化-- 使用 MBRContains 走空间索引SELECT*FROMstoresWHEREMBRContains(ST_GeomFromText(POLYGON((116.3 39.8, 116.5 39.8, 116.5 40.0, 116.3 40.0, 116.3 39.8)),4326),location);MBRContains 判断点是否在最小边界矩形MBR内走空间索引。ST_Contains 是精确判断但 8.0 之前不走索引。 实际开发中推荐组合使用先 MBRContains 粗筛走索引再 ST_Contains 或 ST_Distance_Sphere 精筛。 ## POLYGON 多边形操作 ### 存储商圈/区域 sqlCREATETABLEbusiness_districts(idBIGINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(100),areaPOLYGONNOTNULLSRID4326,SPATIALINDEXidx_area(area));-- 插入一个商圈区域国贸商圈简化为矩形INSERTINTObusiness_districts(name,area)VALUES(国贸商圈,ST_GeomFromText(POLYGON((116.44 39.89, 116.48 39.89, 116.48 39.92, 116.44 39.92, 116.44 39.89)),4326));POLYGON 的坐标必须首尾闭合第一个点和最后一个点要一样。 ### 查询点是否在区域内 sql-- 查询某个门店属于哪个商圈SELECTbd.nameFROMbusiness_districts bdWHEREST_Contains(bd.area,ST_Point(116.461447,39.908714,4326));查询区域内的所有门店SELECTs.id,s.nameFROMstores sJOINbusiness_districts bdONST_Contains(bd.area,s.location)WHEREbd.name国贸商圈;GeoJSON 支持MySQL 8.0MySQL 8.0 支持 GeoJSON 格式的导入导出-- GeoJSON 转内部格式INSERTINTOstores(name,location)VALUES(测试门店,ST_GeomFromGeoJSON({type:Point,coordinates:[116.461447,39.908714]}));-- 内部格式转 GeoJSONSELECTid,name,ST_AsGeoJSON(location)FROMstores;和前端地图组件高德、百度对接时特别方便前端直接用 GeoJSON 渲染。踩坑记录坑一POINT 参数顺序经度在前、纬度在后X, Y即POINT(lng, lat)。国内很多地图 API 是纬度在前搞反了距离计算全错。坑二SRID 不一致MySQL 8.0 要求计算的两个空间对象 SRID 必须一致否则报错ERROR 3516: SRID of geometry argument does not match SRID of function建表时统一指定 SRID 4326查询时也用 ST_Point(…, 4326) 传参。坑三空间索引不生效ST_Distance_Sphere 不会走空间索引它是对每一行计算距离。要先用 MBRContains 或矩形范围过滤减少计算量。坑四坐标精度丢失FLOAT 类型的经纬度精度不够约 10 米误差DOUBLE 或 DECIMAL(10,6) 才够用。MySQL 的 POINT 类型内部用 DOUBLE 存储精度没问题。小结空间数据类型比经纬度两列存更规范空间索引性能优势明显POINT 的参数顺序是经度在前、纬度在后ST_Distance_Sphere 算球面距离比勾股定理准确空间索引走 MBRContainsST_Distance_Sphere 不走索引附近查询的推荐模式矩形粗筛 球面距离精筛统一使用 SRID 4326避免 SRID 不一致报错相关阅读MySQL 官方文档 - Spatial Data TypesSpatial Function ReferenceOpenGIS 标准

相关文章:

MySQL 空间数据类型 GIS:地图功能的数据库实现

开场白 做 LBS(基于位置的服务)的时候,很多人直接用经纬度两个字段存,然后算距离用公式在应用层算。数据量小的时候没问题,数据一大,每次查附近的人都要全表扫描算一遍距离,性能根本扛不住。我…...

Stable Video vs. Runway ML vs. Kling:学习曲线强度TOP3工具横向测评(含GPU资源消耗比、提示词容错阈值、迭代收敛周期)

更多请点击: https://kaifayun.com 第一章:Stable Video vs. Runway ML vs. Kling:学习曲线强度TOP3工具横向测评(含GPU资源消耗比、提示词容错阈值、迭代收敛周期) 在生成式视频建模领域,Stable Video Di…...

揭秘ChatGPT脑筋急转弯生成底层逻辑:基于LLM推理链拆解+语义悖论建模,准确率提升67%(实测数据)

更多请点击: https://kaifayun.com 第一章:ChatGPT脑筋急转弯生成的范式跃迁 传统脑筋急转弯生成依赖人工规则库或模板填充,例如预设“谐音梗”“偷换概念”“歧义句式”等分类标签,再通过正则匹配与词性替换组合输出。而以ChatG…...

GetQzonehistory:3分钟学会永久保存QQ空间记忆的终极免费方案

GetQzonehistory:3分钟学会永久保存QQ空间记忆的终极免费方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾担心QQ空间里那些珍贵的青春记忆会随着时间流逝而消失…...

DeepL Chrome翻译插件:让高质量翻译触手可及

DeepL Chrome翻译插件:让高质量翻译触手可及 【免费下载链接】deepl-chrome-extension A DeepL Translator Chrome extension 项目地址: https://gitcode.com/gh_mirrors/de/deepl-chrome-extension 在信息爆炸的今天,我们每天都会接触到大量外文…...

ide-eval-resetter深度解析:JetBrains IDE试用期管理架构揭秘

ide-eval-resetter深度解析:JetBrains IDE试用期管理架构揭秘 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter ide-eval-resetter作为JetBrains IDE试用期重置的专业工具,通过分布式评估数据…...

慕课助手:让在线学习效率提升300%的开源浏览器插件

慕课助手:让在线学习效率提升300%的开源浏览器插件 【免费下载链接】mooc-assistant 慕课助手 浏览器插件(Chrome/Firefox/Opera) 项目地址: https://gitcode.com/gh_mirrors/mo/mooc-assistant 你是否曾因网课平台的机械重复操作浪费宝贵时间?根…...

解锁音乐自由:3分钟掌握QQ音乐加密音频无损解密技巧 [特殊字符]

解锁音乐自由:3分钟掌握QQ音乐加密音频无损解密技巧 🎵 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾为QQ音乐下载的歌曲只能在特定播放器…...

AI智能体:从概念到现实的技术演进与应用前景

AI智能体正渐渐从科幻概念转变成现实应用里的关键角色,这是随着人工智能技术的快速发展而出现的情况。按照2024年发布的报告来看,全球已经存在超过67%的企业其正在规划或者早已经部署了和AI智能体相关的项目,预计到2026年的时候,这…...

3步永久解密:让科学文库加密PDF重获自由的实用工具

3步永久解密:让科学文库加密PDF重获自由的实用工具 【免费下载链接】ScienceDecrypting 破解CAJViewer带有效期的文档,支持破解科学文库、标准全文数据库下载的文档。无损破解,保留文字和目录,解除有效期限制。 项目地址: https…...

Claude Code 与 AI 创业赚钱指南:从工具到印钞机的完整路径

一个高中生,零编程基础,养了 15 个 AI 员工,月成本不到 400 美元,年收入上万美元。一个独立开发者,花一小时用 AI 搓出 App,上架四小时登顶付费榜,入账 40 万。156 个 AI 创业项目,平…...

粒子滤波算法在非线性估计中的应用【附程序】

✨ 长期致力于非线性系统、参数估计、递归贝叶斯估计、粒子滤波算法、重采样、相关系数、谐波模型研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)基于…...

GNSS欺骗干扰检测算法与实验验证方法【附仿真】

✨ 长期致力于GNSS欺骗干扰检测、信号检测、伪距差分、捷联惯性导航、IMU信号生成、四元数、对偶四元数、惯性辅助、单星紧组合、欺骗干扰场景模拟研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,…...

2026年Java面试全指南(八股文+场景题)从原理到实战

前言我相信大多 Java 开发的程序员或多或少经历过 BAT 一些大厂的面试,也清楚一线互联网大厂 Java 面试是有一定难度的,小编经历过多次面试,有满意的也有备受打击的。因此呢小编想把自己这么多次面试经历以及近期的面试真题来个汇总分析&…...

JVM调优实战:从频繁Full GC到毫秒级响应的真实踩坑记录

前言 去年双十一大促前,我们的订单系统突然开始出现间歇性卡顿。起初以为是数据库慢查询,直到看了GC日志才发现问题远比想象中复杂。这篇文章记录的是我们从一个频繁Full GC、停顿时间超过3秒的系统,优化到平均停顿小于50ms的完整过程。 真…...

观察不同模型在相同任务下的Token消耗与成本差异

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 观察不同模型在相同任务下的Token消耗与成本差异 在构建基于大语言模型的应用程序时,除了模型的效果,调用成…...

WarcraftHelper终极指南:3大模块彻底解决魔兽争霸3兼容性问题

WarcraftHelper终极指南:3大模块彻底解决魔兽争霸3兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否还在为魔兽争霸3在Win…...

突破下载瓶颈:百度网盘Mac版SVIP加速完全指南

突破下载瓶颈:百度网盘Mac版SVIP加速完全指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 你是否曾因百度网盘Mac版的龟速下载而焦躁&am…...

DeepSeek-R1、V2、V3如何选?:3分钟掌握版本差异与业务匹配公式

更多请点击: https://kaifayun.com 第一章:DeepSeek-R1、V2、V3如何选?:3分钟掌握版本差异与业务匹配公式 DeepSeek-R1、V2、V3 是 DeepSeek 系列中面向不同推理场景演进的三个关键版本,其核心差异不在参数量堆叠&…...

揭秘Gemini ESG引擎底层逻辑:3大AI模型协同如何将人工撰写耗时压缩90%?

更多请点击: https://codechina.net 第一章:Gemini ESG报告生成的演进与价值定位 传统ESG(环境、社会与治理)报告编制长期依赖人工数据收集、跨部门协调与静态模板套用,平均耗时长达3–6个月,且易出现口径…...

在ubuntu开发机上体验taotoken分钟级接入多种大模型的过程

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在 Ubuntu 开发机上体验 Taotoken 分钟级接入多种大模型的过程 1. 准备工作与环境确认 在开始之前,我使用的是一台运行…...

DeepSeek工具调用能力深度评测(实测12类插件+8种LLM上下文窗口下的成功率与延迟数据)

更多请点击: https://kaifayun.com 第一章:DeepSeek工具调用能力概览与评测方法论 DeepSeek系列大模型(如DeepSeek-V2、DeepSeek-Coder)原生支持结构化工具调用(Tool Calling),其核心机制基于J…...

终极指南:用Whisky在Mac上免费运行Windows游戏与软件的完整方案

终极指南:用Whisky在Mac上免费运行Windows游戏与软件的完整方案 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 还在为Mac无法运行Windows专属软件而烦恼吗?W…...

Sora 2视频音频不同步?深度解析OpenAI未公开的时间戳嵌入机制,3分钟强制同步方案(含Python自动校准工具)

更多请点击: https://codechina.net 第一章:Sora 2视频音频不同步现象的系统性归因 视频与音频流在 Sora 2 模型推理及播放阶段出现时间偏移,是影响用户体验的关键缺陷。该现象并非单一环节导致,而是由多层级时序建模、硬件调度、…...

三分钟掌握roop-unleashed:零门槛AI换脸终极指南

三分钟掌握roop-unleashed:零门槛AI换脸终极指南 【免费下载链接】roop-unleashed Evolved Fork of roop with Web Server and lots of additions 项目地址: https://gitcode.com/gh_mirrors/ro/roop-unleashed 你是否想过将视频中的人物面孔轻松替换&#x…...

20岁写出Transformer的人,真开源了2180亿大模型

点击下方卡片,关注“CVer”公众号AI/CV重磅干货,第一时间送达点击进入—>【顶会/顶刊】投稿交流群添加微信号:CVer2233,小助手拉你进群!扫描下方二维码,加入CVer学术星球!可以获得最新顶会/顶…...

BilibiliDown深度评测:5大实用技巧让你轻松收藏B站优质内容

BilibiliDown深度评测:5大实用技巧让你轻松收藏B站优质内容 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirr…...

如何为《植物大战僵尸》实现终极宽屏补丁:3个关键技术解析

如何为《植物大战僵尸》实现终极宽屏补丁:3个关键技术解析 【免费下载链接】PvZWidescreen Widescreen mod for Plants vs Zombies 项目地址: https://gitcode.com/gh_mirrors/pv/PvZWidescreen 《植物大战僵尸》作为经典塔防游戏,在宽屏显示器上…...

Gemini SQL查询生成落地手册(企业级生产环境已验证)

更多请点击: https://kaifayun.com 第一章:Gemini SQL查询生成落地手册(企业级生产环境已验证) 在大型金融与电商客户的真实生产环境中,Gemini 模型已被成功集成至自助分析平台,日均稳定生成超 12,000 条符…...

SRWE:5分钟掌握Windows窗口任意调整的终极方案

SRWE:5分钟掌握Windows窗口任意调整的终极方案 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否曾经因为Windows应用程序的窗口限制而感到束手无策?想要截取超高分辨率的游戏画面却…...