我试图使用谷歌地理编码API与MySQL找到最近的地方,但它显示所有行的相同距离,不知道为什么我也遵循了google provided code中的相同步骤
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;
我发现了问题,这个解决方案对我有用https://github.com/rugbyprof/5443-Spatial-Database/blob/master/Mysql_Haversine_Distance.md
答案 0 :(得分:0)
这是一个MySQL函数,它将采用两个纬度/经度对,并给出两点之间的度数距离。 它使用Haversine公式计算距离。由于地球不是一个完美的球体,因此附近有一些误差 两极和赤道。
SQL函数:
DELIMITER $$
CREATE FUNCTION `haversine`(
lat1 FLOAT, lon1 FLOAT,
lat2 FLOAT, lon2 FLOAT
) RETURNS float
NO SQL
DETERMINISTIC
COMMENT 'Returns the distance in degrees on the Earth between two known points of latitude and longitude. To get miles, multiply by 3961, and km by 6373'
BEGIN
RETURN DEGREES(ACOS(
COS(RADIANS(lat1)) *
COS(RADIANS(lat2)) *
COS(RADIANS(lon2) - RADIANS(lon1)) +
SIN(RADIANS(lat1)) * SIN(RADIANS(lat2))
));
END;
$$
DELIMITER ;
使用FLOAT类型(10,6)将列添加到地址表中以获取纬度和经度。 编写一个php脚本,以便在保存记录时查找lat / long。
然后,您可以对表进行选择以获取具有距离的地址列表。你甚至可以排序 距离的结果,或将结果限制在参考位置的某个半径。
SELECT
`street`,
`city`,
`state`,
`zip`,
(haversine($ref_location_lat,$ref_location_long,`lat`,`long) * 3961) as `distance`
FROM `address_table`
WHERE (haversine($ref_location_lat,$ref_location_long,`lat`,`long) * 3961) < 300 // Example for limiting returned records to a raduis of 300 miles.
ORDER BY haversine($ref_location_lat,$ref_location_long,`lat`,`long) DESC; // Don't need actual distance for sorting, just relative distance.