我有一个 JSON 文件,其中包含 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(当前存储在本地并最终将在数据库中)执行搜索并仅返回 lon/lat 值落在这些范围内的对象,所以我可以为他们创建标记。我不想一次加载所有 30k 标记,这是我的解决方案。
我意识到伪逻辑是:
for post in JSON {
if post.lat <= aNord && post.lat >= aSud && post.long >= aOvest && post.long <= aEst{
//within the box
}
}
每次用户 map 停止时,我通过30k JSON对象进行查询并拉回范围内的对象是否真的合理?有没有一种有效的方法来实现这一点,这是这样做的正确逻辑吗?
最佳答案
我建议您将 30k+ 数据分成代表特定区域的小块(json 文件)。例如,将30k数据分成30段,每段平均包含1000个位置,每段代表一个矩形区域。
每次用户 map 停止时,您只需要检查哪些段与可见区域重叠并仅搜索这些段的经纬度。
最初,您可以将所有片段存储到云服务器/数据库中,并根据需要将它们下载到本地文件系统。
PS:如果用户缩小到最低级别,您的所有片段都将在可见区域内,您必须下载所有片段。这将是最坏的情况,并且具有与暴力破解 30k+ 数据相同的复杂性,对于所有其他情况,这种方法将节省一些时间。
关于ios - 在边界框内查询经/纬度的数据库/文件?谷歌地图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51221931/