Запрос количества объектов инфраструктуры по типу места

Функция PLACES_COUNT_PER_TYPE_V2 возвращает таблицу BigQuery, содержащую количество мест и примеры идентификаторов мест с разбивкой по типам мест для нескольких входных географических объектов. Эта функция предназначена для эффективной пакетной обработки и принимает параметр входной таблицы с географическими данными. Вы указываете географические объекты во входной таблице, а типы мест – в виде массива.

Синтаксис

SELECT * FROM `PROJECT_NAME.LINKED_DATASET_NAME.PLACES_COUNT_PER_TYPE_V2`(
  TABLE input_geographies,
  target_types,
  filters
)

Параметры

  • PROJECT_NAME – название вашего облачного проекта Google Cloud.
  • LINKED_DATASET_NAME – название набора данных BigQuery, содержащего функции Places Insights (например, places_insights___us).
  • input_geographies – таблица BigQuery, содержащая регионы для анализа. В таблице должны быть следующие столбцы:
    • geo_id (STRING): уникальный идентификатор каждого региона.
    • geo (GEOGRAPHY): объект BigQuery GEOGRAPHY, представляющий область. Это может быть точка, многоугольник или другой географический тип.
  • target_types (ARRAY<STRING>): массив строк с типами мест, количество которых вы хотите получить. Места будут учитываться, если они соответствуют любому из типов, перечисленных в массиве types, а не только primary_type.
  • filters (JSON): объект JSON, содержащий пары "ключ-значение" для дополнительной фильтрации мест. Подробнее о параметрах фильтров…

Схема таблицы результатов

Функция PLACES_COUNT_PER_TYPE_V2 возвращает таблицу со следующими столбцами:

Название столбца Тип данных Описание
geo_id STRING Уникальный идентификатор для входной географии из таблицы input_geographies.
input_geography GEOGRAPHY Исходный объект GEOGRAPHY из таблицы input_geographies.
place_type STRING Тип места из массива target_types, который представляет эта строка.
place_count INTEGER Количество мест, соответствующих запросу place_type и другим фильтрам, в пределах или вблизи географического объекта.
sample_place_ids ARRAY<STRING> Массив, содержащий до 250 идентификаторов мест, которые соответствуют критериям для этого типа и географического региона.

В выходных данных будет строка для каждого сочетания geo_id и place_type, указанного в массиве target_types, даже если количество равно нулю.

Принцип работы

Функция обрабатывает каждый регион, указанный в таблице input_geographies. Для каждого региона подсчитываются места, соответствующие любому из типов, перечисленных в массиве target_types, и удовлетворяющие всем условиям в объекте JSON filters. Результаты агрегируются и разбиваются по каждому значению geo_id и каждому типу в target_types.

Пример. Подсчет количества заведений общественного питания разных типов в округах Нью-Йорка

В этом примере создается таблица с количеством ресторанов, кафе и баров в трех округах Нью-Йорка.

SELECT geo_id, input_geography, place_type, place_count
FROM `PROJECT_NAME.places_insights___us.PLACES_COUNT_PER_TYPE_V2`(
  (
    SELECT county_name AS geo_id,
           ST_SIMPLIFY(county_geom, 100) AS geo
    FROM
      `bigquery-public-data.geo_us_boundaries.counties`
    WHERE
      state_fips_code = "36"  -- New York State
      AND county_name IN ("Queens", "Kings", "New York")
  ),
  ['restaurant', 'cafe', 'bar'],  -- target_types
  JSON_OBJECT(
      'business_status', ['OPERATIONAL']
  )
);

В результате вы получите таблицу с девятью строками (три округа, умноженные на три типа). В каждой строке будет указано количество ресторанов, кафе или баров в каждом округе. Вы также можете включить в запрос примеры идентификаторов мест, добавив их в оператор SELECT.

Результаты функции Places Count Per Type для округов Нью-Йорка.

Преимущества использования PLACES_COUNT_PER_TYPE_V2

У PLACES_COUNT_PER_TYPE_V2 есть несколько ключевых преимуществ, особенно по сравнению с устаревшей функцией PLACES_COUNT_PER_TYPE:

  • Пакетная обработка географических объектов. В отличие от метода PLACES_COUNT_PER_TYPE, который обрабатывает по одному географическому объекту за раз, метод PLACES_COUNT_PER_TYPE_V2 принимает TABLE входных географических объектов. Это позволяет анализировать и получать количество объектов определенного типа в разных географических областях (точках, многоугольниках) за один запрос, а не за несколько вызовов функций.
  • Повышенная производительность и масштабируемость. Принимая входные данные в виде таблицы, PLACES_COUNT_PER_TYPE_V2 может использовать оптимизированные геопространственные соединения BigQuery и возможности параллельной обработки для всех предоставленных географических регионов одновременно. Это позволяет значительно повысить производительность и масштабируемость при работе с большим количеством регионов.
  • Включение нулевых значений. Возвращает строки с нулевыми значениями для типов, не найденных в определенной области в пакете, обеспечивая полный набор результатов для всех комбинаций типов и географических регионов.
  • Статистика за прошлые периоды. Запрашивайте данные о количестве мест за определенный месяц, используя необязательный фильтр snapshot_date.

Пример. Запрос количества объектов инфраструктуры по типу за определенный период с использованием фильтров

В этом примере показано, как найти количество мест определенного типа, например станций зарядки ЭМ, за прошлый месяц с помощью параметра snapshot_date. Он применяет дополнительные фильтры для regular_opening_hours, чтобы искать только места, открытые весь день в выходные дни, и доступность зарядки электромобилей (доступно не менее 10 разъемов), указанную в min_ev_charge_connector_count.

SELECT *
FROM `PROJECT_NAME.places_insights___us.PLACES_COUNT_PER_TYPE_V2`(
  (
    SELECT county_name AS geo_id,
           ST_SIMPLIFY(county_geom, 100) AS geo
    FROM
      `bigquery-public-data.geo_us_boundaries.counties`
    WHERE
      state_fips_code = "36"  -- New York State
      AND county_name IN ("Queens", "Kings", "New York")
  ),
  ['electric_vehicle_charging_station'], -- target_types array
  JSON_OBJECT(
    'geography_radius', 10000,
    'snapshot_date', '2026-01', -- Target snapshot month (YYYY-MM)
    'min_ev_charge_connector_count', 10, -- Look for a min amount of chargers
    'regular_opening_hours', JSON_OBJECT(
      'saturday', [JSON_OBJECT('start_time', '00:00', 'end_time', '23:59')], 'sunday', [JSON_OBJECT('start_time', '00:00', 'end_time', '23:59')]
    )
  )
);