数字花园

常州卫星影像之城:一条数据远征与三把交付钥匙

2026-10-14 · 约 8 分钟 · 常州 · Blender · 卫星影像 · 程序化立面 · 数字孪生

当”摄影测量”与”手工建模”两条路都被封死,一座城还能怎样逼近真实?常州的回答是:把数据源全部换成能拿到的高精度网络数据,让 Agent 跑全自动管线。六条路线,一日走完。

一、路线的分岔

故事的起点是那句约束:“我们只能通过网络数据或者找到对应数据这种,没办法摄影,也不能手工地标之类的,那么路线该怎么走?只靠 ai 和 agent 完成。“谋士先划出天花板:不摄影测量就永远拿不到真实立面纹理,可达的极限是”轮廓精准 + 高度真实 + 屋顶有正射影像贴图 + 立面程序化到以假乱真的中远景”——Google Earth 3D 白模加影像贴图的效果。然后六条路线排序:Overture 建筑高度、Esri/天地图卫星影像、贝壳小区楼层回填、高德 POI 自动标注、Mapillary 街景立面、学术高度数据集交叉校验。用户一声令下:按 1 到 6 开工,直到全部完成。

二、路线 1 的折戟与路线 2 的进军

路线 1(高度)被网络环境阻断,如实记录:Overture 的 DuckDB/libcurl 的 OpenSSL 握手被透明代理拦截(curl 的 schannel 正常,但 258GB parquet 无法全下);Google Open Buildings 按 S2 分片无法定位常州文件;GHSL 的 JRC 服务器不可达。建筑高度仍是 OSM 标签加启发式估算——这是当前模型最大的精度短板,报告里没粉饰。

路线 2(卫星影像)是收益最大的一战:Esri World Imagery 瓦片分批下载——最初 18,303 块的规模在 3.6 瓦片/秒的龟速面前要 85 分钟,改为核心区 z15 加外围 z14(总量降到约 4,400)、并发拉到 32,速度飞到 30 瓦片/秒。透明代理按请求随机断连的阴招也被绕开:Python urllib 的 SSL 被代理破坏,curl 正常——全部改用 curl 子进程。最终 10,381 块瓦片(z14 全境 93% + z15 核心 94%),拼成 16 块 4096² 分块贴图,地形全部替换为真实卫星影像,缺失区用邻域均值填充。

路线 2c(屋顶色)是惊喜:对全部 36,375 栋建筑逐一从卫星影像采样屋顶色,100% 覆盖、量化合并约 200 种材质——新建小区白顶、工业蓝顶、老城红瓦自动区分,一座城的经济地理瞬间可读。

三、路线 4/5/6:立面的革命

路线 4(程序化立面):给建筑网格加两个逐顶点属性——墙面局部高度 wz、墙面水平坐标 wu——材质着色器据此生成窗格与楼板层:住宅 3.2m 层高/4m 开间、玻璃幕墙 3.6m/3.2m、工业 4.5m/8m 疏窗,窗格 roughness/metallic 同步变化;16m 以上平顶建筑加 1.1m 女儿墙。街景视角能看到完整的窗格立面——这是”白模”变”建筑”的一跃。

路线 5(地标精修):天宁宝塔重做——八角十三层、翘角檐口(角点上挑 1.3m,中国宝塔最显著的特征)、相轮塔刹加金色宝珠。

路线 6(POI 标注):从 OSM 提取并精选 52 个标注(6 区县 + 恐龙园/博物馆/大剧院/奥体/运河/太湖/火车站),过滤邻省城市残留与村级标注,独立集合 09_Labels、仅俯视图渲染——固定字号无法同时适配 5km 与 55km 视高,这是被记录在案的取舍。

工程优化也值得一提:MeshBuilder.v() 的 **kwargs 字典传递是 50 倍减速的根源,优化后构建只要 26 秒;633 个材质偏多,屋顶色量化步长粗化到 0.1。

四、三把交付钥匙

71MB 的 blend 对非 Blender 用户不直观,于是有了三把钥匙:

  1. 浏览器查看器:changzhou_web.glb(Draco 加 meshopt 从 267MB 压到 80MB)+ three.js 拖放查看器。调试过程本身是一部侦探小说:页面加载了模型却一片空白——先后排除 rAF 后台标签页节流(手动渲染成功,235 次绘制调用、300 万三角形)、相机 near=5/far=2,000,000 的深度缓冲精度灾难(22km 外每 LSB 约 2km,修正 near=50/far=500000)、最终真凶是 500km 背板与城市的深度差小于深度缓冲一个精度单位,城市被背板整块盖住——导出时用 use_selection 剔除背板,画面完美。
  2. 飞行视频:22 秒、528 帧、1280×720——高空俯冲→市区穿行→宝塔环绕→拉升收尾。Blender 5.2 的坑一路现形:Action API 变了(fcurves 移到 layers/channelbags)、FFMPEG 从 image_settings 里移除(改用 media_type=‘VIDEO’ 加 ffmpeg.format/codec)。
  3. Blender 漫游:视口裁剪距离预设 1000km(大尺度模型最常见的”缩放出去啥都看不见”坑,已存进文件)、飞行模式 WASD+QE、10 个预设机位、09_Labels 可自行开启。

最终 changzhou.blend:71MB、308 万顶点、192 万面、约 200 材质、10 机位。脚本管线完整保留(terrain.py → extract.py → esri_download.py → build_esri_mosaic.py → blender_build.py),改任何参数可全量重跑。

真实坐标

评论

← 数字花园