Função PLACES_COUNT

A função PLACES_COUNT retorna um único valor de contagem de lugares com base na área de pesquisa e nos filtros especificados. Você precisa especificar a área de pesquisa para a função PLACES_COUNT e pode especificar parâmetros de filtro adicionais, como tipo de lugar, status de funcionamento, nível de preço e muito mais.

Como a função PLACES_COUNT retorna um único valor, chame-a usando uma cláusula SELECT.

  • Parâmetros de entrada:

    • Obrigatório: o parâmetro de filtro geography que especifica a área de pesquisa. O parâmetro geography usa um valor definido pelo tipo de dados GEOGRAPHY do BigQuery, que aceita pontos, linestrings e polígonos.

    • Opcional: outros parâmetros de filtro para refinar sua pesquisa.

  • Retorna:

    • Um único valor count como um INT64.

Exemplo: calcular o número de lugares em um raio de pesquisa

A chamada de função PLACES_COUNT mais simples retorna uma única contagem de todos os lugares em uma área geográfica. Neste exemplo, você retorna a contagem de todos os lugares operacionais em um raio de 1.000 metros do Empire State Building.

Este exemplo usa a função ST_GEOGPOINT do BigQuery para retornar um valor GEOGRAPHY de um ponto.

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;

A resposta contém uma única contagem:

Resultados da função "Contagem de lugares" na cidade de Nova York.

Uma chamada mais típica aplica filtros à área de pesquisa. O exemplo a seguir usa filtros para limitar a pesquisa e retornar apenas uma contagem de:

  • Lugares do tipo restaurant com classificação mínima de 3
  • Um nível de preço barato ou médio
  • Em operação
  • Permite a entrada de cães
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;

A resposta filtrada:

Resultados da função de contagem de lugares de restaurantes em Nova York.

Lembre-se de que as consultas de conjunto de dados de Places exigem um limite mínimo de contagem de 5. Uma das vantagens das funções de contagem de lugares é que elas podem retornar qualquer contagem, incluindo 0. Por exemplo, a chamada a seguir retorna uma contagem de 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;

Exemplo: calcular o número de restaurantes usando um polígono

É possível usar um polígono para especificar a área de pesquisa. Ao usar um polígono, os pontos precisam definir um loop fechado em que o primeiro e o último ponto são iguais.

Este exemplo usa a função ST_GEOGFROMTEXT do BigQuery para retornar um valor GEOGRAPHY de um polígono.

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;

A resposta para a janela de visualização:

Resultados para filtrar a função "Contagem de lugares" de restaurantes em uma janela de visualização da cidade de Nova York.

Exemplo: calcular o número de restaurantes usando uma linha

No exemplo a seguir, você define a área de pesquisa usando uma linha de pontos conectados com um raio de pesquisa de 100 metros ao redor da linha. A linha é semelhante a um trajeto calculado pela API Routes. O trajeto pode ser para um veículo, uma bicicleta ou um pedestre:

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;

A resposta para a linha:

Resultados da função de contagem de lugares de restaurantes ao longo de uma linha na cidade de Nova York.

Exemplo: combinar os resultados de várias chamadas

É possível combinar os resultados de várias chamadas para a função PLACES_COUNT. Por exemplo, você quer um único resultado mostrando o número de restaurantes para os seguintes níveis de preço em uma área específica:

  • PRICE_LEVEL_INEXPENSIVE
  • PRICE_LEVEL_MODERATE
  • PRICE_LEVEL_EXPENSIVE
  • PRICE_LEVEL_VERY_EXPENSIVE"

Neste exemplo, você cria um loop para chamar a função PLACES_COUNT para cada nível de preço e insere os resultados de cada chamada em uma tabela temporária. Em seguida, consulte a tabela temporária para mostrar os resultados:

-- 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;

A resposta combinada:

Resultados combinados para filtrar restaurantes por nível de preço.

Outra opção é usar o comando UNION ALL para combinar os resultados de várias instruções SELECT. O exemplo a seguir mostra os mesmos resultados do exemplo anterior:

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