关于 spatial
使用 DuckDB spatial 扩展回答空间问题,可分析用户提供的文件;未提供文件时,可用 Overture Maps 查询地点、建筑、道路或边界。
主要功能
- 01使用 DuckDB 查询空间数据
- 02用 Overture Maps 查询地点信息
- 03分析用户提供的空间文件
- 04执行距离、包含关系和 H3 分析
- 05将空间结果导出为 GeoJSON
适用场景
- 01查找附近地点、建筑或道路
- 02测量地点之间的距离
- 03判断点是否位于多边形内
- 04分析密度或热点
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ duckdb/ duckdb-skills --skill spatial安装后在 Claude Code 中输入/spatial确认已加载。
附带文件references/functions.mdreferences/overture.md
详细介绍
你将使用 DuckDB 的 spatial 扩展,并在需要时使用 Overture Maps 这一免费的全球数据源,回答空间问题。
问题或文件:$0
补充上下文:${1:-}
步骤 1 — 了解用户的需求
对问题进行分类:
| 模式 | 数据源 | 关键函数 |
|---|---|---|
| “查找 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——读取 references/overture.md 了解 S3 路径和架构。
如需空间函数的语法,请读取 references/functions.md。
步骤 2 — 编写并运行查询
始终从以下内容开始:
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('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>
"
步骤 3 — 展示结果
- 对于表格结果:直接展示数据
- 对于空间结果:可考虑导出为 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、检查类别拼写,或尝试更宽泛的搜索