我将构建一个应用程序,用户可以在该应用程序中查看所在位置周围预定义半径内的兴趣点。
我的第一个想法是将所有POI的纬度和经度存储在数据库中,并通过SQL将用户位置与POI的位置进行比较。
我认为问题出在表现上。如果有成千上万的POI和成千上万的用户请求他们的位置,这不会很经济,或者这对今天的服务器来说没有问题吗?
我的下一个方法是把地图分成象限,只观察周围的象限。
tl;dr:
总而言之,我正在寻找:
- 进行半径搜索的方法
- 最多为其他用户缓存结果
- 当正在注册新的POI时,高速缓存将被更新
如果你有任何想法如何实现这样的事情,请告诉我。
谢谢
Fabian
我想你正在寻找的是Harversine公式,它可以让你找到球体(在这种情况下是地球)中两点之间的距离。使用SQL的实现是这样的:
ACOS (
SIN(RADIANS($latitude)) *
SIN(RADIANS(T.latitude))+
COS(RADIANS($latitude)) *
COS(RADIANS(T.latitude))*
COS(RADIANS($longitude-T.longitud)))*6378.137 AS distance
将其添加到查询的选择中,将返回一个名为distance calculation(以Km为单位)的列,该列通常是用户从(T.latitude,T.经度)(通常是表的元素)算起的距离。
如果你想过滤,并且不显示超过一定距离的元素,你可以设置一个条件,比如:
HAVING distance<$radius
我假设您使用的是MySQL,如果是这种情况,您必须使用HAVING
而不是WHERE
来对计算列(距离)设置条件。
一个完整的查询示例如下:
SELECT T.*, ACOS (
SIN(RADIANS($latitude)) *
SIN(RADIANS(T.latitude))+
COS(RADIANS($latitude)) *
COS(RADIANS(T.latitude))*
COS(RADIANS($longitude-T.longitud)))*6378.137 AS distance
FROM your_table as T
HAVING distance < $radius
ORDER BY distance LIMIT $limit
如果您想进一步优化性能,请为查询添加一个限制,这样您就可以获得例如最近的10个位置。
花点时间考虑空间数据类型,因为它们是专门为这类工作设计的。
请注意,我不建议您将php变量直接插入到查询中,这确实是不安全的,我只是举了一个例子。
希望这对你有帮助。