利用高级标记和 Firebase 实时吸引客户

借助 Google Maps Platform,客户可以使用高级标记来自定义地图标记的视觉设计,从而打造独特的体验。在本文档中,我们将探索客户如何更进一步,创建能够根据实时数据动态变化的标记。

主打图片显示了以旧金山为中心的 Google Maps JS 地图。有些位置显示了彩色标记,内容分别显示为“2 分钟”、“4 分钟”

地图标记是一种实用的工具,可为用户提供丰富的地图体验。标记属性(如尺寸、颜色和形状)可传达关于每个标记位置的更多信息。在某些情况下,这些附加信息可能会动态变化,而开发者可能希望更新地图可视化内容,从而为用户保持新鲜感。

在本文中,我们使用一个示例进行说明:一家连锁零售店希望使用地图向用户显示商店等待时间。不过,这一架构也可用于许多其他用例。以下是一些其他的建议:

  • 酒店客房供应情况:在显示酒店搜索结果的地图上,客房供应情况的时效性是一项重要信号,它可以在库存减少时鼓励用户预订酒店。
  • 停车位数量:在地图上的停车场地图上,让用户可以放心选择抵达后有车位的目的地。
  • 餐馆开始营业、即将打烊和歇业:在显示餐馆搜索结果的地图上,请务必让用户知道某家餐馆在到达时是否已经打烊。

动态高级标记解决方案

现在,我们将逐步介绍如何使用高级标记构建地图,以便直观呈现动态数据。如前所述,该应用场景是一个连锁零售店,利用其结账队列管理系统来估算和直观呈现用户的等待时间。应用架构如下:

一张架构图,展示了用户访问 Web 应用的情况。Web 应用 Google 基础架构(GMP 和 Firebase Cloud Functions)。Firebase Cloud Functions 从客户的后端访问实时数据。

第 1 步 - 确定定义视觉体验的属性

第一步是确定要向用户显示的一个或多个营业地点属性。在本例中,我们希望仅显示一个房源:每个店铺位置的当前等待时间(以分钟为单位)。

下一步是选择一个或多个对应的标记属性,以直观地标注地图标记的等待时间。在 PinElement 规范中,标记属性列表可供开箱即用。您还可以使用自定义 HTML 获得更丰富的自定义选项。

在此示例中,我们将使用两个标记属性来直观呈现等待时间数据:

  • 标记颜色:蓝色表示等待时间少于 5 分钟,黄色表示等待时间超过 5 分钟
  • 标记内容(需要自定义 HTML 标记):我们会在标记本身中添加当前等待时间(以分钟为单位)

第 2 步 - 配置与实时数据源的连接

您可以通过多种方式连接到数据源,合适的解决方案取决于您的使用场景和技术基础架构。在此示例中,我们使用拉取方法,通过 HTTP 请求 (REST) 定期请求更新后的等待时间数据。在以下部分中,您将看到利用推送方法的替代架构。

为了让我们的应用能够访问来自服务器的等待时间数据,我们的架构利用了 Cloud Functions for Firebase。借助 Cloud Functions,我们可以定义一个后端函数来访问和计算这些数据。我们还在 Web 应用中添加了 Firebase 库,使我们能够通过 HTTP 请求访问 Cloud Functions 函数

下一步是确保为用户提供最新的数据。为此,我们使用 JavaScript setInterval 函数设置一个计时器,并将超时设置为 30 秒。每次触发计时器时,我们都会按上述方式请求更新的等待时间数据。获取新数据后,我们必须刷新地图标记的外观。下一步会详细介绍如何进行这些更改。

第 3 步 - 渲染地图标记

现在,我们可以使用高级标记在地图上渲染风格化标记。在通过 Google Maps Platform 的 Maps JavaScript API 创建的地图上,可以渲染高级标记。使用高级标记时,请务必在 JS 地图请求中添加地图 ID 参数

在如下所示的代码段中,我们创建了标记,并通过创建 HTML div 元素来定义标记的内容:

// Create the content div for the marker
storeWaitLabels[store_index] = document.createElement("div");

// Create the marker
markers.push(new google.maps.marker.AdvancedMarkerElement({
      map,
      position: { lat: latlngs[store_index][0], lng: latlngs[store_index][1] },
      content: storeWaitLabels[store_index]
    }));

最后一步是更新每家商店的标记文本和 CSS 样式。以下代码会读取更新后的等待时间数据,并根据等待时间为每个商店图钉分配样式:

// Update the visual appearcance of a map marker
storeWaitLabels[store_index].textContent = waitTimes[store_index] + " min";
     if (waitTimes[store_index] > 5)
storeWaitLabels[store_index].className = "wait-over-5";
     else storeWaitLabels[store_index].className = "wait-under-5";

现在,该地图使用我们现有的等待时间 API 来直观显示用户的最新等待时间:

主打图片显示了以旧金山为中心的 Google Maps JS 地图。有些位置显示了彩色标记,内容分别显示为“2 分钟”、“4 分钟”

连接到实时数据源的其他方法

您可以通过多种方式连接到实时数据源。下面,我们将介绍两种替代方案:Firebase Cloud Messaging 和 Websocket。无论您选择哪种方法,请务必考虑以下因素,以使地图工具保持高性能:

  • 更新频率
  • 数据量
  • 地图视图中的标记数量
  • 硬件和浏览器功能

Firebase Cloud Messaging

Firebase Cloud Messaging 是一种推送方法。使用此方法,每次在后端更新等待数据时,您都会向地图应用发送更新。Update 消息将触发回调函数,该函数用于更新标记的外观和内容。

选择此架构之前要考虑的一点是,它需要为每个运行地图应用的浏览器维护持久的服务器连接。因此,它的运行费用可能较高,并且在出现连接问题时可能不太可靠。

WebSocket

WebSockets 是另一种基于推送的方法,用于保持数据新鲜。与之前的情形类似,您可以使用 WebSocket 在后端与地图应用之间建立持久连接。这种方法的功能优势在本质上与 Firebase Cloud Messaging 类似,但可能需要执行额外的工作来配置必要的基础架构。

总结

开发者可以结合实时数据源与高级标记,在 Google 地图上构建直观的可视化效果。有多种方式可以连接这些数据源,具体取决于地图要求、用户硬件和浏览器以及数据量。然后,集成的数据可用于实时控制高级标记的外观和风格,从而为用户提供动态的体验。

后续操作

深入阅读:

贡献者

主要作者:

Jim Leflar |Google Maps Platform 解决方案工程师

John Branigan |Google Cloud Platform 高级客户工程师

Steve Barrett |Google Maps Platform 解决方案工程师