我正在制作地图应用程序。我有一堆地点的坐标。我想返回屏幕上可见区域内的所有点。这是通过google maps api完成的。它为您提供屏幕上可见的地图的东北和西南坐标。我正在使用MongoDb。
显而易见的方法是将ne-sw对角线的中点作为中心,将其与任一角的距离作为半径,并找到该半径内的所有点。
但是将它们存储在单个列表中将是O(n)操作 - 对于每个请求都不可扩展。什么是更好的存储方式,以便能够迅速获得积分?
我正在考虑将它们拆分为包含半径(r)内所有点的存储桶,并维护一个已排序的存储桶列表。由于屏幕最多可以在4个桶上(单独桶上的每个角落),我在O(1)中找到O(log n)中最接近的桶和接下来的3个桶(O)。现在我只需要为这4个桶进行计算。
但那仍然是很多桶! Google可以很快地在地图上渲染点数。而且他们有很多分。还有很多用户。他们如何管理?我不希望达到这种优化水平,但必须有一个更好的数据结构。
答案 0 :(得分:0)
也许我不理解......你的解决方案听起来很复杂..
你有屏幕角落 - NE Long和Lat以及SW Long和Lat 因此你有SW_Lat,SW_long,NE_lat,SW_Lat
您想要选择此边界内的点数... 如果你有你的长期& lat存储为十进制使用伪代码:
Select * from points
where point_lat > SW_lat
and point_lat < NE_lat
and point_long > SW_long
and point_long < NE_long
这将填满可见屏幕。