代码之家  ›  专栏  ›  技术社区  ›  Budgie

maps.google.com如何有效地选择和呈现搜索结果标记?

  •  1
  • Budgie  · 技术社区  · 14 年前

    我最近一直在研究在地图上显示大量标记的多种方法,并认为谷歌必须有一个非常有效的解决方案来解决这个问题(除了拥有大量的服务器!)。如果在地图搜索栏中键入“accommodation”,则地图显示大约100个点(不考虑缩放级别),当放大某个区域时会显示更多点。但是,必须有数百万个点属于“住宿”搜索标签,因此大量的标记选择正在发生。

    我猜,当用户放大/移动时,他们必须使用getbounds方法过滤标记,然后从这些标记中随机选择。然而,这听起来可能效率低下,因为必须对整个数据库进行拖网搜索,以仅选取那些位于地图边界内的点。仅仅是它拥有巨大的计算能力,使得谷歌地图如此之快(大多数时候…)吗?或者有没有比上面详细介绍的方法更有效的方法来执行这种类型的数据库查询?

    我正在构建一个Rails/Google地图应用程序,我希望能够扩展到100万点以上——我肯定不想一次显示所有的点,但我希望开发一种快速搜索算法,这种算法在服务器上不需要太大的负担就可以在任何时候在地图上呈现(相对较小的)点选择,以类似于谷歌的方式。任何建议都将不胜感激!

    3 回复  |  直到 14 年前
        1
  •  0
  •   Tim Rogers    14 年前

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

        2
  •  1
  •   Marcelo    14 年前

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

    选择可以通过许多不同的策略来完成,例如,对于具有用户评级的酒店,您可以首先选择具有最高评级的酒店。或者,谷歌可能会因为优先处理某些问题而获得报酬。但这很可能不是实时完成的!!(猜猜看这个)

    快速显示是通过预制定制瓷砖实现的。小红点不是javascript标记对象,而是自定义图块,如:

    http://mt3.google.com/mapslt?Lyrs=Lmq:1000:酒店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时,都会更新这些小表。

    把一些写在其他上面。但这很可能不是实时完成的!!(猜猜看这个)

    快速显示是通过预制定制瓷砖实现的。小红点不是javascript标记对象,而是自定义图块,如下所示:

    http://mt3.google.com/mapslt?Lyrs=Lmq:1000:酒店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时,都会更新这些小表。

        3
  •  0
  •   JonH    14 年前

    索尼娅,明天、下周或下个月同样的搜索会得到不同的分数。 谷歌对一百万个搜索结果的处理就是随机抽取1000个搜索结果。 所以您可以在查询中对点进行“随机抽样”。