公司最近做一个餐饮网站,需要根据访问者位置信息(经纬度坐标),搜索其附近餐厅
基本思路如下:
1、将餐厅位置(经纬度)存入数据库
2、获取访问者位置信息(经纬度坐标)
3、查询数据库得到距离访问者1000米范围内的餐厅
具体解决方案如下:
将餐厅位置(经纬度)存入数据库
Mysql支持一种空间数据类型Geometry,其可以存储几何空间数据
Geometry是一种基本类。它是一种抽象类。Geometry的可实例化子类限制为可在2维坐标空间中存在的0、1、2维几何对象。所有的可实例化几何类是这样定义的,从而使得几何类的实例从拓扑意义上讲是闭合的(也就是说,所有定义的几何类包含其边界)。
基本Geometry类具有关于Point、Curve、Surface和GeometryCollection的子类:
�Point表示0维对象。
�Curve表示1维对象,具有子类LineString,以及次级子类Line和LinearRing。
�Surface是为2维对象设计的,具有子类Polygon。
�GeometryCollection具有特殊的0维、1维和2维类集合,名为MultiPoint、MultiLineString和MultiPolygon,分别用于为对应的Points、LineStrings和Polygons集合进行几何建模。MultiCurve和MultiSurface是作为抽象超类引入的,它们归纳了用于处理Curves和Surfaces的集合接口。
Geometry、Curve、Surface、MultiCurve和MultiSurface定义为非实例化类。它们为其子类定义了公用方法集合,而且是为扩展而包含在内的。
Point、LineString、Polygon、GeometryCollection、MultiPoint、MultiLineString和MultiPolygon定义为可实例化类。
存储的数据格式:
文本(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)'));
|
--转自