我正试图获取特定位置周围的经度和纬度。实际上我在mysql表中有一些记录(longitude and latitude
)。现在我想从桌子上取出那些应该有大约500米特定经度的经度和纬度。请查看代码,希望您能理解我的问题。
-------------------------------------
id | longitude | latitude
-------------------------------------
1 | 25.058036 | 55.133467
-------------------------------------
2 | 25.056986 | 55.135755
-------------------------------------
3 | 25.059163 | 55.135616
-------------------------------------
4 | 25.056860 | 55.132515
-------------------------------------
5 | 25.055683 | 55.134792
我想得到那些经度,纬度应该在500米左右的特定距离(25.057550, 55.134729
)。
$user_long= $_REQUEST['user_long']; // 25.057550
$user_lat= $_REQUEST['user_lat']; // 55.134729
Select * from location where .... (fetch record around 500 meters)
我搜索过它并找到了一些很好的haversine formula answer和Google Map With Php/Mysql,但我没有得到如何开发这种功能。我知道这个问题对某些人来说可能是愚蠢的,因为我没有添加我的代码,但相信我,我不知道我该怎么做以及我应该从哪里开始功能。如果有人就此功能指导我,我将不胜感激。
谢谢
答案 0 :(得分:1)
使用此查询
$query = "SELECT *,ROUND(1.609344*(((acos(sin((" . $latitude . "*pi()/180)) *
sin((`Latitude`*pi()/180))+cos((" . $latitude . "*pi()/180)) *
cos((`Latitude`*pi()/180)) * cos(((" . $longitude . "- `Longitude`)*
pi()/180))))*180/pi())*60*1.1515
),2) as distance
FROM `table` HAVING distance<=" . MAX_DISTANCE . " ";
其中$ latitude是用户纬度,$经度是用户经度,MAX_DISTANCE是你希望以km为单位得到的最大距离。
答案 1 :(得分:1)
SELECT *,3956*2*ASIN(SQRT(POWER(SIN((19.286558 - latitude)*pi()/180/2),2)+COS(19.286558 * pi()/180)
*COS(latitude * pi()/180)*POWER(SIN((-99.612494 -longitude)* pi()/180/2),2)))
as distance FROM table having distance < 10 ORDER BY distance;
这将为您提供10公里范围内的记录。 在having子句中修改500米的查询。
答案 2 :(得分:0)
试试这个
SELECT *,
(6371*acos(cos(radians(" . $user_lat ."))*cos(radians(`latitude`))*cos(radians(`longitude`)-radians(" . $user_long . "))+sin(radians(" . $user_lat . "))*sin(radians(`latitude`)))) AS distance
FROM `location` WHERE `distance` < '0.5' ORDER BY `distance` ASC
其中0.5以km为单位
答案 3 :(得分:0)
如果自定义实现的hasrsine公式的性能对你来说太慢了,而你不介意使用MySQL 5.7.6+,那么你可以利用内置的ST_Distance_Sphere
函数,它可以是比定制实施的计算半胱氨酸的程序快20倍。您可以在此blogpost中查看基准和例程。此外,如果您不介意将位置存储为Point
几何对象,则还可以利用空间索引。您也可以先根据边界框({{3}}末尾的示例)预先过滤位置,这也可以加快查询速度。