Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 找到地理坐标附近的地方_Php_Mysql_Geolocation - Fatal编程技术网

Php 找到地理坐标附近的地方

Php 找到地理坐标附近的地方,php,mysql,geolocation,Php,Mysql,Geolocation,我有一个数据库,里面有地理坐标(DB 2),比如45.062792、8.892737,还有一个数据库有其他坐标(DB 1) 我想使用db1的一个坐标,然后我想在用户给定的半径内(比如10km,5km,500mt)计算db2中所有在先前给定半径内的行 我想计算所有没有(例如)谷歌地图或其他在线地图的结果,因为使用有限制,我希望能够在我的服务器上通过php代码管理结果。使用Haversine公式,使用lat/long坐标和半径作为输入。(我假设坐标存储为单独的lat和lon列) 您的查询大致如下所示

我有一个数据库,里面有地理坐标(DB 2),比如45.062792、8.892737,还有一个数据库有其他坐标(DB 1)

我想使用db1的一个坐标,然后我想在用户给定的半径内(比如10km,5km,500mt)计算db2中所有在先前给定半径内的行


我想计算所有没有(例如)谷歌地图或其他在线地图的结果,因为使用有限制,我希望能够在我的服务器上通过php代码管理结果。

使用Haversine公式,使用lat/long坐标和半径作为输入。(我假设坐标存储为单独的lat和lon列)

您的查询大致如下所示:

SELECT *, 3956 * 2 * ASIN(SQRT(POWER(SIN((@orig_lat - abs(tablename.lat)) * pi()/180 / 2),2) + COS(@orig_lat * pi()/180 ) * COS( 
abs
(tablename.lat) *  pi()/180) * POWER(SIN((@orig_lon – tablename.lon) *  pi()/180 / 2), 2) ))
as distance
FROM tablename
HAVING distance < @radius
ORDER BY distance 
LIMIT 10;
SELECT*,3956*2*ASIN(SQRT(功率(SIN(@orig_lat-abs(tablename.lat))*pi()/180/2),2)+COS(@orig_lat*pi()/180)*COS(
防抱死制动系统
(tablename.lat)*pi()/180)*POWER(SIN((@orig_lon–tablename.lon)*pi()/180/2),2)))
作为距离
从表名
距离小于半径
按距离排序
限制10;
将@orig_lat替换为给定的lat值,将@orig_lon替换为给定的lon值,将@radius替换为以公里为单位的值

这将基于给定半径内来自DB1的坐标从DB2返回所有坐标


这里的更多信息:

谢谢你的建议,顺便说一句,在阅读了你链接的文档之后,我不知道是否最好使用你发布的代码或者这个
选择目的地。*,3956*2*ASIN(SQRT(POWER(POWER)(SIN)(orig.lat-dest.lat)*pi()/180/2)+COS(orig.lat pi()/180)*COS(dest.lat pi()/180)*POWER SIN((orig.lon-dest.lon)*pi()/180/2),2)))作为与用户目的地的距离,用户来源,其中origin.id=userid和destination.lon1和lon2之间的经度和destination.lat1和lat2之间的纬度
即标记为更快的代码。。。