我有一个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对象进行查询并将其拉回范围内吗?有没有一种有效的方法可以做到这一点,并且这是正确的逻辑吗?
答案 0 :(得分:1)
我建议您将30k +数据分成代表特定区域的小块(json文件)。例如,将30k数据划分为30个段,每个段平均包含1000个位置,每个段代表一个矩形区域。
每次用户地图停止时,您只需要检查哪些段与可见区域重叠,并在纬度上搜索这些段即可。
最初,您可以将所有段存储到云服务器/数据库中,并根据需要将它们下载到本地文件系统中。
PS:如果用户缩小到最低级别,则您所有的细分都将位于可见区域内,并且您必须下载所有细分。这将是最坏的情况,并且与蛮力30k +数据具有相同的复杂性,对于所有其他情况,此方法将节省一些时间。