卫星地图变三维城市模型

SKILL前端设计
前端设计 未标注权限 许可证不明确
安装这个技能

把一片真实区域的卫星影像 + OpenStreetMap 数据,做成《口袋城市 2》风格的三维城市模型图(单文件 HTML,three.js 真 3D 鸟瞰)。当用户说「按这个模型的形式,用 XX 的卫星地图生成一幅模型图」「把某个城市做成口袋城市风格」「卫星影像转低多边形 3D 城市」,或给出中心经纬度要求生成可交互城市模型时使用。产出带多视角切换、图层开关、地名标注的交互式 HTML,附色卡校验与无头渲染验证脚本。

一句话选型结论

按资料字段整理

卫星地图变三维城市模型是前端设计类的 Agent Skill,安装方式未标注,权限级别未标注,许可证不明确,有可直接复制的安装命令。技能本质是给模型读的说明书,效果取决于模型与客户端;装完先用一个小任务验证,再放进正式流程。

分类前端设计 安装方式未标注 权限级别未标注权限 许可证许可证不明确
累计安装 未标注 本周 未标注
GitHub 星标 未标注 仓库 未标注
下载量 未标注 技能市场下载数
权限级别 未标注权限 安装前请确认风险范围
许可证 许可证不明确 未说明

安装

未标注
在支持 Skills 的客户端里执行,装完问一句「你有哪些技能」验证
skillhub install user_5dad3775/satellite-city-model
  1. 1
    确认客户端支持

    确认你的客户端支持 Skills(Claude、Codex、Cursor 等),并升级到较新的版本。

  2. 2
    拿到技能文件

    执行上面的命令安装;也可以把仓库里的 SKILL.md 手动放进客户端的 skills 目录。

  3. 3
    刷新技能列表

    重新打开客户端,或刷新技能列表,让新放进来的技能被加载。

  4. 4
    验证是否生效

    问一句「你有哪些技能」,确认列表里出现它,再拿一个小任务试跑。

技能档案

前端设计
字段来自技能仓库与公开索引,中文说明由本站标注
作者 / 维护方user_5dad3775仓库 未标注 · 版本 未标注
宿主客户端未标注技能可被这些客户端加载
安装方式未标注安装包 community
权限级别未标注权限安装前请确认风险范围
许可证未说明许可证不明确,商用前请自行确认条款
仓库可用性available技能仓库当前是否可访问
最近核验未标注上游最后核验时间 · 数据更新 1791683879
正文体量13.1 KBSKILL.md 原文大小,越大说明说明书写得越细

典型使用场景

3 类
按分类整理的常见用法,具体以 SKILL.md 为准
出页面与组件

按描述生成页面结构和组件草稿。

调整样式与布局

改间距、配色与响应式布局。

生成设计说明

把设计稿整理成开发能接的说明。

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 有可直接复制的安装命令,不用自己翻文档找入口。

先想清楚的地方

  • 没有标注权限级别,实际能做什么要装好后确认。
  • 许可证不明确,商用或二次分发前先到仓库确认条款。
  • 没有做站内核验,内容以作者仓库为准。
  • 技能只是说明书,实际效果取决于模型与客户端,装完先用小任务试一遍。

更适合

  • 需要在前端设计场景里给模型补一套做法的人。
  • 愿意先读一遍 SKILL.md、确认它会让模型做什么的人。

不太适合

  • 对许可证要求很严、必须明确可商用的人。
  • 只想装完就自动变强、不打算看说明书的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
技能权限级别安装方式累计安装宿主客户端安装命令
卫星地图变三维城市模型当前 未标注权限 未标注 未标注 未标注 有
前端设计 只读 GitHub 仓库 882.3 万 Codex、Claude、Cursor 有
Vercel 组合模式 联网访问 GitHub 仓库 385.9 万 Codex、Claude、Cursor 有
Vercel React native skills 前端 只读 GitHub 仓库 246.9 万 Codex、Claude、Cursor 有
adapt 搜索 浏览器控制 GitHub 仓库 202.7 万 Codex、Claude、Cursor 有
使用我的浏览器 浏览器控制 GitHub 仓库 184.8 万 Codex、Claude、Cursor 有

SKILL.md 全文

13.1 KB
模型实际读到的说明书原文,来自技能仓库

卫星影像 → 口袋城市 2 风格三维城市模型

这是什么

输入一个目标区域(中心经纬度 + 覆盖边长),产出单个 HTML 文件:
Three.js 真 3D 正交鸟瞰的城市模型,双击浏览器打开即可,无需服务器、无需联网。

  • 建筑体块由卫星影像的纹理能量驱动 —— 位置、疏密、沿街排布反映真实城市形态
  • 水系(江/河/湖/水库/渠道)走 OpenStreetMap 矢量,河宽按等级给
  • 带 8 个视角按钮 / 4 个图层开关 / 地名自动避让 / 比例尺 / 指北针

