gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 01:18:52 25 4
gpt4 key购买 nike

我有一个 php webapp,允许人们通过 google maps api (v3) 插入他们的位置。然后我将纬度/经度坐标存储到我的数据库中。

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

用户表:

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

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

我不一定知道他的确切位置,但通常只是国家和城市(并非所有访问者都是填写其确切位置的注册成员(member))。

因此,当成员(member)来访时,我会使用一个 ip 来定位 api,该 api 会提供他的国家/地区名称和城市名称。我有另一种获取国家/城市经纬度坐标的方法,但现在当我需要显示该城市/国家的近期事件时,我遇到了困难。

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

谢谢你的帮助

最佳答案

这里是 MySQL 中适用于每个表的完整查询。请记住,纬度/经度字段必须是小数字段,除非你会失去精度:

-- 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;

您只需将 $$$$$ 替换为您的值即可。现在,如果您想要完整的解释,请参阅此 slides by Alexander Rubin

对于千米,只需将 x1x2 ... 替换为

-- 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);

关于php - 列出用户位置附近的地理位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4774274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com