谷歌的解决方案:
创建表格
在创建 MySQL 表时,需要特别注意 lat 和 lng 属性。使用 Google 地图当前的缩放功能,您应该只需要小数点后 6 位的精度。为了将表所需的存储空间保持在最低限度,您可以将 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 电子表格都导出为 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 公式通常用于计算球体上两对坐标之间的大圆距离。 Wikipedia 给出了深入的数学解释,并且在 Movable Type 的网站上对与编程相关的公式进行了很好的讨论。
下面的 SQL 语句将查找距离 37, -122 坐标 25 英里半径范围内最近的 20 个位置。它根据该行的纬度/经度和目标纬度/经度计算距离,然后仅询问距离值小于 25 的行,按距离对整个查询进行排序,并将其限制为 20 个结果。要按公里而不是英里搜索,请将 3959 替换为 6371。
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 < 28
ORDER BY distance LIMIT 0, 20;
这个是求28英里以内的经纬度。
另一种方法是在 28 到 29 英里的距离内找到它们:
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 < 29 and distance > 28
ORDER BY distance LIMIT 0, 20;
https://developers.google.com/maps/articles/phpsqlsearch_v3#creating-the-map