PLACES_COUNT 関数

PLACES_COUNT 関数は、指定された検索エリアと検索フィルタに基づいて、場所の単一のカウント値を返します。PLACES_COUNT 関数には検索エリアを指定する必要があります。必要に応じて、場所のタイプ、営業状況、料金レベルなどの追加のフィルタ パラメータを指定できます。

PLACES_COUNT 関数は単一の値を返すため、SELECT 句を使用して呼び出します。

  • 入力パラメータ:

    • 必須: 検索エリアを指定する geography フィルター パラメーターgeography パラメータは、BigQuery GEOGRAPHY データ型で定義された値を受け取ります。このデータ型は、ポイント、ラインストリング、ポリゴンをサポートしています。

    • 省略可: 検索を絞り込むための追加のフィルタ パラメータ。

  • 戻り値:

    • 単一の count 値(INT64)。

例: 検索半径内の場所の数を計算する

最も簡単な PLACES_COUNT 関数呼び出しでは、地理的エリア内のすべての場所の単一のカウントが返されます。この例では、エンパイア ステート ビルディングから 1, 000 メートル以内の営業中のすべての場所の数を返します。

この例では、BigQuery ST_GEOGPOINT 関数を使用して、ポイントから GEOGRAPHY 値を返します。

SELECT `PROJECT_NAME.places_insights___us.PLACES_COUNT`(
  JSON_OBJECT(
      'geography', ST_GEOGPOINT(-73.9857, 40.7484), -- Empire State Building
      'geography_radius', 1000 -- Radius in meters
      )
) as count;

レスポンスには単一のカウントが含まれます。

ニューヨーク市の Places Count 関数の結果。

一般的な呼び出しでは、検索エリアにフィルタが適用されます。次の例では、フィルタを使用して検索を制限し、次のカウントのみを返します。

  • タイプが restaurant で、最低評価が 3 の場所
  • 料金レベルが安いまたは中程度の場所
  • 現在営業中の場所
  • 犬の同伴が可能な場所
SELECT `PROJECT_NAME.places_insights___us.PLACES_COUNT`(
  JSON_OBJECT(
      'geography', ST_GEOGPOINT(-73.9857, 40.7484), -- Empire State Building
      'geography_radius', 1000, -- Radius in meters
      'types', ["restaurant"],
      'min_rating', 3,
      'price_level', ['PRICE_LEVEL_INEXPENSIVE', 'PRICE_LEVEL_MODERATE'],
      'business_status', ['OPERATIONAL'],
      'allows_dogs', TRUE
      )
) as count;

フィルタされたレスポンス:

ニューヨーク市のレストランの Places Count 関数をフィルタした結果。

場所のデータセット クエリでは、最小カウントのしきい値が 5 に設定されていることに注意してください。場所のカウント関数の利点の 1 つは、0 を含む任意のカウントを返せることです。たとえば、次の呼び出しでは 1 のカウントが返されます。

SELECT `PROJECT_NAME.places_insights___us.PLACES_COUNT`(
  JSON_OBJECT(
      'geography', ST_GEOGPOINT(-73.9857, 40.7484), -- Empire State Building
      'geography_radius', 500, -- Radius in meters
      'types', ["restaurant"],
      'min_rating', 4.0,
      'free_parking_lot', TRUE,
      'good_for_watching_sports', TRUE
      )
) as count;

例: ポリゴンを使用してレストランの数を計算する

ポリゴンを使用して検索エリアを指定できます。ポリゴンを使用する場合、ポリゴンの最初のポイントと最後のポイントが同じになるように、ポリゴンのポイントで閉じたループを定義する必要があります。

この例では、BigQuery ST_GEOGFROMTEXT 関数を使用して、ポリゴンから GEOGRAPHY 値を返します。

DECLARE geo GEOGRAPHY;
SET geo = ST_GEOGFROMTEXT('''POLYGON((-73.985708 40.75773,-73.993324 40.750298,
                                      -73.9857 40.7484,-73.9785 40.7575,
                                      -73.985708 40.75773))''');  -- NYC viewport

SELECT `PROJECT_NAME.places_insights___us.PLACES_COUNT`(
  JSON_OBJECT(
      'geography',geo, -- viewport 
      'types', ["restaurant"],
      'min_rating', 1.0,
      'max_rating', 4.5,
      'min_user_rating_count', 1,
      'max_user_rating_count', 10000,
      'price_level', ['PRICE_LEVEL_INEXPENSIVE', 'PRICE_LEVEL_MODERATE'],
      'business_status', ['OPERATIONAL'],
      'allows_dogs', TRUE
      )
) as count;

ビューポートのレスポンス:

ニューヨーク市のビューポートでレストランの Places Count 関数をフィルタリングした結果。

例: 線を使用してレストランの数を計算する

次の例では、線を中心とした検索半径 100 メートルの接続されたポイントの線を使用して検索エリアを定義します。 この線は、Routes API で計算された移動経路に似ています。ルートは、車両、自転車、徒歩のいずれかになります。

