このページでは、Place クラス(新規)と PlacesService(以前のクラス)のテキストベースのプレイス検索機能の違いについて説明し、比較用のコード スニペットをいくつか紹介します。
以前の PlacesService には、次のテキストベースの検索メソッドがあります。
- テキスト クエリを受け取り、単一の場所の結果を返す findPlaceFromQuery()メソッド。場所データ フィールドの使用をサポートしています。
- 電話番号を使用して場所を検索できる findPlaceFromPhoneNumber()メソッド。場所データ フィールドの使用をサポートしています。
- テキスト クエリを受け取り、場所の結果のリストを返す textSearch()メソッド。textSearch()は古く、プレイス データ フィールドの使用をサポートしていません。
新しい Place クラスには Place.searchByText() メソッドが用意されています。このメソッドを使用すると、テキストクエリまたは電話番号で場所を検索できます。また、定期的に更新される場所データ フィールドと場所のタイプの選択肢を拡大して、検索をカスタマイズすることもできます。
次の表に、Place クラスと PlacesService の間の場所検索方法の主な違いをいくつか示します。
| PlacesService(レガシー) | Place(新規) | 
|---|---|
| findPlaceFromQuery()findPlaceFromPhoneNumber() | searchByText() | 
| FindPlaceFromQueryRequestFindPlaceFromPhoneNumberRequest | SearchByTextRequest | 
| クエリ オプションが制限されています。 | より広範なクエリ オプション。 | 
| 結果オブジェクトと google.maps.places.PlacesServiceStatusレスポンスを処理するためにコールバックを使用する必要があります。 | Promise を使用し、非同期で動作します。 | 
| PlacesServiceStatusチェックが必要です。 | ステータス チェックは不要で、標準のエラー処理を使用できます。詳細 | 
| 位置情報のバイアスのみをサポートします。 | 位置情報のバイアスと位置情報の制限をサポートします。 | 
| プレイス データ フィールドはスネークケースでフォーマットされます。 | プレイス データ フィールドは、キャメルケースでフォーマットされます。 | 
| 単一のプレイス結果を返します。 | 最大 20 件の場所の結果を返します。 | 
| 場所タイプと場所データ フィールドの固定セットに限定されます。 | 定期的に更新される場所のタイプと場所のデータ フィールドの選択肢が拡大されます。 | 
| textSearch() | searchByText() | 
| 利用可能なすべてのデータ フィールド(サポートされるフィールドの一部)を返します。特定のフィールドに制限することはできません。 | リクエストされたプレイス データ フィールドのみを返します。 | 
コードの比較
このセクションでは、テキスト検索メソッドのコードを比較して、Places Service と 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);
    }
  });
}
その他の情報
- コードサンプルの全文を見る
- 詳しくは、こちらのドキュメントをご覧ください。
- FindPlaceFromQueryRequestインターフェース リファレンス
テキスト検索(新版)
次のコード スニペットは、searchByText() メソッドを使用して場所を検索する方法を示しています。リクエストは非同期であり、ステータス チェックは必要ありません(標準のエラー処理を使用できます)。この例では、リクエストに 8 の maxResultCount が含まれています(値は 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もサポートされています)。