查找给定坐标的特定范围内的项目

时间:2012-06-05 10:01:13

标签: android python django

我有一个基于django的网络应用程序,可存储位置。

我有一个Android移动应用程序,它从Web应用程序中提取位置并将位置保存到Web应用程序。这些位置返回给我,我在我的应用程序中加载了mapoverlay。

我想发送当前坐标并返回一定范围内的位置列表。例如,我发送我的位置并取回半径2公里范围内的物品。 (类似于Google Places API的工作方式,只需搜索我的数据)。

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

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

4 个答案:

答案 0 :(得分:11)

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转换为您想要的任何内容。我的意思是原则保持不变。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

GeoDjango与Postgres的优秀PostGIS附加功能集成,可免费为您提供所有这些距离查找。

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

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

答案 3 :(得分:0)

我目前正在Android应用上使用此功能,我遇到了这个,希望这会有所帮助。 我最初是从服务器过滤掉JSON结果然后我来到这里并且意识到Mysql比我最初认为的要复杂得多。

https://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL

上面的评论对我来说并不适合,但他们可以选择使用 Haversine Equation 。在服务器端执行大部分操作的效率要高得多,因此手机不会被不能用于任何事情的信息所淹没。这就像烘烤一个完整的10英寸蛋糕只是切成第8个蛋糕然后把剩下的蛋糕扔掉,为什么不烘烤半径为2英寸的小蛋糕呢?可能看起来不像它有什么不同,但像任何好的程序,只有得到你需要的东西,除非你需要所有这些。

使用实时工作版本对您自己的代码运行小测试使用下面的链接。 http://sqlfiddle.com/#!2/abba1/2

希望这篇文章有所帮助。