2010-06-27 35 views
2

在地图应用程序中,我使用与以下类似的查询在基于可视地图区域的地图上显示标记。MySQL Lat/Lng结果均匀分布的边界

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

您是否打算从视口区域挑选20个随机属性? – 2010-06-27 06:34:30

+0

是的,程序员错误#1,并试图变得复杂 – PJT 2010-06-27 06:47:39

回答

1

如果你将有数以千计的特性,你可能要考虑在数据库内汇聚你的属性。也就是说,通过定义每个属性应该出现在哪个缩放级别,您可以聚合这些点以减少一次显示的数量。

一种方法可以是使用另一个表,也许称其为properties_clusters,具有以下字段:latlngnumber_of_pointszoom_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表中直接显示结果。该阈值通常设置为可以与地图上的标记进行交互的缩放级别(点击它们等)。

0

“ORDER BY RAND()”似乎做一个足够好的工作没有得到太复杂