在给定坐标的一定范围内查找项

2024-06-25 22:46:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个基于django的web应用程序,可以存储位置。在

我有一个android移动应用程序,它从web应用程序中提取位置并将位置保存到web应用程序中。我在我的应用程序的地图覆盖上加载返回给我的位置。在

我想发送我当前的坐标,并返回在一定范围内的位置列表。例如,我发送我的位置并取回半径为2公里的物品。(类似于googleplacesapi的工作原理,只是搜索我的数据)。在

最好是在我的pythondjango应用程序中发送位置坐标并执行所有这些逻辑,然后返回一个正确位置的列表并在地图上显示位置。在

我不知道从哪里开始做这个。 如何根据给定的一组坐标筛选出特定半径(km)内存储的位置?在


Tags: 数据djangoweb应用程序列表地图半径逻辑
3条回答

GeoDjango集成了Postgres的优秀PostGIS附加组件,它为您免费提供所有这些距离查找。在

如果在存储为Postgres类型的模型中存储了LatLong,则可以运行一个简单的ORM查询来获取与当前LatLong保持一定距离的所有位置。在

GeoDjango非常强大,有很多选项,如果你只需要从列表中找到给定距离内的位置,可以使用简单的数学:distance=sqrt(dx^2+dy^2)

最简单的方法是计算到每个位置的距离和在一定距离内的拾取点。如果您想更快地进行搜索,可以用更复杂的数据结构(例如kd-tree)组织位置。在

Haversine Equation是您问题的答案。不过,解密有点困难,所以我在这里为您提供一个简单的解释:

简单地说:

下面是SQL语句的示例/示例,它将查找距离37,-122坐标25英里半径范围内最近的20个位置。它根据该行的纬度/经度和目标纬度/经度(在下面的等式中由lat/lng给出)计算距离,然后只请求距离值小于25的行,按距离排序整个查询,并将其限制为20个结果。要按公里而不是英里搜索,请将3959替换为6371。在

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;

您可以将sql转换为您想要的任何内容。我的意思是原则不变。在

相关问题 更多 >