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

Or *_*ger 2 php mysql google-maps geolocation

我有一个php webapp,允许人们通过谷歌地图api(v3)插入他们的位置.然后我将lat/lng坐标存储到我的db中.

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

用户表:

ID    U_Name    U_Location_ID
1     test      23
Run Code Online (Sandbox Code Playgroud)

活动表:

ID    E_Name    E_Location_ID
1     testevent 23
Run Code Online (Sandbox Code Playgroud)

位置表:

ID    L_LAT        L_LNG        L_Name
23    40.759139    -73.979723   30 Rockefeller Plaza, New York, NY 10112, USA
Run Code Online (Sandbox Code Playgroud)

我现在要做的是向用户显示他所在位置附近的事件列表.

我不一定有他的确切位置,但通常只是国家和城市(并非所有访客都是填写其确切位置的注册会员).

因此,当一个成员访问时,我使用ip来定位api,它给出了他的国家名称和城市名称.我有另一种获取国家/城市lat/lng坐标的方法,但现在当我需要向该城市/国家显示近事件时我就陷入了困境.

当我说"接近"时,我希望可以设置某种直径(公里数或英里数),并列出该直径范围内的事件.

谢谢你的帮助

Xav*_*osa 6

这里是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;
Run Code Online (Sandbox Code Playgroud)

您只需要用$$$$$您的值替换它.现在,如果您想要完整的解释,请参阅Alexander Rubin的这张幻灯片

几公里,只需更换x1,x2...

-- 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);
Run Code Online (Sandbox Code Playgroud)