在地图应用程序中,我使用类似于以下内容的查询在地图上显示基于可见地图区域的标记。
SELECT * FROM (`properties`)
WHERE `lat` > '-11.824448' AND `lat` < '84.124002' AND
`lng` > '-152.243398' AND `lng` < '-39.743398'
LIMIT 20;
由于表格上的索引,这导致结果通常出现在同一纬度上,并出现在地图一角的一条线上。机智地图的其余部分是空的。
由于服务器负载,带宽和加载时间,我无法在地图上显示所有结果,有没有办法可以在整个地图区域内撤回结果?
我想我可以通过计算x的比例距离并告诉mysql返回结果,其中没有结果在另一个x距离内。
其他人如何做到这一点?
答案 0 :(得分:1)
如果您将拥有数千个属性,则可能需要考虑在数据库中对属性进行聚类。也就是说,通过定义每个属性应出现在哪个缩放级别,您可以对点进行聚类以减少一次显示的数量。
一种方法可能是使用另一个表,可能称之为properties_clusters
,并使用以下字段:lat
,lng
,number_of_points
,zoom_level
。确保zoom_level
字段也包含在可用索引中。
每当您插入或移动属性时,您还应该更新properties_clusters
表。您可能想要研究一下可能的聚类算法,但如果准确性不那么重要,您可能会想出一个简单的解决方案,例如在每个缩放级别的多个区块中细分世界,然后简单地进行聚类
然后,只要地图的可见区域或缩放级别发生变化,您就可以从properties_clusters
表中请求数据,这些数据会在缩放级别越低时返回更少的点数:
SELECT * FROM (`properties_clusters`)
WHERE `lat` > '-11.824448' AND `lat` < '84.124002' AND
`lng` > '-152.243398' AND `lng` < '-39.743398' AND
`zoom_level` = 5
您可以定义缩放级别阈值,您可以直接从properties
表中显示结果。此阈值通常设置为缩放级别,可以与地图上的标记进行交互(单击它们等)。
答案 1 :(得分:0)
'ORDER BY RAND()'似乎做得不够好,而且不会太复杂