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

时间:2018-07-07 09:47:32

标签: ios arrays json swift google-maps

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

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

   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(当前存储在本地,最终将存储在数据库中)进行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 个答案:

答案 0 :(得分:1)

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

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

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

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