我有一个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执行搜索(JSON当前存储在本地,最终将存储在数据库中),并只返回lon/lat值在这些范围内的对象,以便我可以为它们创建标记。我不想一次加载所有的30k标记,这是我的解决方案。
我知道psuedo逻辑是:
   for post in JSON {

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

每次用户的映射停止时,我都会通过30kjson对象进行查询并将其拉回到边界内,这真的合理吗?有没有一种有效的方法来实现这一点,这是正确的逻辑吗?

最佳答案

我建议您将30k+的数据分成代表特定区域的小块(json文件)。例如,将30k数据分成30个段,每个段平均包含1000个位置,每个段代表一个矩形区域。
每次用户映射停止时,您只需要检查哪些段与可见区域重叠,并仅搜索这些段的纬度。
最初,您可以将所有段存储到云服务器/数据库中,并根据需要将它们下载到本地文件系统。
注意:如果用户缩小到最低级别,所有的段都将位于可见区域内,您必须下载所有的段。这将是最坏的情况,并且将具有与蛮力30K+数据相同的复杂性,对于所有其他情况,这种方法将节省一些时间。

10-02 19:28