空间函数理解
mysql 使用 point 类型保存几何图形数据,目前接触的场景是用于保存地址经纬度和地图网格边界数据。
当数据只保存一个经纬度数据,显示的就是一个点(下图所示)
当数据保存了多个经纬度数据,显示的就是一个网格,因为网格边界就是由多个经纬度组成(下图所示)
空间函数的基本操作
1)创建含地址坐标数据字段的表
CREATE TABLE `addr_example` (
`ADDR` varchar(122) DEFAULT null COMMENT '地址',
`LOCATION_BD` point DEFAULT NULL COMMENT '地址坐标'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2)ST_GeomFromText函数 插入地址坐标数据
INSERT INTO addr_example(ADDR, LOCATION_BD)VALUES('广东省广州市', ST_GeomFromText('POINT(113.27324 23.15792)'));
3)ST_WITHIN函数,比较两个地址坐标数据是否相等。相等返回 1 不相等返回 0 (如果是面:某几何值是否在空间上包含于另一个几何值内部)
select ST_WITHIN(ST_GeomFromText('POINT(113.27324 23.15792)'),LOCATION_BD) res from addr_example
4)查询地址坐标数据(空间函数类型返回)
select addr,location_bd from addr_example
空间函数类型返回 对应 java 对象
select addr,location_bd from addr_example
-- 空间函数类型返回 对应 java 对象
@TableName("addr_example")
public class GdGridBoundInfo extends BaseBean {
private String addr;
private GmpPolygon locationBd;
}
5)查询地址坐标数据(字符串类型返回)
select addr,st_AsText(location_bd) location_bd from addr_example
字符串类型返回 对应java 对象
@TableName("addr_example")
public class GdGridBoundInfo extends BaseBean {
private String addr;
private String locationBd;
}
6)查询地址经度和纬度
select st_x(location_bd) x,st_y(location_bd) y from addr_example
7)查询地址距离(单位米)
SELECT st_distance_sphere(ST_GeomFromText('POINT(113.27324 22.15792)'),location_bd) AS distant FROM addr_example;
8)查询一个点为圆心,方圆2000米内的数据
round函数说明:查询select round(1123.26723,1);结果: 1123.3
SELECT
st_x ( location_bd ) x,
st_y ( location_bd ) y,
round(( ST_DISTANCE_SPHERE (ST_GeomFromText('POINT(113.27324 22.15792)'), location_bd )), 1 ) AS distance
FROM
addr_example
HAVING
distance <=2000
更多空间函数操作参考:19.5.2. Geometry函数_MySQL 中文文档 (mysqlzh.com)