跳到主要内容
跳到主要内容

Foursquare 地点

Dataset

此数据集由 Foursquare 提供,您可以在 下载 的同时,依据 Apache 2.0 许可证免费使用。

它包含超过 1 亿条商业兴趣点 (POI) 记录,涵盖商店、餐馆、公园、游乐场和纪念碑等。同时,它还包括这些地点的额外元数据,例如类别和社交媒体信息。

Data exploration

为了探索数据,我们将使用 clickhouse-local,这是一个小型命令行工具,提供完整的 ClickHouse 引擎,您也可以使用 ClickHouse Cloud、clickhouse-client 或者 chDB

运行以下查询以从存储数据的 S3 存储桶中选择数据:

我们看到有相当多的字段为 ᴺᵁᴸᴸ,因此可以在查询中添加一些额外条件,以获取更多可用数据:

运行以下查询以使用 DESCRIBE 查看数据的自动推断模式:

Loading the data into ClickHouse

如果您希望将数据持久化到磁盘,可以使用 clickhouse-server 或 ClickHouse Cloud。

要创建表,请运行以下命令:

请注意对多个列使用 LowCardinality 数据类型,这会将数据类型的内部表示更改为字典编码。使用字典编码数据可以显著提高许多应用程序中 SELECT 查询的性能。

此外,还创建了两个 UInt32 MATERIALIZEDmercator_xmercator_y,它们将经纬度坐标映射到 Web Mercator 投影,以便更轻松地将地图分段为瓦片:

让我们逐一解析上述每个列的作用。

mercator_x

此列将经度值转换为 Mercator 投影中的 X 坐标:

  • longitude + 180 将经度范围从 [-180, 180] 移动到 [0, 360]
  • 除以 360 将其归一化到 0 和 1 之间的值
  • 乘以 0xFFFFFFFF(最大 32 位无符号整数的十六进制表示)将此归一化值按比例缩放到 32 位整数的完整范围

mercator_y

此列将纬度值转换为 Mercator 投影中的 Y 坐标:

  • latitude + 90 将纬度从 [-90, 90] 移动到 [0, 180]
  • 除以 360 并乘以 pi() 将其转换为三角函数所需的弧度
  • log(tan(...)) 部分是 Mercator 投影公式的核心
  • 乘以 0xFFFFFFFF 将其缩放到完整的 32 位整数范围

指定 MATERIALIZED 确保在 INSERT 数据时 ClickHouse 计算这些列的值,而不需要在 INSERT 语句中指定这些列(它们并不是原始数据模式的一部分)。

该表按 mortonEncode(mercator_x, mercator_y) 排序,以生成 mercator_xmercator_y 的 Z-order 空间填充曲线,以显著提高地理空间查询性能。此 Z-order 曲线排序确保数据根据空间接近度物理组织:

还为更快的搜索创建了两个 minmax 索引:

如您所见,ClickHouse 拥有您进行实时映射应用所需的一切!

运行以下查询以加载数据:

Visualizing the data

要查看此数据集的各种可能性,请访问 adsb.exposed。adsb.exposed 最初是由共同创始人兼首席技术官 Alexey Milovidov 创建的,用于可视化 ADS-B(自动依赖监视广播)航班数据,数据量是 1000 倍。 在一次公司黑客马拉松中,Alexey 将 Foursquare 数据添加到该工具中。

以下是一些我们喜欢的可视化,供您欣赏。