2010-08-19 41 views
1

我一直在寻找很多方法来最近在地图上显示大量标记,并认为Google必须有一个非常有效的解决方案来解决这个问题(除了拥有大量服务器!)。如果您在地图搜索栏中输入“住宿”,则地图显示大约100个左右的点(与缩放级别无关),并且放大某个区域时出现更多点。但是,必须有数百万个点属于“住宿”搜索标签,因此会出现相当多的标记选择。maps.google.com如何有效地选择和呈现搜索结果标记?

我猜他们必须使用getBounds方法过滤标记,当用户放大/移动,然后可能是从这些标记随机选择。然而,这听起来可能效率低下,因为整个数据库必须被拖拽才能选择落入地图边界内的那些点。它是否具有巨大的计算能力,使Google地图如此之快(大部分时间......)?或者有没有一种更有效的方法来做这种类型的数据库查询而不是上面详述的方法?

我正在构建一个Rails/Google地图应用程序,我希望能够扩展到一百多万个点 - 我绝对不想一次显示所有要点,但我想开发一种快速的搜索算法,对服务器来说并不是很重要,它允许在任何时候在地图上呈现(相对较小的)点的选择,这与谷歌的做法类似。任何建议将不胜感激!

回答

0

您需要对数据进行空间索引。 SQL Server 2008内置了这个功能。如果你的数据库没有,那么你需要从你的坐标和索引中生成一个“tile number”。例如,您的瓷砖编号对于1公里广场内的每个点都应该是唯一的。您可以按照视图当前显示的图块的编号进行搜索,并且应该有效搜索。

+0

感谢关于空间数据库的提示,这绝对是值得思考的 - 有一个gem,GeoRuby,它允许rails轻松地与这种数据库进行交互。 – Budgie 2010-08-20 08:33:53

0

索尼娅,相同的搜索明天,下周或下个月产生不同的点,但。 谷歌用100万个结果做的事情是随机抽取1000个大数。 因此,您可以对查询中的点进行“随机抽样”。

1

该问题可以分为两部分:
1.如何选择要显示的点。
2.如何快速显示选定的点。

选择可以通过多种不同的政策来完成,例如在有酒店的用户评分的情况下,您可以选择评分最高的酒店。或者,Google可能会因为优先处理某些优先级而获得报酬。但很可能这不是实时完成的! (只是在猜测这个)

快速显示是通过预先制作的自定义瓷砖的手段。小红点不是JavaScript的标志物,但定制瓷砖,像这样:

http://mt3.google.com/mapslt?lyrs=lmq:1000:hotel|cc:US|h:18b|s:115968771510351694523,m%40130&x=2&y=5&z=4&w=256&h=256&hl=en&style=18,28

这些瓦片被周期性创建,(比如一天一次或每周一次),并保存,所以他们是服务器缓存并准备使用。鼠标悬停和点击功能可以通过ajax调用来实现,该调用只搜索一个只包含记录的小表格,这些记录对应于已选择并绘制在图块上的点。每当创建新的tileset时,这些小表格都会更新。