SuperAPI AI 工具集

spatial

数据与分析

查看项目

更新于 10-15 00:30

技能介绍

用途

该技能用于借助 DuckDB 回答空间数据相关问题。当用户提到位置、坐标、经纬度(lat/lng)、距离、地图、地址,或“附近”“范围内”等表述时适用。它使用 DuckDB 的 spatial 扩展,并在需要时使用 Overture Maps 作为免费的全球数据源。

主要能力

技能会先对问题进行分类,判断数据来源与关键函数,常见模式包括:

  • “查找 Y 附近的 X”(无用户文件):使用 S3 上的 Overture Maps,配合 ST_Distance_Spheroid 与 bbox 过滤。
  • “A 到 B 有多远”:使用地理编码或用户数据,配合 ST_Distance_Spheroid。
  • “哪些点落在多边形内”:使用用户文件,配合 ST_Contains。
  • “分析这个 GeoJSON/Shapefile/GPX”:使用用户文件,配合 ST_Read 及测量函数。
  • “显示密度/热点”:使用用户数据或 Overture 数据,配合 H3 六边形分箱。
  • “转换为 GeoJSON/GeoPackage”:使用用户文件,配合 COPY TO (FORMAT GDAL)。
  • “统计区域内建筑/道路数量”:使用 Overture Maps,配合 bbox 过滤与聚合。

如果问题涉及真实世界的地点、POI、建筑、道路或边界,且用户未提供文件,则使用 Overture Maps。

使用方式

查询通常以以下语句开始:

LOAD spatial;
SET geometry_always_xy = true;

按需添加扩展:

  • Overture/远程数据:LOAD httpfs; CREATE SECRET (TYPE S3, PROVIDER config, REGION 'us-west-2');
  • H3 六边形分箱:INSTALL h3 FROM community; LOAD h3;

关键原则:

  • 先做 bbox 过滤:查询 Overture 时,始终在任何空间函数之前先按 bbox.xmin/xmax/ymin/ymax 过滤,以利用 Parquet 谓词下推,避免下载完整数据集。
  • 始终设置 geometry_always_xy = true:确保所有空间函数将坐标解释为经度、纬度(Overture、GeoJSON 及大多数数据源的标准)。否则球面函数会假定纬度在前并返回错误结果。
  • 真实世界距离使用球面函数:ST_Distance_Spheroid 在 WGS84 椭球上返回米。普通 ST_Distance 使用平面坐标,对经纬度会给出无意义结果。注意球面函数(ST_Distance_Spheroid、ST_Area_Spheroid 等)需要 POINT_2D 输入,而非通用 GEOMETRY。Overture 的 geometry 列类型为 GEOMETRY('OGC:CRS84'),不能直接转换,需先提取坐标:ST_Point(ST_X(geometry), ST_Y(geometry))::POINT_2D。
  • 含经纬度的 CSV 需要转换:使用 ST_Point(longitude, latitude)(经度在前)。这是最常见的易错点。

查询在单次 bash 调用中运行:

duckdb -c "
LOAD spatial;
<ADDITIONAL_SETUP>
<YOUR_QUERY>
"

结果呈现

  • 表格结果:直接展示数据。
  • 空间结果:可考虑导出为 GeoJSON 以便可视化(COPY TO 'result.geojson' WITH (FORMAT GDAL, DRIVER 'GeoJSON'))。
  • 距离/面积结果:使用人类可读单位(大距离用 km,小距离用 m)。
  • 密度/热点结果:描述模式并提供导出以便可视化。

限制与故障处理

  • duckdb: command not found:转交至 /duckdb-skills:install-duckdb。
  • 缺少扩展:INSTALL spatial; LOAD spatial; 或 INSTALL h3 FROM community; LOAD h3;。
  • S3 访问被拒:建议检查 AWS 凭据。
  • Overture 无结果:扩大 bbox、检查类别拼写,或尝试更宽泛的搜索。

关于 Overture 的 S3 路径与 schema,可参考 references/overture.md;关于空间函数语法,可参考 references/functions.md。