Я бы предложил использовать GeoHa sh. Демонстрируя это на NY C данные такси и группировка по часам во времени:
WITH top_pickup_locations AS (
SELECT
TIMESTAMP_TRUNC(pickup_datetime, HOUR) AS hour,
ST_GeoHash( ST_GeogPoint(pickup_longitude, pickup_latitude), 15 ) AS geohash,
COUNT(*) AS num_pickups
FROM `bigquery-public-data.new_york.tlc_green_trips_2013`
GROUP BY hour, geohash
ORDER BY num_pickups DESC
LIMIT 10
)
SELECT
hour,
ST_GeogPointFromGeoHash(geohash),
num_pickups
FROM top_pickup_locations
Чтобы узнать больше о GeoHa sh, см. Здесь: https://en.wikipedia.org/wiki/Geohash Увеличьте количество символы (я использую 15) для контроля точности.
Другой альтернативой является использование ST_SnapToGrid () вместо geoha sh:
WITH top_pickup_locations AS (
SELECT
TIMESTAMP_TRUNC(pickup_datetime, HOUR) AS hour,
ST_ASGeoJson(ST_SnapToGrid( ST_GeogPoint(pickup_longitude, pickup_latitude), 0.0001)) AS cellid,
COUNT(*) AS num_pickups
FROM `bigquery-public-data.new_york.tlc_green_trips_2013`
GROUP BY hour, cellid
ORDER BY num_pickups DESC
LIMIT 10
)
SELECT
hour,
ST_GeogFromGeoJson(cellid),
num_pickups
FROM top_pickup_locations
Когда я это сделал, метод geoha sh занимал 11 секунд времени слота, в то время как метод привязки к сетке занимал 57 секунд времени слота. 15 символов геоха sh и 4 цифры лат-лона примерно одинаковы по количеству групп.