实测样例:郑州全域 39.2 × 39.2 km(含黄河北岸)→ 1.62 MB 单文件、
18 461 栋建筑体块、278 个水体多边形、131 个湖心岛。


先读这三条(错了后面全白做)

  1. 立体感靠「逐面烘焙三档明暗」,不靠光照。
    顶面 ×1.10、东面 ×0.80、南面 ×0.66,写进顶点色 + MeshBasicMaterial。
    用 MeshLambertMaterial + 方向光会打爆顶面(蓝通道截断成白)、糊掉侧面。

  2. 「针林」的真凶是高度分布,不是抖动也不是网格。
    不要给 20%+ 的建筑做大倍数放大。本项目真凶是 best>0.85 时 h *= 2.2~4.8
    命中 28% 的建筑。改成 3% × 1.62~2.67。

  3. 大湖在 OSM 是 multipolygon relation,只遍历 way 会把它们全丢掉。
    郑州 755 个水系要素里有 37 个 relation,最大的三个水面恰好都是。

完整论证见 reference/style-card.md(色卡与硬参数)与
reference/pitfalls.md(24 条实测踩坑,按症状索引)。


快速开始

1. 建项目骨架

<项目根>/
  config.json          ← 唯一需要手写的文件(见下)
  scripts/             ← 把本 skill 的 scripts/ 拷进来
  vendor/three.min.js  ← 把本 skill 的 vendor/ 拷进来(或指向已有的)
  assets/template.html ← 把本 skill 的 assets/ 拷进来

config.json 最小示例(完整见 examples/config.zhengzhou.json):

{
  "city": "郑州",
  "city_en": "ZHENGZHOU",
  "center_lat": 34.824,
  "center_lon": 113.6575,
  "half_m": 19000,
  "out_name": "郑州城市模型图.html",
  "labels": [["二七广场", "老城中心", "center", 34.7466, 113.6254]],
  "views": {
    "all":  { "tx": 0, "tz": 0, "zoom": 1.0, "name": "全域总览" },
    "plan": { "tx": 0, "tz": 0, "zoom": 1.0, "top": true, "az": 0, "name": "平面视图" }
  }
}

> half_m 是图幅边长的一半。39.2 km 见方 → 19000。
> Web Mercator 会把实际边长略微撑大(郑州实测 39.2 km,比 38 km 多 3%),
> 这是正常的,因为图幅必须取整数瓦片。
>
> 本机运行前设一次环境变量指向项目根:
> export SCM_ROOT=<项目根>(否则脚本按自身所在目录猜)。

2. 一键跑链路

python scripts/scm_run_all.py
# 单步重跑(长链路被中断时用这个,不要从头再来)
python scripts/scm_run_all.py --only build_scene

七步流水线,每步产物存在即跳过:

