地点搜索

地点搜索引入了文本搜索(新),该功能可接受文本查询并返回一组地点。

文本搜索(新)可以根据一个字符串(例如,“北京烤鸭”“南京附近的鞋店”或“长安街 8 号”)返回一组地点的相关信息。该服务会返回一列与所指定的文本字符串和任何位置偏向设置相匹配的地点。通过文本搜索(新),您可以按类型搜索地点,使用营业时间和评分等条件进行过滤,还可以使结果限制在或偏向于特定位置。文本搜索(新)是全新开发的服务,可提供比旧版 Places API 更出色的性能和数据质量。

前提条件

若要使用文本搜索(新),您必须在 Google Cloud 项目中启用“Places API(新)”。如需了解详情,请参阅开始使用

文本搜索亮点

文本搜索(新)具有以下改进:

  • 新增了搜索过滤条件,提供许多新的地点类型以及按最低评分进行过滤的功能。
  • 现已支持字段遮盖。
  • 地点字段现在包括评分和评价。

通过文本查询查找地点

调用 searchByText 即可根据文本查询或电话号码返回地点列表。如果查询内容中包含电话号码,则 region 参数应设置为与发出请求的网域相同的区域。例如,如果您使用电话号码搜索日本的某个地点,而发出请求的网域是 jp,则必须将 region 参数设置为“jp”。如果请求中省略了 region,该 API 会默认设为美国 (us) 区域。

您可以使用 fields 参数指定一个逗号分隔列表,其中包含一个或多个采用驼峰命名法的数据字段

下例展示了如何调用 searchByText 来根据文本查询查找地点。

TypeScript

let map;
let center;

async function initMap() {
    const { Map } = await google.maps.importLibrary("maps") as google.maps.MapsLibrary;

    center = {lat: 37.4161493, lng: -122.0812166};
    map = new Map(document.getElementById('map') as HTMLElement, {
        center: center,
        zoom: 14,
        // ...
    });

    findPlaces();
}

async function findPlaces() {
    const { Place } = await google.maps.importLibrary("places") as google.maps.PlacesLibrary;
    //@ts-ignore
    const { AdvancedMarkerElement } = await google.maps.importLibrary("marker") as google.maps.MarkerLibrary;
    const request = {
        textQuery: 'Tacos in Mountain View',
        fields: ['displayName', 'location', 'businessStatus'],
        includedType: 'restaurant',
        isOpenNow: true,
        language: 'en-US',
        maxResultCount: 7,
        minRating: 3.2,
        region: 'us',
        useStrictTypeFiltering: false,
    };

    //@ts-ignore
    const { places } = await Place.searchByText(request);

    if (places.length) {
        console.log(places);

        const { LatLngBounds } = await google.maps.importLibrary("core") as google.maps.CoreLibrary;
        const bounds = new LatLngBounds();

        // Loop through and get all the results.
        places.forEach((place) => {
            const markerView = new AdvancedMarkerElement({
                map,
                position: place.location,
                title: place.displayName,
            });

            bounds.extend(place.location);
            console.log(place);
        });

        map.setCenter(bounds.getCenter());

    } else {
        console.log('No results');
    }
}

initMap();

JavaScript

let map;
let center;

async function initMap() {
  const { Map } = await google.maps.importLibrary("maps");

  center = { lat: 37.4161493, lng: -122.0812166 };
  map = new Map(document.getElementById("map"), {
    center: center,
    zoom: 14,
    // ...
  });
  findPlaces();
}

async function findPlaces() {
  const { Place } = await google.maps.importLibrary("places");
  //@ts-ignore
  const { AdvancedMarkerElement } = await google.maps.importLibrary("marker");
  const request = {
    textQuery: "Tacos in Mountain View",
    fields: ["displayName", "location", "businessStatus"],
    includedType: "restaurant",
    isOpenNow: true,
    language: "en-US",
    maxResultCount: 7,
    minRating: 3.2,
    region: "us",
    useStrictTypeFiltering: false,
  };
  //@ts-ignore
  const { places } = await Place.searchByText(request);

  if (places.length) {
    console.log(places);

    const { LatLngBounds } = await google.maps.importLibrary("core");
    const bounds = new LatLngBounds();

    // Loop through and get all the results.
    places.forEach((place) => {
      const markerView = new AdvancedMarkerElement({
        map,
        position: place.location,
        title: place.displayName,
      });

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

initMap();