Php 列出用户位置附近的地理位置

Php 列出用户位置附近的地理位置,php,mysql,google-maps,geolocation,Php,Mysql,Google Maps,Geolocation,我有一个php网络应用程序,允许人们通过谷歌地图api v3插入他们的位置。然后,我将纬度/液化天然气坐标存储到数据库中 我做的另一件事是允许人们将某些事件添加到数据库中,然后使用用户的相同lat/lng将事件插入到我的数据库中。例如: 用户表: ID U_Name U_Location_ID 1 test 23 事件表: ID E_Name E_Location_ID 1 testevent 23 位置表: ID L_LAT

我有一个php网络应用程序,允许人们通过谷歌地图api v3插入他们的位置。然后,我将纬度/液化天然气坐标存储到数据库中

我做的另一件事是允许人们将某些事件添加到数据库中,然后使用用户的相同lat/lng将事件插入到我的数据库中。例如:

用户表:

ID    U_Name    U_Location_ID
1     test      23
事件表:

ID    E_Name    E_Location_ID
1     testevent 23
位置表:

ID    L_LAT        L_LNG        L_Name
23    40.759139    -73.979723   30 Rockefeller Plaza, New York, NY 10112, USA
我现在要做的是,显示一个用户的位置附近的事件列表

我不一定知道他的确切位置,但通常只是国家和城市,并不是所有的游客都是填写了确切位置的注册会员

所以当一个成员访问时,我使用ip-to-location api,它给我他的国家名和城市名。我有另一种获取国家/城市lat/lng坐标的方法,但现在当我需要显示该城市/国家附近的事件时,我被卡住了

当我说“附近”时,我希望可以设置某种直径,以公里或英里为单位,并列出在该直径范围内的事件


谢谢你的帮助

我不太理解你的问题。如果您像MaxMind一样使用地理定位数据库,那么您也可以访问每个城市的纬度/经度。您只需为经度和纬度选择一些增量,运行SQL查询并在视图中计算从用户位置到事件位置的距离。这并不复杂。

这里是MySQL中的完整查询,可以在每个表上运行。请记住,lat/lon字段必须是十进制字段,除非您将失去精度:

-- set your vars
SET @lat := $$$$$;
SET @lon := $$$$$;
SET @dist := $$$$$;

-- prepare a square in miles
SET @x1 := @lon - @dist / ABS(COS(RADIANS(@lat))*69);
SET @x2 := @lon + @dist / ABS(COS(RADIANS(@lat))*69);
SET @y1 := @lat - (@dist / 69);
SET @y2 := @lat + (@dist / 69);

SELECT  t.*, 
        3956 * 2 * ASIN(
            SQRT(
                POWER(
                    SIN(
                        (@lat - t.lat) * pi() / 180 / 2
                    ), 2
                ) +
                COS(
                    @lat * pi() / 180
                ) *
                COS(
                    t.lat * pi() / 180
                ) *
                POWER(
                    SIN(
                        (@lon - t.lon) * pi() / 180 / 2
                    ), 2
                )
            )
        ) as distance
FROM    `YourTable` t
WHERE   t.longitude BETWEEN @x1 AND @x2
AND     t.latitude BETWEEN @y1 AND @y2
HAVING  distance < @dist
ORDER BY distance
LIMIT 10;

您知道吗?

这里有一个查询,可以帮助您获得某个直径内的所有位置。{公里数}将是直径$lon和$lat将打赌用户位置的坐标

选择 D.*, 度数余弦弧度90纬度*余弦弧度90-$lat+正弦弧度90纬度*正弦弧度90-$lat*余弦弧度长度-$lon/360*40074 像 距离 从…起 位置表为D 有
距离重要的是要注意,如果你使用Xavier的精彩答案-并且-如果你使用他的公里数更改,你必须在计算中也更改3956*2到6371*2,或者你只是更改范围,而不是生成的距离。

LAT/LNG的正确计算是什么?如果这是我的LAT/LNG:40.759139//73.979723,并且我想从mysql数据库中选择距离该LAT/LNG 50公里以内的所有事件,我该如何执行?如何定义@dist?公里?目前以英里为单位。我已经更新了我的帖子,展示了如何在公里内进行请求。当我尝试通过mysql\u查询运行此查询时,我遇到了一个错误,你知道为什么吗?请尝试每个查询一次;,如下所示:mysql_query'SET@lat:=$$$$$;mysql_query'SET@lon:=$$$$$”@XavierBarbosa你能看看Britton的评论吗?谢谢你精彩的回答
-- prepare a square or in kilometers
SET @x1 := @lon - @dist / ABS(COS(RADIANS(@lat))*110);
SET @x2 := @lon + @dist / ABS(COS(RADIANS(@lat))*110);
SET @y1 := @lat - (@dist / 110);
SET @y2 := @lat + (@dist / 110);