数据库根据坐标查找附近的店铺

创建表格

当你创建MySQL表时,你要特别注意lat和lng属性。利用Google地图的当前缩放功能,您应该只需要小数点后六位数的精度。为了将表格所需的存储空间保持在最低限度,可以指定lat和lng属性是大小为(10,6)的浮点数。这将使字段在小数点后面存储6位数字,加上小数点前面的4位数字,例如-123.456789度。你的表还应该有一个id属性作为主键。

CREATE TABLE `markers` (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  `name` VARCHAR( 60 ) NOT NULL ,
  `address` VARCHAR( 80 ) NOT NULL ,
  `lat` FLOAT( 10, 6 ) NOT NULL ,
  `lng` FLOAT( 10, 6 ) NOT NULL
) ENGINE = MYISAM ;

填充表格

创建表后,是时候用数据填充它了。下面提供的样本数据是分散在美国各地的180个匹兹堡。在phpMyAdmin中,您可以使用IMPORT选项卡导入各种文件格式,包括CSV(以逗号分隔的值)。Microsoft Excel和Google Spreadsheets都导出为CSV格式,因此您可以通过导出/导入CSV文件轻松地将数据从电子表格传输到MySQL表格。

INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Frankie Johnnie & Luigo Too','939 W El Camino Real, Mountain View, CA','37.386339','-122.085823');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Amici\'s East Coast Pizzeria','790 Castro St, Mountain View, CA','37.38714','-122.083235');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Kapp\'s Pizza Bar & Grill','191 Castro St, Mountain View, CA','37.393885','-122.078916');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Round Table Pizza: Mountain View','570 N Shoreline Blvd, Mountain View, CA','37.402653','-122.079354');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Tony & Alba\'s Pizza & Pasta','619 Escuela Ave, Mountain View, CA','37.394011','-122.095528');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Oregano\'s Wood-Fired Pizza','4546 El Camino Real, Los Altos, CA','37.401724','-122.114646');

使用MySQL查找位置

要查找标记表中位于给定纬度/经度的某个半径范围内的位置,可以使用基于Haversine公式的SELECT语句。Haversine公式通常用于计算球体上两对坐标之间的大圆距离。维基百科给出了深入的数学解释,并且与编程有关的公式的讨论在Movable Type的网站上进行了很好的讨论。

以下是SQL语句,它将查找距离37,-122坐标25英里范围内最近的20个位置。它根据该行的纬度/经度和目标纬度/经度计算距离,然后仅请求距离值小于25的行,按距离排序整个查询,并将其限制为20个结果。要以公里而不是英里搜索,请用6371替换3959。

SELECT 
id, 
(
   3959 *
   acos(cos(radians(37)) * 
   cos(radians(lat)) * 
   cos(radians(lng) - 
   radians(-122)) + 
   sin(radians(37)) * 
   sin(radians(lat )))
) AS distance 
FROM markers 
HAVING distance < 25 
ORDER BY distance LIMIT 0, 20;

结果:

posted @ 2018-03-29 09:28  Roomed  阅读(553)  评论(0编辑  收藏  举报