Mysql中空间扩展 - 查询你附近的餐厅或酒店

来源:互联网 发布:windows loader v2.5 编辑:程序博客网 时间:2024/04/27 20:30

公司最近做一个餐饮网站,需要根据访问者位置信息(经纬度坐标),搜索其附近餐厅


基本思路如下:

1、将餐厅位置(经纬度)存入数据库

2、获取访问者位置信息(经纬度坐标)

3、查询数据库得到距离访问者1000米范围内的餐厅


具体解决方案如下:


1、将餐厅位置(经纬度)存入数据库


Mysql支持一种空间数据类型 Geometry,其可以存储几何空间数据

Geometry是一种基本类。它是一种抽象类。Geometry的可实例化子类限制为可在2维坐标空间中存在的012维几何对象。所有的可实例化几何类是这样定义的,从而使得几何类的实例从拓扑意义上讲是闭合的(也就是说,所有定义的几何类包含其边界)。

基本Geometry类具有关于PointCurveSurfaceGeometryCollection的子类:

·        Point表示0维对象。

·        Curve表示1维对象,具有子类LineString,以及次级子类LineLinearRing

·        Surface是为2维对象设计的,具有子类Polygon

·        GeometryCollection具有特殊的0维、1维和2维类集合,名为MultiPointMultiLineStringMultiPolygon,分别用于为对应的PointsLineStringsPolygons集合进行几何建模。MultiCurveMultiSurface是作为抽象超类引入的,它们归纳了用于处理CurvesSurfaces的集合接口。

GeometryCurveSurfaceMultiCurveMultiSurface定义为非实例化类。它们为其子类定义了公用方法集合,而且是为扩展而包含在内的。

PointLineStringPolygonGeometryCollectionMultiPointMultiLineStringMultiPolygon定义为可实例化类。

存储的数据格式:

文本(WTK)格式

如:POINT(15 20)

二进制(WKB)格式

例如,与POINT(1 1)对应的WKB值由下述21字节序列构成(在此,每个字节由2个十六进制数值表示):
0101000000000000000000F03F000000000000F03F


首先我们创建一张shop表

mysql> CREATE TABLE `shop`(        `shopid` int(11) NOT NULL AUTO_INCREMENT,        `latlng` geometry DEFAULT NULL,        PRIMARY KEY (`shopid`)       ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

然后将餐厅的维度和经度信息存入数据库,存成POINT类数据

mysql> insert into shop(latlng) values(GeomFromText('POINT(31.2689 120.275)'));







参考地址:http://dev.mysql.com/doc/refman/5.1/zh/spatial-extensions-in-mysql.html