创建表格
当你创建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;
结果: