数据库
涉及位置/坐标/距离/地图/地理文件时,用 DuckDB…
当用户提到位置、坐标、lat/lng、距离、地图、地址、附近/范围内/最近、地名或 GeoJSON/Shapefile/GeoPackage/GPX/GeoParquet 等空间数据时,用 DuckDB spatial(必要时加 Overture Maps)做空间查询、计算、分析和格式转换。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
涉及位置/坐标/距离/地图/地理文件时,特定
解决思路
- 使用 DuckDB 的 spatial 扩展回答空间问题;需要时使用 Overture Maps 作为免费全球数据源。
- 接收参数:问题或文件为 `$0`,额外上下文为 `${1:-}`。
- 第 1 步:理解用户需求,按问题模式分类。
- “Find X near Y”(没有用户文件):数据源用 Overture Maps on S3,关键函数用 `ST_Distance_Spheroid` 和 bbox filtering。
- “How far between A and B”:数据源用 Geocode 或用户数据,关键函数用 `ST_Distance_Spheroid`。
- “Which points fall inside polygons”:数据源用用户文件,关键函数用 `ST_Contains`。
- “Analyze this GeoJSON/Shapefile/GPX”:数据源用用户文件,关键函数用 `ST_Read` 和测量函数。
- “Show density/hotspots”:数据源用用户数据或 Overture 数据,关键方法用 H3 hex binning。
- “Convert to GeoJSON/GeoPackage”:数据源用用户文件,关键方法用 `COPY TO (FORMAT GDAL)`。
- “Count buildings/roads in area”:数据源用 Overture Maps,关键方法用 bbox filtering + aggregation。
- 如果问题涉及现实世界地点、POI、建筑、道路或边界,且用户没有提供文件,则使用 Overture Maps;读取 `references/overture.md` 获取 S3 路径和 schema。
- 需要空间函数语法时,读取 `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 hex binning 使用 `INSTALL h3 FROM community; LOAD h3;`。
- 关键原则:查询 Overture 时先做 bbox filtering,始终在任何空间函数之前过滤 `bbox.xmin/xmax/ymin/ymax`;这利用 Parquet predicate pushdown,避免下载完整数据集。
- 关键原则:始终设置 `geometry_always_xy = true`;这确保所有空间函数把坐标解释为 longitude, latitude(Overture、GeoJSON 和多数数据源的标准)。不设置时,spheroid 函数会假定 latitude 在前并返回错误结果。
- 关键原则:现实世界距离使用 spheroid 函数;`ST_Distance_Spheroid` 在 WGS84 椭球上返回米。普通 `ST_Distance` 使用平面坐标,对 lat/lng 会得到无意义结果。
- 重要:spheroid 函数(`ST_Distance_Spheroid`、`ST_Area_Spheroid` 等)需要 `POINT_2D` 输入,而不是通用 `GEOMETRY`。Overture geometry 列类型为 `GEOMETRY('OGC:CRS84')`,不能直接 cast;先提取坐标:`ST_Point(ST_X(geometry), ST_Y(geometry))::POINT_2D`。
- 关键原则:带 lat/lng 的 CSV 需要转换;使用 `ST_Point(longitude, latitude)`(longitude 在前)。这是最常见的坑。
- 在单个 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 access denied 时,建议检查 AWS credentials。
- 如果查询失败:Overture 无结果时,扩大 bbox、检查 category 拼写,或尝试更宽泛的搜索。
适用边界 · 注意事项
- 不适用于完全不涉及位置、坐标、距离、地图、地址、地理文件或空间分析的问题。
- 若既无法运行/安装 DuckDB,也没有可用的本地空间数据或 Overture/S3 访问条件,则不适合用此技能。