【问题标题】:Find items within a certain range of given coordinate在给定坐标的特定范围内查找项目
【发布时间】:2014-10-10 21:21:53
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 发布你的模型,需要了解你的表结构是什么样子的。
  • 1) 选择您当前位置附近的所有位置(例如,在同一纬度/经度线内)。 2) 使用每个选定坐标的距离计算并消除> 所需范围(2 公里)的坐标。如果您忘记距离是sqrt(dx**2+dy**2)

标签: android python django


【解决方案1】:

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

【讨论】:

  • 谢谢。为 postgresql SELECT distance FROM (SELECT ( 6371 * acos( cos( radians(45) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(10) ) + sin( radians(45) ) * sin( radians( latitude ) ) ) ) AS distance FROM spots_spot ) sub GROUP BY sub.distance HAVING sub.distance &lt; 2 稍微编辑了一下,这是一个 python 类 Haversine
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      我目前正在 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

      希望这篇文章有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-31
        • 2021-11-09
        • 2014-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多