按地点类型查询 POI 数量

PLACES_COUNT_PER_TYPE_V2 函数会返回一个 BigQuery 表,其中包含多个输入地理位置的地点数量和示例地点 ID,并按地点类型细分。此函数旨在通过 接受 地理位置的输入表参数 来高效地进行批量处理。您可以通过输入表提供地理位置,并将地点类型指定为数组。

语法

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___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 input_geographies 表中的原始 GEOGRAPHY 对象。
place_type STRING 此行所代表的 target_types 数组中的地点类型。
place_count INTEGER 与地理位置内或附近的 place_type 和其他过滤条件匹配的地点数量。
sample_place_ids ARRAY<STRING> 最多包含 250 个地点 ID 的数组,这些 ID 符合此类型和地理位置的条件。

输出将包含 target_types 数组中指定的每个 geo_idplace_type 组合对应的行,即使数量为零也是如此。

运作方式

该函数会处理 input_geographies 表中提供的每个地理位置。 对于每个地理位置,它会统计与 target_types 数组中列出的任何类型匹配且满足 filters JSON 对象中的所有条件的地点数量。 结果会进行汇总,并按 geo_idtarget_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']
  )
);

结果将是一个包含 9 行(3 个县 * 3 种类型)的表。每行都会显示每个县内“餐厅”“咖啡馆”或“酒吧”的数量。您还可以添加示例地点 ID(如果将其添加到 SELECT 语句中)。

纽约各县的“按类型统计地点数量”函数的结果。

使用 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's 优化 地理空间 联接 和并行处理功能,同时处理所有提供的地理位置。这样,在处理大量地理位置时,性能会显著提升,可伸缩性也会更好。
  • 包含零计数 :对于批处理中特定区域内未找到的类型,返回计数为 0 的行,确保所有类型-地理位置组合的结果集完整。
  • 历史快照 :使用可选的 snapshot_date 过滤条件查询特定月份的地点数量数据。

示例:使用特定过滤条件按类型查询历史兴趣点数量

此示例演示了如何使用 snapshot_date 参数检索上个月的数量,以查找特定地点类型(例如电动汽车充电站)的数量。它还应用了 regular_opening_hours 的额外过滤条件,以仅查找周末全天开放的地点,以及由 min_ev_charge_connector_count 指定的电动汽车充电可用性(至少 10 个连接器可用)。

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')]
    )
  )
);