Skip to main content

数据集

这个由 Foursquare 提供的数据集可下载, 并可依据 Apache 2.0 许可证免费使用。 它包含超过 1 亿条商业兴趣点 (POI) 记录, 例如商店、餐厅、公园、游乐场和纪念碑。它还包含 这些地点的额外元数据,例如类别和社交媒体 信息。

数据探索

为了探索数据,我们将使用 clickhouse-local 这一小型命令行工具, 它提供了完整的 ClickHouse 引擎,不过你也可以使用 ClickHouse Cloud、clickhouse-client,甚至 chDB 运行以下查询,从存放数据的 S3 bucket 中查询数据:
Query
Response
可以看到,有不少字段为 ᴺᵁᴸᴸ,因此我们可以在 查询中添加一些额外条件,以返回更实用的数据:
Query
运行以下查询,使用 DESCRIBE 查看自动推断的数据 schema:
Query
Response

将数据加载到 ClickHouse

如果你想将数据持久存储到磁盘,可以使用 clickhouse-server 或 ClickHouse Cloud。 要创建该表,请运行以下命令:
Query
请注意,这里有多个列使用了 LowCardinality 数据类型,这会将这些数据类型的内部表示 改为字典编码。对字典编码的数据进行操作,可显著 提升许多应用中 SELECT 查询的性能。 此外,还会创建两个 UInt32 MATERIALIZEDmercator_xmercator_y, 用于将经纬度坐标映射到 Web Mercator projection, 以便更轻松地将地图划分为多个瓦片:
下面我们来逐列说明上面的处理过程。 mercator_x 这一列会将经度值转换为墨卡托投影中的 X 坐标:
  • longitude + 180 将经度范围从 [-180, 180] 平移到 [0, 360]
  • 再除以 360,将其归一化为 0 到 1 之间的值
  • 再乘以 0xFFFFFFFF (十六进制表示的 32 位无符号整数最大值) ,将这个归一化后的值缩放到 32 位整数的完整范围
mercator_y 这一列会将纬度值转换为墨卡托投影中的 Y 坐标:
  • latitude + 90 将纬度范围从 [-90, 90] 平移到 [0, 180]
  • 除以 360 并乘以 pi(),将其转换为三角函数所需的弧度值
  • log(tan(...)) 这一部分是墨卡托投影公式的核心
  • 乘以 0xFFFFFFFF 会将其缩放到完整的 32 位整数范围
指定 MATERIALIZED 可确保 ClickHouse 在我们 INSERT 数据时为这些 列计算好值,而无需在 INSERT statement 中显式指定这些列 (因为它们并不属于 原始 data schema) 。 该表按 mortonEncode(mercator_x, mercator_y) 排序,这会生成 mercator_xmercator_y 的 Z-order 空间填充曲线,从而显著 提升地理空间查询性能。这种 Z-order 曲线排序可确保数据 按空间邻近关系进行物理组织:
为加快搜索速度,还会创建两个 minmax 索引:
如你所见,ClickHouse 具备构建实时地图应用所需的一切! 运行以下查询以加载数据:

数据可视化

要看看这个数据集能实现什么效果,请访问 adsb.exposed。 adsb.exposed 最初由联合创始人兼 CTO Alexey Milovidov 开发,用于将 ADS-B (Automatic Dependent Surveillance-Broadcast) 飞行数据可视化,而这类数据的规模要大 1000 倍。在公司的一次黑客松活动中,Alexey 又将 Foursquare 数据加入了这个工具。 下面是我们最喜欢的一些可视化效果,供你欣赏。
最后修改于 2026年7月3日