用途
该技能用于借助 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。