2026-09-12 · 原文发布日
用聊天代理生成家门口的跑步环线
Simon Willison演示了一个具体玩法:告诉ChatGPT Work(GPT-6 Astra)自己的住址,让它基于OpenStreetMap数据规划从家出发的5K和10K环形跑步路线。代理用Nominatim定位地址、Overpass拉取本地道路数据后离线计算环线,产出嵌入式地图可视化和可下载的GPX、GeoJSON文件。他还提醒对话压缩后可能无法再取回运行过的代码。
原文要点
Simon Willison让ChatGPT Work(GPT-6 Astra,Max档)根据他的住址生成从家出发的5K和10K跑步环线。代理运行约27分钟(作者自述耗时),用Nominatim定位地址、Overpass下载本地OpenStreetMap道路数据后离线计算环线,产出嵌入式地图和可下载的GPX、GeoJSON文件。地图由visualize技能生成/workspace/el-granada-5k-share.html,内嵌GeoJSON几何数据并用白名单CDN加载D3渲染。他事后想要代理跑过的Python代码时,因对话被压缩(compaction)已无法取回。
这次做成什么
在ChatGPT Work(GPT-6 Astra)里让代理基于OSM数据生成家门口的5K/10K跑步环线,拿到GPX/GeoJSON文件和嵌入式地图;并采用本站设计的『先存代码再跑图』顺序,避免对话压缩后丢失运行代码。
准备什么
- 有带代理执行和visualize技能的ChatGPT Work账号(作者使用GPT-6 Astra Max档)
- 一个可定位的真实住址或用于练习的公开地址(可用地标代替门牌)
- 能下载对话生成的文件,并有可导入GPX的运动手表App或地图工具
具体怎么做
新开对话并发出完整路线提示词
在ChatGPT Work新建对话,把下方材料中的提示词整段粘贴,把占位地址换成你的住址或练习地址。提示词里已写明『先把将要用到的代码保存为可下载文件,再计算路线』,这是防压缩丢代码的关键,不要省略。
确认定位结果再让代理继续
代理会先用Nominatim定位地址。看到它给出的定位坐标后,核对是否是你家附近;若偏到别的城市,直接纠正地址表述(加城市名和行政区)再让它重跑,避免基于错误坐标白跑。
等待代理拉取OSM数据并离线计算环线
代理经Overpass下载附近道路和小径数据后在本地计算环线。作者案例中耗时27分钟,这只是作者当次耗时,不代表保证时限。期间不要开新话题打断,减少上下文被压缩的风险。
立即下载代码副本和路线文件
生成完成后第一时间下载代理保存的Python代码文件、GPX和GeoJSON文件。原作者就是因为事后才想起要代码、对话已被压缩而拿不回来,本站把这一步提前到每次生成后立刻执行。
核对地图并把GPX导入运动工具
查看对话内嵌入式地图(visualize技能生成的HTML,内嵌GeoJSON并用D3渲染),确认环线闭合、里程接近目标。再把GPX导入手表App或地图工具,核对实际距离与可跑性。
可直接复制的材料
家门口跑步环线完整提示词(含先存代码要求)
本站独立编写,结构参考作者做法但非原文提示词;只需替换地址占位部分。
我住在:<在这里填你的地址,练习时可用公开地标,例如 上海市徐汇区漕溪北路与日晖东路路口附近>。
请基于OpenStreetMap数据,为我规划从该住址出发并最终回到起点的5公里和10公里两条跑步环线。具体要求:
1. 先用Nominatim定位该地址并告诉我定位到的坐标,等我确认后再继续。
2. 用Overpass下载周边道路和人行小径数据,然后在本地计算闭合环线,优先走人行道、公园小径,避开主干道。
3. 在计算之前,把你将要用到的完整Python代码先保存为一个可下载的文件提供给我;之后如有改动,保存最终版再给我一次。
4. 输出:一张嵌入式地图可视化(两条线用不同颜色)、每条线的实际里程和途经要点说明,以及可下载的GPX和GeoJSON文件各一份。
5. 里程允许有小幅误差,但请明确告诉我每条线的实际计算里程。独立迷你路线地图HTML示例
本站独立编写的最小演示,坐标为虚构上海某街区环线;visualize技能白名单CDN包含cdn.jsdelivr.net,与本示例加载D3的方式一致。替换route-data里的坐标即可换成自己的环线。
<!DOCTYPE html>
<html lang="zh">
<head><meta charset="utf-8"><title>示例:5K环线</title>
<script src="https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js"></script>
<style>#map{width:100%;max-width:640px} text{font-size:12px}</style>
</head>
<body>
<div id="map"></div>
<script type="application/json" id="route-data">
{"route":{"type":"LineString","coordinates":[[121.4365,31.1880],[121.4382,31.1891],[121.4401,31.1884],[121.4398,31.1862],[121.4376,31.1855],[121.4365,31.1880]]}}
</script>
<script>
const data=JSON.parse(document.getElementById('route-data').textContent);
const coords=data.route.coordinates;
const w=640,h=420;
const proj=d3.geoMercator().fitSize([w,h],data.route);
const line=d3.line().x(d=>proj(d)[0]).y(d=>proj(d)[1]);
const svg=d3.select('#map').append('svg').attr('viewBox',`0 0 ${w} ${h}`);
svg.append('path').attr('d',line(coords)).attr('fill','none').attr('stroke','#e05252').attr('stroke-width',3);
svg.append('circle').attr('cx',proj(coords[0])[0]).attr('cy',proj(coords[0])[1]).attr('r',5).attr('fill','#2b7a2b');
svg.append('text').attr('x',proj(coords[0])[0]+8).attr('y',proj(coords[0])[1]).text('起点/终点');
</script>
</body>
</html>输入与输出示例
本站虚构演示,坐标与里程均为示意值,非作者结果,也未实际调用代理。
输入
练习地址填『成都市武侯区锦里古街正门附近』,要求规划一条5公里环线并给出GPX文件。对应输出
示意输出:定位坐标 30.6415, 104.0487;环线『锦里—洗面桥—浆洗街小环』,实际里程 5.2 km,途经 6 个途经点;GPX文件开头:<gpx version="1.1"><trk><name>jinli-5k-loop</name><trkseg><trkpt lat="30.6415" lon="104.0487"></trkpt>…</trkseg></trk></gpx>;另附同名GeoJSON和内嵌彩色地图。做完检查这些
- 代理先返回Nominatim定位坐标并等待确认,而不是直接出图
- 在对话被压缩或结束前,已成功下载至少一版可打开的Python代码文件
- GPX文件能导入运动手表App或地图工具,且显示为闭合环线
- 嵌入式地图能渲染路线,且附带OpenStreetMap版权署名
容易卡住的地方
- 对话压缩后历史上下文可能丢失,运行过的代码可能无法再取回,必须先存代码
- 模型生成的环线里程可能与目标有偏差,需以它报告的实际计算里程为准,不要假设精确等于5.0公里
- OSM数据在部分区域覆盖不全,郊区或新修道路可能算不出理想环线
- 代理运行耗时不可预估,作者自述27分钟仅为其当次情况,不能当作通过时限
- 嵌入式HTML只能加载白名单CDN(如cdn.jsdelivr.net等)的脚本,自建可视化时外部域名会被静默拦截
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Generating running routes with GPT-6 Astra and ChatGPT Work
- 原作者
- Simon Willison
- 原始发布日期
- 2026-09-12
- 来源
- https://simonwillison.net/2026/Sep/12/astra-running-routes/