迁移到新版地点搜索

本页介绍了 Place 类(新)和 PlacesService(旧版)中基于文本的地点搜索功能之间的区别,并提供了一些代码段以供比较。

旧版 PlacesService 具有以下基于文本的搜索方法:

  • findPlaceFromQuery() 方法,用于接受文本查询并返回单个地点结果,并且支持使用地点数据字段。
  • findPlaceFromPhoneNumber() 方法,可让您使用电话号码搜索地点,并支持使用地点数据字段。
  • textSearch() 方法,用于接受文本查询并返回地点结果列表。textSearch() 较旧,不支持使用地点数据字段。

新的 Place 类提供了 Place.searchByText() 方法,可让您使用文本查询或电话号码搜索地点,还可让您使用定期更新的地点数据字段和地点类型的更广泛选择来自定义搜索。

下表列出了 Place 类和 PlacesService 之间地点搜索方法的一些主要区别:

PlacesService(旧版) Place(新)
findPlaceFromQuery()
findPlaceFromPhoneNumber()
searchByText()
FindPlaceFromQueryRequest
FindPlaceFromPhoneNumberRequest
SearchByTextRequest
查询选项有限。 更广泛的查询选项。
需要使用回调来处理结果对象和 google.maps.places.PlacesServiceStatus 响应。 使用 Promise,并以异步方式运行。
需要进行 PlacesServiceStatus 检查。 无需状态检查,可以使用标准错误处理。
仅支持位置偏差。 支持位置偏向和位置限制。
地点数据字段采用蛇形命名法。 地点数据字段采用驼峰式格式。
返回单个地点结果。 最多返回 20 个地点结果。
仅限于一组固定的地点类型地点数据字段 提供定期更新的地点类型地点数据字段的更广泛选择。
textSearch()
searchByText()
返回所有可用数据字段(部分受支持的字段);无法限制为仅返回特定字段。 仅返回请求的地点数据字段

代码比较

本部分比较了文本搜索方法的代码,以说明地点服务和地点类之间的区别。以下代码段显示了各个 API 发出基于文本的搜索请求所需的代码。

地点服务(旧版)

以下代码段展示了如何使用 findPlaceFromQuery() 方法搜索地点。该请求是同步的,并包含对 PlacesServiceStatus 的条件检查。所需的地点数据字段在请求正文中指定,该正文是在发出实际请求之前定义的。

function findPlaces() {
  const request = {
    query: "Museum of Contemporary Art Australia",
    fields: ["name", "geometry"],
  };

  // Create an instance of PlacesService.
  service = new google.maps.places.PlacesService(map);

  // Make a findPlaceFromQuery request.
  service.findPlaceFromQuery(request, (results, status) => {
    let place = results[0];
    if (status === google.maps.places.PlacesServiceStatus.OK && results) {
      if (!place.geometry || !place.geometry.location) return;

      const marker = new google.maps.Marker({
        map,
        position: place.geometry.location,
      });
      map.setCenter(place.geometry.location);
    }
  });
}

了解详情

文本搜索(新)

以下代码段展示了如何使用 searchByText() 方法搜索地点。请求是异步的,不需要状态检查(可以使用标准错误处理)。在此示例中,请求包含 maxResultCount 为 8(值必须介于 1 到 20 之间)。此函数会循环遍历结果并为每个结果添加一个标记,并根据标记的位置调整地图边界。由于 searchByText() 方法使用 await 运算符,因此只能在 async 函数内使用。

async function findPlaces() {
  // Define a request.
  // The `fields` property is required; all others are optional.
  const request = {
    fields: ["displayName", "location", "businessStatus"],
    textQuery: "Tacos in Mountain View",
    includedType: "restaurant",
    locationBias: { lat: 37.4161493, lng: -122.0812166 },
    isOpenNow: true,
    language: "en-US",
    maxResultCount: 8,
    minRating: 3.2,
    region: "us",
    useStrictTypeFiltering: false,
  };

  // Call searchByText passing the request.
  const { places } = await google.maps.places.Place.searchByText(request);

  // Add a marker for each result.
  if (places.length) {
    const bounds = new google.maps.LatLngBounds();

    places.forEach((place) => {
      const markerView = new google.maps.marker.AdvancedMarkerElement({
        map,
        position: place.location,
        title: place.displayName,
      });

      bounds.extend(place.location);
      console.log(place);
    });
    map.fitBounds(bounds);
  } else {
    console.log("No results");
  }
}

与上一个版本相比,searchByText() 方法支持更多请求选项,包括:

  • includedType,可用于将搜索范围限定为特定地点类型。
  • isOpenNow,可让您限制搜索结果,仅返回营业中的地点。
  • minRating,可让您滤除低于指定限制的结果(例如,仅返回评分至少为 3 星的地点)。
  • locationRestriction,用于忽略指定营业地点以外的结果(也支持 locationBias)。

了解详情