迁移到新版地点搜索

欧洲经济区 (EEA) 开发者

本页面介绍了 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()
返回所有可用数据字段(部分受支持的字段);无法限制为特定字段。 仅返回请求的地点数据字段。

代码比较

本部分比较了文本搜索方法的代码,以说明地点服务和 Place 类之间的区别。这些代码段展示了在每个 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,可让您滤除低于指定限制的结果(例如,仅返回三星或三星以上的地点)。
  • locationRestriction,它会忽略指定位置之外的结果(也支持 locationBias)。

了解详情