DECLARE geo GEOGRAPHY;
SET geo = ST_GEOGFROMTEXT('LINESTRING(-73.98903537033028 40.73655649223003,-73.93580216278471 40.80955538843361)');  -- NYC line

SELECT `PROJECT_NAME.places_insights___us.PLACES_COUNT`(
  JSON_OBJECT(
      'geography',geo, -- line
      'geography_radius', 100, -- Radius around line
      'types', ["restaurant"],
      'min_rating', 1.0,
      'max_rating', 4.5,
      'min_user_rating_count', 1,
      'max_user_rating_count', 10000,
      'price_level', ['PRICE_LEVEL_INEXPENSIVE', 'PRICE_LEVEL_MODERATE'],
      'business_status', ['OPERATIONAL'],
      'allows_dogs', TRUE
      )
) as count;

線のレスポンス:

ニューヨーク市の線に沿ってレストランの Places Count 関数をフィルタした結果。

例: 複数の呼び出しの結果を結合する

PLACES_COUNT 関数の複数の呼び出しの結果を結合できます。たとえば、特定のエリア内の次の料金レベルのレストランの数を 1 つの結果で表示するとします。

  • PRICE_LEVEL_INEXPENSIVE
  • PRICE_LEVEL_MODERATE
  • PRICE_LEVEL_EXPENSIVE
  • PRICE_LEVEL_VERY_EXPENSIVE"

この例では、各料金レベルに対して PLACES_COUNT 関数を呼び出すループを作成し、各呼び出しの結果を一時テーブルに挿入します。次に、一時テーブルにクエリを実行して結果を表示します。

-- Create a temp table to hold the results.
CREATE TEMP TABLE results (type STRING, count INT64);

-- Create a loop that calls PLACES_COUNT for each price level.
FOR types IN (SELECT type FROM UNNEST(["PRICE_LEVEL_INEXPENSIVE", "PRICE_LEVEL_MODERATE", "PRICE_LEVEL_EXPENSIVE", "PRICE_LEVEL_VERY_EXPENSIVE"]) as type)
DO
  INSERT INTO results VALUES (types.type, `PROJECT_NAME.places_insights___us.PLACES_COUNT`(
  JSON_OBJECT(
      'types', ["restaurant"],
      'geography', ST_GEOGPOINT(-73.9857, 40.7484), -- Empire State Building
      'geography_radius', 1000, -- Radius in meters
      'business_status', ['OPERATIONAL'],
      'price_level', [types.type]
  )));
END FOR;

-- Query the table of results.
SELECT * FROM results;

結合されたレスポンス:

価格帯でレストランをフィルタリングした結果を組み合わせたもの。

別の方法として、UNION ALL コマンドを使用して、複数の SELECT ステートメントの結果を結合することもできます。次の例では、前の例と同じ結果を示します。

SELECT "PRICE_LEVEL_INEXPENSIVE" as price_level, `PROJECT_NAME.places_insights___us.PLACES_COUNT`(
  JSON_OBJECT(
      'types', ["restaurant"],
      'geography', ST_GEOGPOINT(-73.9857, 40.7484), -- Empire State Building
      'geography_radius', 1000, -- Radius in meters
      'business_status', ['OPERATIONAL'],
      'price_level', ['PRICE_LEVEL_INEXPENSIVE']
  )
) as count

UNION ALL

SELECT "PRICE_LEVEL_MODERATE" as price_level, `PROJECT_NAME.places_insights___us.PLACES_COUNT`(
  JSON_OBJECT(
      'types', ["restaurant"],
      'geography', ST_GEOGPOINT(-73.9857, 40.7484), -- Empire State Building
      'geography_radius', 1000, -- Radius in meters
      'business_status', ['OPERATIONAL'],
      'price_level', ['PRICE_LEVEL_MODERATE']
  )
) as count

UNION ALL

SELECT "PRICE_LEVEL_EXPENSIVE" as price_level, `PROJECT_NAME.places_insights___us.PLACES_COUNT`(
  JSON_OBJECT(
      'types', ["restaurant"],
      'geography', ST_GEOGPOINT(-73.9857, 40.7484), -- Empire State Building
      'geography_radius', 1000, -- Radius in meters
      'business_status', ['OPERATIONAL'],
      'price_level', ['PRICE_LEVEL_EXPENSIVE']
  )
) as count

UNION ALL

SELECT "PRICE_LEVEL_VERY_EXPENSIVE" as price_level, `PROJECT_NAME.places_insights___us.PLACES_COUNT`(
  JSON_OBJECT(
      'types', ["restaurant"],
      'geography', ST_GEOGPOINT(-73.9857, 40.7484), -- Empire State Building
      'geography_radius', 1000, -- Radius in meters
      'business_status', ['OPERATIONAL'],
      'price_level', ['PRICE_LEVEL_VERY_EXPENSIVE']
  )
) as count