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坐标的方法,但现在当我需要向该城市/国家显示近事件时我就陷入了困境.
当我说"接近"时,我希望可以设置某种直径(公里数或英里数),并列出该直径范围内的事件.
谢谢你的帮助
这里是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)
归档时间: |
|
查看次数: |
1883 次 |
最近记录: |