Isopolis:一整座旧金山的等距像素地图
文章摘要
Isopolis 是一张可连续缩放、可点击的旧金山等距像素艺术地图,覆盖全城约 121 平方公里,展开后相当于一张 220 亿像素(22 gigapixel)的巨图。作者 nuwandavek 受此前的 isometric.nyc 项目启发,同时想复刻美剧《硅谷》片头那个又好笑又精准的城市镜头,于是决定给旧金山做一版。地图页面本身只是一个交互式画布,真正的干货全在作者写的技术报告 sf.isopolis.city/dev.html 里——他自称这篇报告「约 90% 由人类撰写」。
整条流水线分五步。第一步是渲染底图:数据源是 Google 的 Photorealistic 3D Tiles,Claude Code 帮他写了个抓取器,用 three.js 流式渲染这些 3D 瓦片。全城共用一台正交相机,方位角 22.5°、俯仰角 30°,这个角度纯凭肉眼比对试出来,目标就是经典的《模拟城市》视角。瓦片纹理里已经烘焙了光照,再打一遍光就会「双重曝光」——这个坑他是踩过才知道的。最终产出 440 块 1024² 的渲染图。由于抓取行为其实违反 Google 的服务条款,worker 频繁被限流,他让 Claude Code 盯着错误率和渲染耗时反复调优,把单块渲染从约 3 分钟压到约 20 秒。
第二步是造训练数据:用 Google 的 Nano Banana 生成吉卜力风格的像素艺术图作为「标准答案」。风格一致性是最大难题,他先用 Pro 模型精调出 8 张参考图并冻结,之后所有生成都以这 8 张为参考,最终人工筛出 101 对图像,图像生成总花费约 4 美元。水面是另一个噩梦:正交视角下的开阔水域是十万个近乎相同的像素,模型学不会,只会往里面幻觉出建筑。他用启发式规则生成水体掩膜,并在校准时发现深水(色相 190–197、饱和度 0.57–0.69)和浅绿松石色水(饱和度 0.34–0.38)会跟街道阴影混淆,最后靠亮度这一维把两者区分开。他还引入了一个关键的「补全扩展」训练目标:把每张训练图切成四象限,用 4 位二进制编码 15 种「哪些象限已生成」的上下文模式,强迫模型学会延续已有像素艺术而非独立生成,101 对 × 15 种模式 = 1515 个训练样本。
第三步是训练:底模选 Qwen-Image-Edit-2511(Apache 2.0,200 亿参数的图生图模型),冻结底模,只在注意力投影上加秩为 16 的 LoRA 残差,约 5500 万可训练参数、占 Transformer 的 0.28%,训练器是他手写的约 500 行 diffusers + peft + accelerate 代码。跑在 Modal 的 serverless H100 上,每轮 2000 步、约 2–3 小时、成本 10–15 美元。LoRA 权重仅约 200 MB,而底模是 40 GB。
第四步是全城推理与拼接:独立生成的分块虽然几何对得上,却不共享风格和调色板。解法是滑动窗口——每次平移半张图生成下一块,正好对应训练时的补全目标。Claude Code 写了个贪心的接缝规划器,从若干「种子」块出发生长全城,440 块最终变成 67 波、1519 次生成。全是水的窗口直接跳过改用「水印章」填充,因为模型面对空白水域会自信地画出更多城市。金门大桥太过独特、完全在分布之外,最后有一半是直接用 Nano Banana 生成后贴上去的。人工复查约 1 小时,标记了约 200 个待重生成的象限。最终发布 2630 个象限(1606 个生成 + 1024 个水印章),做成九层的经典地图瓦片金字塔。
第五步是查看器:没用任何地图库——这是固定的局部 ENU 二等角投影而非墨卡托,MapLibre 或 deck.gl 会把像素艺术重采样毁掉。核心是手写的小型 canvas 引擎,底下垫着 45% 透明度的 CARTO 深色底图,让你缩小时能看到可辨认的整个湾区。标注、街区多边形、导览路线全是 GeoJSON 数据而非代码,整个应用状态存在 URL hash 里,任何视角都能分享。全站静态文件,S3 + CloudFront 托管。作者在致谢里坦承,代码约 30% 由 Claude Opus 5、40% 由 Claude Fable 5、30% 由 GPT-5.6-Sol 写成,「独自做这件事要花 10 倍时间,而且几乎肯定会烂尾在第二步附近」。
HN 评论精华
这是一条 Show HN,348 分、81 条评论,作者 nuwandavek 全程在评论区回复。
赞叹派占多数。 greatony 说「BGM、音效、视觉全都完美,我最喜欢那架拖横幅的飞机,这太旧金山了」。accrual 说这让他想起《模拟城市 2000》,还喜欢能点击街区看信息。jtfrench 从游戏开发者角度评价:「做过游戏开发的人都知道好的等距地图有多难做,你正面硬扛下来了,做得漂亮。」murphyslab 把它类比为可无限浏览的巨型像素艺术 Floor796。simonw 引用作者那句「我为副业项目的黄金时代感到兴奋」并回应「我也是」,作者则回复「深受你启发」。
Bug 挖掘串很热闹。 montag 指出 Starr King 公园莫名变成了湖,flomo 说 Buena Vista 公园东边那个「湖」其实是环公园的马路,cyanregiment 则说 Tenderloin 区凭空多了几个巨大的方形池塘。作者对每一条都认领并解释:变成湖的主要是两类区域——阴影,以及平坦的绿地;他的水体检测器不够好,需要更好的训练数据分布。多位用户要求放大更多层级,作者当场表示「本来是嫌像素太糊不好意思」,随后回帖「更多缩放已开放」。cyanregiment 还建议整体加一层偏黄的滤镜,「少一点 #127614,多一点 #73ba14,这样看起来才不像伊利诺伊州」。
批评声也相当直接。 vortegne 说「居然有人吃这一套,这既不是像素艺术也不是任何艺术,就是一坨模糊的乱码」。hasyimibhar 一句「抱歉,这不是像素艺术」。burnoutdv 的批评最系统:跟纽约那个一样,不够精细,甚至可以说是 slop(AI 垃圾)——线条歪扭、设计模糊;他认为叫像素艺术就该像素级精确,而不是「乍一看像像素艺术的随便一张图」,创意不错但执行需要更多打磨甚至手工雕琢。
关于「地形太平」的争论最有技术含量。 rob74 提出:以陡坡闻名的城市看起来居然如此平坦,而且只有街区和地标、没有街道名和公交线路。sgt 断言「这是 vibe coded 的,LLM 很难理解高程和等距显示」,并称自己最近做等距地图时 Opus 在高程变化上「几乎毫无用处,折腾了我好几天」。notpushkin 反驳得很到位:「是 vibe coded 但不是 slop,这里有大量人类输入。要么作者忽略了高程问题,要么是刻意决定,但你不能把这个赖在『LLM 不懂等距 3D』上。」RugnirViking 则直接引用作者的技术报告佐证——「所有地图数学都发生在单一固定平面上……预期效果是经典的模拟城市视角」,说明这是设计选择。
版权问题被提了出来。 yreg 问:基于 Google Earth 参考照片、由扩散模型生成的风格化素材,最终产物能算公有领域吗,还是 Google、Airbus 仍持有权利?jcarrano 的回复很 HN:「跟 Google 拿所有人的照片去训练模型时的『合理使用』是同一种。」
同类项目串被延伸出一长串:wxw 提到作为灵感来源的 isometric.nyc,并说这可以当作衡量 agent/模型进步的轶事级基准;Zaheer 贴了 Levels.fyi 的 atlas;codetiger 展示了自己用公开地形高程数据做的体素版 Google Earth;EZ-Cheeze 推荐了 Ars Technica 那篇关于高倾角卫星影像的文章,作者回了句「哇,这些也太美了」。也有人许愿:qurren 想要用这张地图做导航应用,chaostheory 想在开车时看到这个视图。最后 cpfohl 留下一句朴素的抱怨:「不想要的声音!这不酷。」