空间类型是建立在空间类型字段上的。
空间类型
MySQL的空间类型很多,我就不逐一介绍了。重要分四大类:
- Geometry
- Curve
- Surface
- GeometryCollection
前三种,地理、曲线、曲面都是不可实例化的。Geometry有一个子类Point, Curve有一个直接子类LineString,而Surface也只有一个子类Polygon.当然从广义上讲,Cureve, Sureface,GeometryCollection都是Geometry的子类。
SRID
对于空间类型字段来说,一个非常重要的属性是SRID,SRID 0代表平面笛卡尔坐标系。此外4326代表地球经纬度类型,也是非常常用的,要表示经纬度,记住4326就行。
建表测试
有了前面的知识,我们就可以开始建表测试了。空间索引要求字段非空,所以定义时需要定义not null字段。以下是SQL:
create table city (
id integer primary key auto_increment,
position point not null srid 4326 comment '位置',
spatial index position_index(position)
) comment '城市';
因为数据定义时是地球表面的坐标系,所以需要用ST_SRID函数指定SRID为4326.
insert into city(name, position) VALUE
('北京', ST_SRID(point(116.3912757 ,39.906217),4326) );
查询就是比较痛苦了,代码特别长,这种代码还是用java或Python等语言生成才好:
select name, st_astext(position) from city where MBRCONTAINS(
st_srid(ST_GEOMETRYFROMTEXT('polygon((100 20, 120 20, 120 40, 100 40, 100 20))'),4326),
st_srid(position, 4326))
查询结果如下:
索引
那么命中了索引吗?
毫无疑问,是没命中索引的,我也不知道是什么原因啊,还需要继续研究。