如何查找给定位置附近的位置

Posted

技术标签:

【中文标题】如何查找给定位置附近的位置【英文标题】:How to find locations near a given location 【发布时间】:2015-08-07 09:10:02 【问题描述】:

我正在尝试使用 Python3 为给定的纬度和经度创建一个具有一定距离(或半径)的边界框(或圆)。

我已经完成了这个问题的先前解决方案,但我对它的工作原理有些怀疑。有一些变量,如 halfsideinKm 和一些 degree to radianradian to degree 转换,我无法理解这些转换是什么以及它是如何工作的。

Given lat and long finding binding box

Geocoding calculate bounding box

我有一个数据库集合 Locations(在 MongoDB 中),其中包含经纬度。

我的要求是,如果我输入纬度和经度,我想拥有位于边界框区域内(距离为 20 公里)的地点列表(来自我的 mongodb)。

谁能为我提供这个问题的解决方案或解释这些代码是如何工作的?

这可以使用geopy 实现吗?(因为它说明了大圆距离计算)

数据库值


  "place_id":"151142295",
  "osm_type":"relation",
  "osm_id":"65606",
  "lat":"51.5073219",
  "lon":"-0.1276474",
  "display_name":"London, Greater London, England, United Kingdom",
  "class":"place",
  "type":"city",
  "importance":0.9754895765402
,

  "place_id":"4566287",
  "osm_type":"node",
  "osm_id":"485248691",
  "lat":"42.988097",
  "lon":"-81.2460295",
  "display_name":"London, Ontario, Canada",
  "class":"place",
  "type":"city",
  "importance":0.6515723047601

(只是数据如何存储在我的数据库中的示例)

【问题讨论】:

在询问和使用 MongoDB 存储此类数据时,您确实应该阅读文档。要找到给定另一个点“附近”的东西,只需使用$nearSphere 获取地理位置。了解地理空间索引。和/或向我们展示您是如何存储数据的。 @BlakesSeven 我添加了一个数据如何存储在我的数据库中的示例,并且正在浏览地理空间索引和文档 【参考方案1】:

如果您打算在 MongoDB 中使用地理空间查询,您必须做的“第一”件事是更改存储数据的方式。您可以选择旧坐标对或 GeoJSON 格式。但是您当前在单独的字段中使用“lat”和“long”以及作为“strings”的存储将不起作用。

这是为您的集合编写的架构修复程序,为 mongo shell 编写,因为这应该是一次性操作。我建议使用 GeoJSON,因为它通常与相当多的库兼容,并且返回的所有距离都以公里而不是弧度为单位。

var bulk = db.collection.initializeUnorderedBulkOp(),
    count = 0;

db.collection.find().forEach(function(doc) 
   bulk.find( "_id": doc._id ).updateOne(
       "$set": 
           "location": 
               "type": "Point",
               "coordinates": [parseFloat(doc.lon),parseFloat(doc.lat)]
                   
       ,
       "$unset":  "lat": "", "lon": "" 
   );
   count++;

   if ( count % 1000 == 0 ) 
       bulk.execute();
       bulk = db.collection.initializeUnorderedBulkOp();
   
);

if ( count % 1000 !=0 )
   bulk.execute();

现在数据已固定并与索引兼容,请创建索引。对 GeoJSON 数据有意义的是 "2sphere" 索引:

db.collection.createIndex( "location": "2dsphere" )

现在您可以查询了。坚持使用 shell,因为 python 语法是相同的,我不知道你的库调用:

db.collection.find(
    "location": 
        "$nearSphere": 
            "$geometry": 
                "type": "Point",
                "coordinates": [lon,lat]
            ,
            "$maxDistance": distance
        
    
)

此查询使用$nearSphere,它将根据地球曲率正确计算距离,非常适合实际位置数据。您的三个变量是坐标数组中的“经度”、“纬度”(按此顺序)和$maxDistance 下的“距离”,您想在该半径范围内查找事物。

一旦您的数据合适并且必需地理空间索引到位,这是一个非常简单的查询过程。

您的客户端无需进行繁琐的计算,因为所有工作都由服务器完成。

相关文档部分的链接都包含在内,供您参考。阅读它们并了解有关使用 MongoDB 进行地理空间查询的更多信息。

【讨论】:

是自动创建索引还是我必须创建索引并存储为新集合 @TonyRoczz 没有“自动”创建索引。清单中有一个示例,说明如何创建以及指向文档的链接。如果您打算继续使用 MongoDB 文档,我真诚地恳请您花更多时间阅读它。您最近的大多数问题通常都可以通过按原样阅读文档来解决。您的问题也可能更重要的是阅读文档并发布关于您不理解或在实现代码时遇到问题的部分的问题。 问题是,最初我想对如何找到边界框进行数学计算。用户将位置作为字符串 "London, Ontario, Canada" ,然后我将从 db 中获取“纬度和经度”值并在 geopy 模块的帮助下进行计算并获得结果。我没有想到在数据库中做所有事情,因为只有选定的位置存储在集合中 @TonyRoczz 在这里澄清一下,我自己阅读您的问题的经验涵盖了这些主题。 1.“如何从python将JSON数据写成字符串?”当有基本方法可以从数据结构中实际序列化时。 2.“如何将数据聚合和组合到python dicts?”。当您需要做的只是调用 MongoDB 的 aggregate() 方法时。现在,3.“使用 python 计算与位置数据的距离?”。再次,您需要做的就是使用数据库功能。这没有什么难的。忘记“边界框”,看看你真正在问什么。就像我有好几次一样。 @TonyRoczz 我只是想补充一点,因为我的夜晚即将退休,就像在这里的所有其他场合一样,我只是想帮助您了解如何做得更好。相信我,这里的答案除了你自己之外没有其他任何好处。基本前提之前已经得到解答,这肯定会最终关闭并消失。学习如何使用正确的工具来完成手头的工作并成为更好的程序员。基拉,出去。

以上是关于如何查找给定位置附近的位置的主要内容,如果未能解决你的问题,请参考以下文章

找到给定半径内的附近位置

在给定经纬度位置的情况下查找最近的街道

谷歌地图查找当前位置和附近的地方

在 Xcode 中使用拆分数据查找用户位置附近的数据

在特定角度的位置附近查找 - 在圆形查询中只考虑前面的半圈而不是后面

如何在弹性搜索中使用纬度经度搜索位置附近的区域