步骤 脚本 产物
tiles scm_fetch_tiles.py data/sat/z15/*.jpg(39 km 需 1521 块,约 2 分钟)
mosaic scm_mosaic.py data/sat/ortho_z15.png(9984²)
texture scm_texture.py data/analysis/tex.npy(7.84 m/px 密度场)
water scm_fetch_water.py + scm_water_vec.py data/vec/water2.json
build_scene scm_build_scene.py data/vec/scene.json
emit scm_emit_html.py web/<out_name> ← 成品
shoot scm_shoot.py web/_shot_all.png + 自检文本

3. 验收

python scripts/scm_shoot.py all 1500 950 all      # 渲染 + 自检
python scripts/scm_style_check.py web/_shot_all.png

必须看到(对照 reference/style-card.md §3):

  • JS 报错:无 ✅
  • 自检里「实测建筑 … 高/宽 = 」落在 0.8 ~ 1.3(近景视角)
  • 低饱和亮像素占比 < 0.30;p75 与 p95 不能都顶到 225
  • 水系探针「应水 / 应陆」成对通过

> ⚠️ 图片不能随 skill 包分发(SkillHub 白名单不允许),所以本 skill 只带
> 脚本与文本日志证据(examples/log_*.txt)。渲染图请在本地自行生成查看。


各步骤详解

投影:scm_proj.py(所有脚本共用)

三套坐标必须严格自洽,否则 ll2m 与 px2m 会错位、水体整体偏移几百米:

像素 (col,row) ←→ 米 (x,y,原点=图幅几何中心,x 东 y 北) ←→ 经纬 (lat,lon)

米坐标原点必须取「图幅几何中心」(= 像素中心),不能直接用 config 里的经纬 ——
这一条踩过坑。另外图幅在模型空间里必须是正方形(等量像素 × MPP),
Web Mercator 在中纬度的南北/东西实际距离差 2~3%,但视觉上无影响,
保持正方形才能让等距投影正确。

卫星影像:Esri World Imagery

https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}

无需 key。URL 末尾是 y/x,不是 x/y,写反了会拿到另一颗星球的图。
两个主机名等价(server. / services.),互为备份。

z15 覆盖 39 km 需 39×39 = 1521 块 → 9984² px、3.92 m/px。
分析用 1/2 降采样(4992²,7.84 m/px)。

密度场:局部纹理能量

必须在原始分辨率算,再降采样。 7.84 m/px 下主城浅色屋顶的局部方差
(sd≈11)与农田(≈9)、水面(≈10)几乎重合,根本分不开;
3.92 m/px 下一栋 20 m 建筑 = 5 px,纹理信息才够。

hi   = gray - cv2.GaussianBlur(gray, (0, 0), sigmaX=6.0)
k    = min(max(3, int(round(50 / MPP0)) | 1), 21)      # 窗口 ≈ 50 m
tex  = cv2.blur(np.abs(hi), (k, k))
dens = np.clip((tex - 15.5) / (44.0 - 15.5), 0, 1)
dens = cv2.GaussianBlur(dens, (0, 0), sigmaX=16.0)     # 消&quot;空心&quot;

实测参考值(郑州 z15):黄河 9.6~10.1 / 农田 17.8 / 山地 23.7 /
郑东 CBD 24.1 / 老城 36.6。换城市必须重新读这四个锚点定标,
不能照搬 15.5 / 44。

水系:OSM Overpass

镜像可用性:z.overpass-api.de > overpass.openstreetmap.fr > overpass-api.de。
osm.ch HTTP 200 但静默返回 0 字节(最危险,务必校验要素数)。

两个致命坑的修法写死在 scm_water_vec.py 里:

  • 只处理 way → 丢掉全部大湖(必须处理 relation 的 inner/outer 环,
    inner 环导出为独立的「湖心岛」图层)
  • 把 100+ 个面烧进同一张栅格再取轮廓 → 连通即合并、形状被切歪、孔洞被填
    (面状直接用 OSM 闭环矢量简化,完全不经过栅格;线状单条独立栅格化)

河宽按等级给,不能一刀切:

类型 半宽
名字含「黄」 900 m
waterway=river 且点数 ≥ 150(主干常无名) 700 m
南水北调 / 总干渠 45 m
waterway=river 30~45 m
waterway=canal 30 m
stream / drain / ditch 14 m

必做:生成 water_overlay2.jpg(水体面 58% 不透明度叠到影像上),
肉眼确认河道吻合后再建模。

建筑:scm_build_scene.py

参数 值 为什么
网格 190 m 80~150 m 会得到细针林;街区尺度才有城市感
基底 网格的 0.44~0.74 间隙 50~100 m,等距下才看得见街道
位置抖动 ±0.07 格 抖 0.9 格会让相邻建筑重叠、街道消失
高度 中位 ~26 m、P90 ~44 m、上限 ~140 m 保持一层低矮「地毯」
超高层 仅 3%,×1.62~2.67 概率给到 20%+ 就是针林
竖向夸张 HS 近景 5.0 → 全域 ×1.85 屏幕高/宽 ≈ 0.8~1.3 才是扁方块
铺装阈值 dens &gt; 0.34 0.46 会让城市读作"绿地上的白点"

CENTERS 是高度加成点(各 CBD 权重 0.55~1.15),
11000 m 是衰减尺度 —— 换城市要按实际组团间距调。

渲染:assets/template.html

墙面色池收敛到 5 桶,别做彩虹:

桶 墙色 topMul 占比 说明
0 0xa9b2dd 1.10 ~56% 混凝土(主)
1 0xcfdcf0 1.04 ~31% 亮混凝土
2 0x535f82 1.52 ~13% 玻璃塔:深墙 + 亮蓝顶,画面最暗 5% 的来源
3 0xc25f62 1.00 ~0.2% 砖红(只给旧城低层)
4 0x5a68ae 1.28 ~0.2% 地标深蓝

其它实现要点:

  • InstancedMesh 分色桶:每桶一个 BoxGeometry(顶点色已烘焙)+ 一个
    InstancedMesh,18k~60k 栋毫无压力。frustumCulled = false(实例包围盒不准)。
  • 高层加裙房(h &gt; 62 m):底面积 ×1.20、高 7~14 m,观感立刻「真」起来。
  • 地面外扩 3.2 倍 + 农田格纹每块 ~150 m,随地面尺寸联动。
  • up 向量退化保护:el → π/2 时 camera.up 要换成 (-sin az, 0, -cos az)。
  • 标注避让:按优先级排序,冲突时上下交错试探 15 次。
  • cam 必须声明在建筑生成之前 —— 自适应夸张要读 cam.zoom,
    声明晚了会 refreshBld 报错。

无头验证(Windows 本机唯一可行链路)

Edge headless 下 WebGL 无法合成进 --screenshot(截出来全黑,
但 gl.readPixels 证明渲染完全正常)。必须走:

msedge --headless=new --no-sandbox --enable-unsafe-swiftshader --use-angle=swiftshader \
       --hide-scrollbars --force-device-scale-factor=1 --virtual-time-budget=20000 \
       --user-data-dir=&lt;临时profile&gt; --window-size=1500,950 \
       --dump-dom &quot;file:///…/page.html?static=1&amp;view=all&quot;

页面里 ?static=1 时只渲一帧(rafOn = false)、preserveDrawingBuffer: true,
把 canvas toDataURL() 写进隐藏 &lt;div id=&quot;dumpimg&quot;&gt;,外部正则抠出 base64 解码。
DOM 标注不会进 canvas 像素 —— 所以要先把标注画到 2D canvas 上再导出。

调试查询参数(模板已内置):view / az / el / zoom / t=tx,tz / only=all|water|bld|pads|ground。

交付前检查清单

  • [ ] 蓝紫像素亮度分位 vs 参考(scm_style_check.py)
  • [ ] 屏幕高/宽比:近景 0.8~1.3;若 < 0.5 说明太扁或 HS 太小
  • [ ] 低饱和亮像素占比 < 0.30
  • [ ] 全景视角画布四周无空白天空
  • [ ] 水系探针「应水 / 应陆」成对通过(例:黄河/龙湖/水库=是;老城/CBD=否)
  • [ ] 全部视角渲染无 JS 报错、无黑屏
  • [ ] 交付说明如实标注:建筑为程序化体块、高度为推断值、
    OSM 建筑轮廓覆盖不足故未采用、河宽为示意值

文件清单

SKILL.md                     ← 本文件
assets/template.html         ← 渲染模板(占位符:__THREE_JS__ / __SCENE_JSON__ /
                                __LABELS_JSON__ / __VIEWS_JSON__ / __CITY__ / __CITY_EN__)
vendor/three.min.js          ← Three.js r128,内联进成品,保证离线可用
scripts/scm_proj.py          ← 统一投影(米/像素/经纬 ↔)
scripts/scm_fetch_tiles.py   ← Esri 瓦片下载(Session 连接池,比 urllib 快 90 倍)
scripts/scm_mosaic.py        ← 拼瓦片 → 正射影像
scripts/scm_texture.py       ← 原始分辨率算纹理能量场
scripts/scm_fetch_water.py   ← Overpass 抓水系(755 要素)
scripts/scm_water_vec.py     ← 水系矢量化(含 relation 内外环 + 影像验证图)
scripts/scm_build_scene.py   ← 密度场 → 建筑 + 铺装 + 水体 → scene.json
scripts/scm_emit_html.py     ← 合成单文件 HTML
scripts/scm_shoot.py         ← 无头渲染验证(含自检数字)
scripts/scm_style_check.py   ← 画风验收(色相/亮度分布对照)
scripts/scm_run_all.py       ← 一键流水线(支持 --only 单步重跑)
examples/config.zhengzhou.json    ← 完整配置样例(含 8 视角 + 18 地标)
examples/log_*.txt                ← 实跑日志(过程凭证)
reference/style-card.md           ← 《口袋城市 2》色卡与硬参数(画风宪法)
reference/pitfalls.md             ← 24 条实测踩坑,按症状索引

常见问题

5 问
答案由本站依据条目字段整理
卫星地图变三维城市模型怎么安装?

在支持 Skills 的客户端里执行:skillhub install user_5dad3775/satellite-city-model。安装方式为未标注。装完刷新技能列表或重开客户端。

卫星地图变三维城市模型支持哪些客户端?

资料没有标注宿主客户端,但只要客户端支持 Skills(Claude、Codex、Cursor 等),一般都能加载。

卫星地图变三维城市模型权限高吗,安全吗?

权限级别为未标注权限。安装前先看它会读取或写入哪些内容。

卫星地图变三维城市模型收费吗?

本站不代收费用,也没有标注具体价格。是否收费取决于技能本身和所用的模型或客户端,正式使用前按作者说明确认。

卫星地图变三维城市模型用什么许可证?

许可证标注为 未说明(许可证不明确)。商用或二次分发前请到仓库确认条款原文。

热门专题

按场景挑技能
全部专题 →

技能内容以作者仓库为准;分类、权限级别与许可证状态的中文说明为中文整理,最近核验 未标注。