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



我有一个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(当前存储在本地并最终将位于数据库中(执行搜索并仅返回 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 对象进行查询并拉回边界内的对象,这真的合理吗?是否有一种有效的方法来实现这一目标,这是这样做的正确逻辑吗?

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

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

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

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

最新更新