我有一个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+数据相同的复杂性,对于所有其他情况,这种方法将节省一些时间。