在边界框中查询 lon/lat 的数据库/文件?谷歌地图

Posted

技术标签:

【中文标题】在边界框中查询 lon/lat 的数据库/文件?谷歌地图【英文标题】:Query a database/file for lon/lat within a bounding box? Google Maps 【发布时间】:2018-07-07 09:47:32 【问题描述】:

我有一个 JSON 文件,其中包含 30k+ 个具有 lon/lat 的对象。

我可以通过以下方式获得可见框架的四个角:

   let visibleRegion = mapView.projection.visibleRegion()
   let bounds = GMSCoordinateBounds(region: visibleRegion)
   var aNord   =   bounds.northEast.latitude
   var aEst    =   bounds.northEast.longitude
   var aSud    =   bounds.southWest.latitude
   var aOvest  =   bounds.southWest.longitude

当地图空闲时,我需要通过我的 JSON(当前存储在本地,最终将在数据库中)执行搜索,并只返回 lon / lat 值在这些范围内的对象,所以我可以为他们创建标记。我不想一次加载所有 30k 标记,这是我的解决方案。

我意识到伪逻辑是:

   for post in JSON 

    if post.lat <= aNord && post.lat >= aSud && post.long >= aOvest && post.long <= aEst
        //within the box
    

每次用户的地图停止时,我通过 30k JSON 对象进行查询并拉回范围内的对象,这真的合理吗?有没有一种有效的方法来实现这一点,这是正确的逻辑吗?

【问题讨论】:

【参考方案1】:

我建议您将 30k+ 数据分成代表特定区域的小块(json 文件)。例如,将 30k 数据分成 30 个段,每个段平均包含 1000 个位置,每个段代表一个矩形区域。

每次用户地图停止时,您只需要检查哪些段与可见区域重叠并仅搜索这些段的经纬度。

最初,您可以将所有片段存储到云服务器/数据库中,并根据需要将它们下载到本地文件系统。

PS:如果用户缩小到最低级别,您的所有片段都将在可见区域内,您必须下载所有片段。这将是最坏的情况,并且与暴力破解 30k+ 数据具有相同的复杂性,对于所有其他情况,这种方法将节省一些时间。

【讨论】:

以上是关于在边界框中查询 lon/lat 的数据库/文件?谷歌地图的主要内容,如果未能解决你的问题,请参考以下文章

计算数据框中两个长纬度坐标之间的距离

Cassandra 边界框搜索

如何从 terra SpatRaster 构建 lon、lat、值数据框

从 R 中的 netCDF 提取点的时间序列(lon,lat)

对 lon\lat 点的排序列表,从最近的开始

如何使用 lon/lat 在 arraylist 中绘制地图?