4

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

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

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

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

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

4

4 回答 4

13

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

于 2012-06-05T10:30:28.220 回答
1

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

于 2012-06-05T10:11:13.977 回答
1

GeoDjango与 Postgres 的优秀 PostGIS 插件集成,免费为您提供所有这些距离查找。

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

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

于 2012-06-05T10:23:32.497 回答
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

希望这篇文章有所帮助。

于 2014-10-10T12:54:40.927 回答