迁移到新版地点搜索

欧洲经济区 (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)。

了解详情