0

我正在制作地图应用程序。我有一堆位置的坐标。我想返回屏幕上可见区域内的所有点。这是通过谷歌地图 api 完成的。它为您提供屏幕上可见的地图的东北和西南坐标。我正在使用 MongoDb。

显而易见的方法是以ne-sw对角线的中点为中心,到任一角的距离为半径,并找到该半径内的所有点。

但是将它们存储在单个列表中将是一个 O(n) 操作 - 无法针对每个请求进行扩展。存储它们以便能够快速获得积分的更好方法是什么?

我正在考虑将它们分成包含半径(r)内所有点的桶,并改为维护一个排序的桶列表。由于屏幕最多可以在 4 个桶上(每个角落在一个单独的桶上),我在 O(log n) 中找到最近的桶,在 O(1) 中找到接下来的 3 个最近的桶。现在我只需要对这 4 个存储桶进行计算。

但这仍然是很多桶!谷歌能够非常快速地在地图上渲染点。他们有很多点。还有很多用户。他们是如何管理的?我不希望达到那种优化水平,但必须有更好的数据结构。

4

1 回答 1

0

可能我没看懂…… 你的解决方案听起来很复杂..

你有屏幕角 - NE Long and Lat 和 SW Long and Lat 因此你有 SW_Lat, SW_long, NE_lat, SW_Lat

您想选择此边界内的点...如果您将 long 和 lat 存储为十进制,请使用伪代码:

Select * from points 
where point_lat > SW_lat 
and point_lat < NE_lat
and point_long > SW_long
and point_long < NE_long

这将填满可见屏幕。

于 2013-07-25T15:18:47.170 回答