Place Search

Place Search では、テキストのクエリに対して場所のセットを返すテキスト検索(新版)が導入されています。

テキスト検索(新版)は、「渋谷 ピザショップ」「表参道 靴店」「123 番地」といった文字列に対して、場所のセットについての情報を返します。テキスト文字列と、その時点で設定済みの地域バイアスをもとに、場所のリストを返すサービスです。テキスト検索(新版)では、場所のタイプ別の検索、営業時間や評価といった条件を使った絞り込み、特定の地域に限定または優先(バイアス)した検索が可能です。テキスト検索(新版)はまったく新しい機能として構築されており、従来の 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();