mysql存储地理信息的方法
MySQL 存储地理信息通常使用 GEOMETRY
数据类型或其子类型(如 POINT
, LINESTRING
, POLYGON
等)。为了支持这些数据类型,MySQL 提供了 SPATIAL
索引,这允许我们执行高效的地理空间查询。
1. 创建支持地理信息的表
首先,我们需要一个包含 GEOMETRY
或其子类型列的表。以下是一个示例,展示如何创建一个包含 POINT
类型的表:
CREATE TABLE locations (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
position POINT NOT NULL,
SPATIAL INDEX(position) -- 为位置列创建空间索引
) ENGINE=InnoDB;
2. 插入地理信息数据
我们可以使用 GeomFromText()
或 PointFromText()
函数插入地理数据。以下是如何插入一个点的示例:
INSERT INTO locations (name, position)
VALUES ('Location A', GeomFromText('POINT(10 20)'));
-- 或者使用 PointFromText
INSERT INTO locations (name, position)
VALUES ('Location B', PointFromText('POINT(30 40)'));
3. 查询地理信息数据
我们可以使用 MBRContains()
, Distance_Sphere()
, ST_Distance_Sphere()
等函数来查询地理数据。以下是一些示例:
3.1查找指定矩形区域内的位置
-- 查找位置在 (0, 0) 到 (20, 20) 矩形区域内的所有位置
SELECT * FROM locations
WHERE MBRContains(
GeomFromText('POLYGON((0 0, 20 0, 20 20, 0 20, 0 0))'),
position
);
3.2查找距离特定点一定距离内的位置
注意:这里使用了 Distance_Sphere()
函数,它基于地球是完美球体的假设。对于更精确的计算,我们可以使用 ST_Distance_Sphere()
并指定地球半径。
-- 查找距离 (15, 15) 点 10 公里内的所有位置
-- 假设地球半径为 6371 公里(平均半径)
SELECT *, (6371 * acos(cos(radians(15))
* cos(radians(X(position)))
* cos(radians(Y(position)) - radians(15))
+ sin(radians(15))
* sin(radians(X(position))))) AS distance_km
FROM locations
HAVING distance_km < 10;
3.3使用 ST_Distance_Sphere()
查找距离
这是一个更精确的距离计算示例,它使用 ST_Distance_Sphere()
函数并指定地球的平均半径。
-- 查找距离 (15, 15) 点 10 公里内的所有位置
SELECT *, ST_Distance_Sphere(point(15, 15), position, 6371) AS distance_km
FROM locations
HAVING distance_km < 10;
注意:上述查询中的距离计算是基于 Haversine 公式的简化版本,它假设地球是一个完美的球体。在实际应用中,我们可能需要使用更复杂的算法来考虑地球的不规则形状。
此外,我们还可以使用 MySQL 的其他地理空间函数和操作符来执行更复杂的地理空间查询和操作。
4.查询地理信息进阶示例
我们可以探讨一个更复杂的示例,该示例涉及POLYGON
地理数据类型,并使用ST_Contains
函数来检查一个点是否位于多边形内部。同时,我们也会使用ST_Distance_Sphere
函数来计算点与多边形中心点的距离。
4.1创建表并插入数据
首先,我们创建一个包含POLYGON
列的表,并插入一些多边形数据。
CREATE TABLE polygons (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
shape POLYGON NOT NULL,
SPATIAL INDEX(shape)
) ENGINE=InnoDB;
INSERT INTO polygons (name, shape)
VALUES ('Polygon A', GeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))'));
INSERT INTO polygons (name, shape)
VALUES ('Polygon B', GeomFromText('POLYGON((20 20, 30 20, 30 30, 20 30, 20 20))'));
-- 创建一个包含点的表
CREATE TABLE points (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
position POINT NOT NULL,
SPATIAL INDEX(position)
) ENGINE=InnoDB;
INSERT INTO points (name, position)
VALUES ('Point 1', GeomFromText('POINT(5 5)'));
INSERT INTO points (name, position)
VALUES ('Point 2', GeomFromText('POINT(25 25)'));
4.2查询点是否在多边形内部,并计算距离
现在,我们可以编写一个查询来检查点是否位于多边形内部,并计算这些点与多边形中心点的距离。
-- 假设我们想要检查'Point 1'和'Point 2'是否分别位于'Polygon A'和'Polygon B'内部
-- 并计算它们与各自多边形中心点的距离
-- 首先,我们需要计算每个多边形的中心点
SET @polygonA_center = ST_Centroid(GeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))'));
SET @polygonB_center = ST_Centroid(GeomFromText('POLYGON((20 20, 30 20, 30 30, 20 30, 20 20))'));
-- 然后,我们可以使用这些中心点与点表中的点进行比较和距离计算
SELECT
p.name AS point_name,
p.position,
CASE
WHEN ST_Contains(pg.shape, p.position) THEN 'Inside'
ELSE 'Outside'
END AS location_status,
ST_Distance_Sphere(p.position, CASE pg.name WHEN 'Polygon A' THEN @polygonA_center ELSE @polygonB_center END, 6371) AS distance_km
FROM
points p
JOIN
polygons pg ON (
(p.name = 'Point 1' AND pg.name = 'Polygon A') OR
(p.name = 'Point 2' AND pg.name = 'Polygon B')
);
这个查询首先计算了两个多边形的中心点,并使用JOIN
语句将点表与多边形表连接起来。它使用ST_Contains
函数来检查点是否位于多边形内部,并使用ST_Distance_Sphere
函数来计算点与对应多边形中心点的距离(以公里为单位)。注意,我们使用了CASE
语句来根据点的名称选择正确的多边形中心点进行计算。
这个查询将返回每个点的名称、位置、是否在多边形内部的状态以及与对应多边形中心点的距离。
mysql存储地理信息的方法的更多相关文章
- Mysql存储引擎及选择方法
0x00 Mysql数据库常用存储引擎 Mysql数据库是一款开源的数据库,支持多种存储引擎的选择,比如目前最常用的存储引擎有:MyISAM,InnoDB,Memory等. MyISAM存储引擎 My ...
- Mysql存储引擎比较
Mysql作为一个开源的免费数据库,在平时项目当中会经常使用到,而在项目当中我们的着重点一般在设计使用数据库上而非mysql本身上,所以在提到mysql的存储引擎时,一般都不曾知道,这里经过网上相关文 ...
- MySQL存储引擎之Myisam和Innodb总结性梳理
Mysql有两种存储引擎:InnoDB与Myisam,下表是两种引擎的简单对比 MyISAM InnoDB 构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个 文件的名字以表的名字开始 ...
- MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述
MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述: 1.MySQL有多种存储引擎: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(Berk ...
- 【转】mysql存储引擎
http://www.cnblogs.com/kevingrace/p/5685355.html Mysql有两种存储引擎:InnoDB与Myisam,下表是两种引擎的简单对比 MyISAM In ...
- Mysql存储引擎之TokuDB以及它的数据结构Fractal tree(分形树)
在目前的Mysql数据库中,使用最广泛的是innodb存储引擎.innodb确实是个很不错的存储引擎,就连高性能Mysql里都说了,如果不是有什么很特别的要求,innodb就是最好的选择.当然,这偏文 ...
- 收缩Mysql的ibdata1文件大小方法
ibdata1是mysql数据库中一个数据文件了,你会发现它来越大了,下面我来介绍收缩Mysql的ibdata1文件大小方法 如果你有使用InnoDB来存储你的Mysql表,使用默认设置应该会碰到个非 ...
- Mysql存储引擎__笔记
Mysql存储引擎(表类型): Mysql数据库: 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以使存储器上一些文件的集合或者一些内存 数据的内存数据的集合. Mysql数据库是开放源代 ...
- MySQL存储引擎,优化,事务
1唯一约束unique和主键key的区别? 1.什么是数据的存储引擎? 存储引擎就是如何存储数据.如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在关系数据库中数 ...
- mysql建立数据库的方法
mysql建立数据库的方法 方法一:使用create mysql> create database roudy; Query OK, 1 row affected (0.00 sec) mysq ...
随机推荐
- 一文带你详细了解HarmonyOS折叠屏设计规范!
原文:https://mp.weixin.qq.com/s/G25IbfcX2Bq9s1IDPCELGw,点击链接查看更多技术内容. 随着新一代折叠屏手机HUAWEI Mate Xs 2发布,Harm ...
- Linux0.12内核源码解读(2)-Bootsect.S
大家好,我是呼噜噜,在上一篇文章聊聊x86计算机启动发生的事?我们了解了x86计算机启动过程,MBR.0x7c00是什么?其中当bios引导结束后,操作系统接过计算机的控制权后,发生了哪些事?本文将揭 ...
- sql 语句系列(字符串之裂开)[八百章之第十三章]
创建分割列表 一张表: 先查询出来的效果是这样的: mysql: select emp_copy.deptno,GROUP_CONCAT(emp_copy.emps SEPARATOR ',') fr ...
- react native 使用typescript
前言 TypeScript作为JavaScript的一个富类型扩展语言,深受代码风格严谨的前端开发者欢迎.但在react-native下,因为packager的配置困难,使用TypeScript一直是 ...
- 高云GOWIN下载出现No devices found咋办
在使用GOWIN下载器下载会出现该类问题 No devices found错误. 原因如下: A . Windows10 系统会出现下载器通道顺序错误,所以要确保在 A 通道上. B.有一些 USB ...
- js深浅复制(拷贝)
从两种数据类型说起 在js中,变量的类型可以大致分成两种:基本数据类型和引用数据类型,其中基本数据类型指的是简单的数据段,包括: Undefined Null Boolean Number Strin ...
- 力扣81(java&python)-搜索旋转排序数组 II(中等)
题目: 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 ...
- 在kubernetes集群中使用虚拟节点创建1万Pod-支持在线教育业务
使用虚拟节点提升k8s集群容量和弹性 在kubernetes集群中添加虚拟节点的方式已被非常多的客户普遍使用,基于虚拟节点可以极大提升集群的Pod容量和弹性,灵活动态的按需创建ECI Pod,免去集群 ...
- 持续定义Saas模式云数据仓库+实时搜索
简介: 本文由阿里云计算平台事业部 MaxCompute 产品经理孟硕为大家带来<持续定义Saas模式云数据仓库+实时搜索>的相关分享.以下是视频内容精华整理,主要包括以下三个部分:1.W ...
- 双11特刊 | 一文揭秘云数据库RDS如何顺滑应对流量洪峰
简介:从绿色低碳到硬核科技,看RDS如何用绿色科技助力2021"双11"? 双十一回顾 从平台到商家,再从物流到客户手中,云数据库RDS支撑着双11集团电商的在线业务.RDS首次 ...