<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>WebGL | YHK's life</title><link>https://yhk.life/tags/webgl/</link><atom:link href="https://yhk.life/tags/webgl/index.xml" rel="self" type="application/rss+xml"/><description>WebGL</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Wed, 25 Feb 2026 00:00:00 +0000</lastBuildDate><image><url>https://yhk.life/media/icon.svg</url><title>WebGL</title><link>https://yhk.life/tags/webgl/</link></image><item><title>Earths-v1.0 现实地球展示</title><link>https://yhk.life/projects/earths-v1.0/</link><pubDate>Wed, 25 Feb 2026 00:00:00 +0000</pubDate><guid>https://yhk.life/projects/earths-v1.0/</guid><description>&lt;p&gt;&lt;strong&gt;Earths-v1.0&lt;/strong&gt; 是一个 3D 可交互的地球可视化项目：把海洋、大气、生物地球化学、地质等公开数据源，投影到一颗可以旋转、缩放、点选的地球上。它首先是一个“展示界面”，不负责实时预测，也不承担具体行业应用；这一版的任务，是把从数据到画面的整条链路搭起来。&lt;/p&gt;
&lt;p&gt;但我想在这篇复盘里先把话说透：&lt;strong&gt;它看起来是三维的，技术上却仍然停留在“一次展示一个水平高度或一个深度”的阶段。&lt;/strong&gt; 选择 500 hPa，你看到的是 500 hPa 这一层；选择 1000 m 深度，你看到的是 1000 m 这一层。球体提供了空间参照，却没有提供真正的垂直结构。它是一张会转的图，还不是一个可以切、可以透视、可以做体积渲染的三维地球。&lt;/p&gt;
&lt;p&gt;封面图上的“2D”并不是笔误：它恰好说明了这一版的本质——三维的外壳，二维的数据。&lt;/p&gt;
&lt;p&gt;严格说，大气用等压面（hPa），海洋用深度（m），两者并不是同一种坐标；但在交互上它们共享同一个“层”的概念，也共享同一个限制：&lt;strong&gt;一次只能看一层&lt;/strong&gt;。这正是 v1.0 与“数字孪生地球”之间最实质的差距。&lt;/p&gt;
&lt;h2 id="v10-做到了什么没做到什么"&gt;v1.0 做到了什么，没做到什么&lt;/h2&gt;
&lt;p&gt;v1.0 的重心是“搭建”和“上手”，所以它先解决的是从 0 到 1 的问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用一个统一的地球底座承载不同圈层、不同来源的数据；&lt;/li&gt;
&lt;li&gt;支持图层切换、时次切换、水平高度/深度切换；&lt;/li&gt;
&lt;li&gt;统一色标、单位、图例和交互方式；&lt;/li&gt;
&lt;li&gt;把公开数据源的二维场，稳定地贴到球面上。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它没有解决的是“第三个维度”：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;能力&lt;/th&gt;
&lt;th&gt;v1.0 的状态&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;球体旋转、缩放、点选&lt;/td&gt;
&lt;td&gt;已具备&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多源数据图层&lt;/td&gt;
&lt;td&gt;已具备&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;时间与层级切换&lt;/td&gt;
&lt;td&gt;已具备，但一次只显示一层&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;垂直剖面、帘幕、体渲染&lt;/td&gt;
&lt;td&gt;未具备&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多圈层耦合分析&lt;/td&gt;
&lt;td&gt;未具备&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;实时预测、同化、集合预报&lt;/td&gt;
&lt;td&gt;未具备，留给 v2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这不是自我否定，而是给 v1.0 划一条清楚的边界。只有承认它仍然是“球面化的平面展示”，后面才知道该往哪里走。&lt;/p&gt;
&lt;h2 id="为什么先从复刻开始"&gt;为什么先从复刻开始&lt;/h2&gt;
&lt;p&gt;项目初期，团队没有现成的数据管道、设计系统和渲染框架。与其闭门造车，不如把市面上最好的几个地球可视化作品逐个拆开、跑通、复刻。&lt;/p&gt;
&lt;p&gt;复刻不是抄界面，而是把别人的工程约束完整走一遍：数据从哪里来、怎么切、怎么传、怎么画、怎么保证时间一致、怎么在浏览器里不卡。&lt;strong&gt;四个项目，正好对应四类问题。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="1-earthnullschool把风画成流动的场"&gt;1. earth.nullschool：把风画成流动的场&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;原项目：
&lt;/li&gt;
&lt;li&gt;我的复刻：
&lt;/li&gt;
&lt;li&gt;代码库：
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这是我理解“风场应该怎么画”的起点。它用粒子平流把不可见的风变成可见的流线，再用多种地图投影把同一份数据放进不同的空间框架里。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="earth.nullschool 复刻版：全球风场粒子动画"
srcset="https://yhk.life/projects/earths-v1.0/earth-classic_hu_2a9b4cba20bec04e.webp 320w, https://yhk.life/projects/earths-v1.0/earth-classic_hu_9cbc152b9a97994e.webp 480w, https://yhk.life/projects/earths-v1.0/earth-classic_hu_a5052edba9fe6c4d.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://yhk.life/projects/earths-v1.0/earth-classic_hu_2a9b4cba20bec04e.webp"
width="760"
height="475"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 1：earth-classic.that.earth，全球风场粒子动画与多投影切换。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;技术栈。&lt;/strong&gt; 前端是原生 ES Modules，没有重型框架；渲染以 WebGL / Canvas 2D 混合完成，瓦片和粒子计算放进 Web Worker，避免主线程被动画拖死。它支持从等经纬、正交、立体到 Waterman Butterfly 等 9 种投影，状态通过 URL hash 保存，方便深链和回退。数据侧把 GRIB2/NetCDF 网格切成按变量、时次、层级组织的压缩瓦片，浏览器按需取用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据变量。&lt;/strong&gt; 它把地球数据分成几个模式，每个模式再叠加标量场或矢量场：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模式&lt;/th&gt;
&lt;th&gt;主要变量&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Air&lt;/td&gt;
&lt;td&gt;风场/风速、温度、相对湿度、露点、湿球温度、3 小时降水、CAPE、总可降水量、总云水、海平面气压、体感温度、Misery Index、UV Index、风功率密度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ocean&lt;/td&gt;
&lt;td&gt;表层流、波周期、有效波高、海表温度、海表温度异常、珊瑚白化预警&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chem&lt;/td&gt;
&lt;td&gt;一氧化碳、二氧化碳、二氧化硫、二氧化氮、沙尘气溶胶光学厚度、PM1/PM2.5/PM10、有机气溶胶、硫酸盐气溶胶&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Space / Bio&lt;/td&gt;
&lt;td&gt;极光可见概率、珊瑚白化预警&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;标注&lt;/td&gt;
&lt;td&gt;活跃火点&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;数据源。&lt;/strong&gt; GFS/NCEP、GFS-Wave/WAVEWATCH III、OSCAR v2.0、GEOS-5/GMAO、CAMS/Copernicus/ECMWF、OISST/RTG-SST/OSTIA/CMEMS、NOAA Coral Reef Watch、SWPC OVATION、NASA FIRMS/VIIRS 等。不同变量来自不同机构、不同网格、不同时间分辨率，最后要在同一个球面上对齐——这件事比“画出来”难得多。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我学到的。&lt;/strong&gt; 一是投影畸变下的粒子平流：同一个风矢量，在球心、球边缘和不同投影里要走不同的路径；二是瓦片与元数据组织：变量、时次、层级、单位、色标必须一起设计；三是“少即是多”的配色，风场本身已经足够复杂，界面要退到后面。&lt;/p&gt;
&lt;h3 id="2-fluid-earth把大气海洋冰冻圈和大气化学放进同一个浏览器"&gt;2. Fluid Earth：把大气、海洋、冰冻圈和大气化学放进同一个浏览器&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;原项目：
&lt;/li&gt;
&lt;li&gt;我的复刻：
&lt;/li&gt;
&lt;li&gt;代码库：
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果说 earth.nullschool 是把风画得漂亮，Fluid Earth 更像一个“地球数据浏览器”：它把再分析、预报、卫星海流、海表温度、海浪、永久冻土和大气成分放在同一套图层系统里。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Fluid Earth 复刻版：全球温度与风场"
srcset="https://yhk.life/projects/earths-v1.0/fluid-earth_hu_3dd22a22b987536d.webp 320w, https://yhk.life/projects/earths-v1.0/fluid-earth_hu_df1ba6d5376622b7.webp 480w, https://yhk.life/projects/earths-v1.0/fluid-earth_hu_6fe657c8b28dfc58.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://yhk.life/projects/earths-v1.0/fluid-earth_hu_3dd22a22b987536d.webp"
width="760"
height="475"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 2：fluid-earth.that.earth，全球温度场叠加风场粒子，并可切换多种地球科学变量。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;技术栈。&lt;/strong&gt; 前端是 Svelte 5 + Vite 6，WebGL 渲染基于 &lt;code&gt;twgl.js&lt;/code&gt;，地理投影和拓扑用 D3；后端是一个独立的 Node 数据服务（&lt;code&gt;tera&lt;/code&gt;），负责从 GRIB2、NetCDF 等原始格式解码、裁剪、重采样，再输出带元数据的压缩二进制瓦片。前端通过 &lt;code&gt;inventory&lt;/code&gt; 和 &lt;code&gt;topology&lt;/code&gt; 知道“有哪些变量、覆盖哪些时间、网格多大”，再按需请求。项目还提供了 Web Component，方便把地球嵌进别的页面。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据变量。&lt;/strong&gt; 它的覆盖面很广，而且把“层”组织得很清楚：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;圈层&lt;/th&gt;
&lt;th&gt;主要变量&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;大气&lt;/td&gt;
&lt;td&gt;10 m 风、10/200/300/500/850 hPa 风与风速、温度、相对湿度、位势高度、海平面气压、CAPE、总可降水量、总云水、降水、日照、臭氧&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;海洋&lt;/td&gt;
&lt;td&gt;有效波高、主浪周期、主浪方向、表层流、海表温度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;再分析&lt;/td&gt;
&lt;td&gt;ERA5 月平均 2 m 温度、降水及其距平（1959 年至今）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;大气化学&lt;/td&gt;
&lt;td&gt;地表一氧化碳、沙尘、二氧化硫&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;冰冻圈/陆地&lt;/td&gt;
&lt;td&gt;永久冻土概率、永久冻土分区&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;数据源。&lt;/strong&gt; Copernicus CDS 的 ERA5、NASA GMAO 的 GEOS-FP、NOAA NCEP 的 GFS 与 GFS-Wave、NASA OSCAR 表层流、PANGAEA 永久冻土数据、NOAA RTG 海表温度，以及 Natural Earth 的底图。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我学到的。&lt;/strong&gt; 地球可视化项目里，&lt;strong&gt;后端不是附属品，而是一半的产品&lt;/strong&gt;。同一个变量可能有多个来源、多个单位、多个时间覆盖范围；如果元数据不统一，前端再漂亮也只是把错误画得更清楚。Fluid Earth 的 &lt;code&gt;inventory&lt;/code&gt; 思路，后来直接影响了我对 Earths 数据层的设计。&lt;/p&gt;
&lt;h3 id="3-earth-clock把地球变成一个时钟"&gt;3. earth-clock：把地球变成一个时钟&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;原项目：
&lt;/li&gt;
&lt;li&gt;我的复刻：
&lt;/li&gt;
&lt;li&gt;代码库：
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;earth-clock 是四个项目里最“感性”的一个。它不把地球当地图，而是当钟表：太阳和月亮按真实天体位置运动，晨昏线、日食、月食、时区、夜光都被放进同一个场景。你可以把时间加速到一分钟等于一周，也可以把某一次日食逐帧倒放。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="earth-clock 复刻版：真实光照下的 3D 地球"
srcset="https://yhk.life/projects/earths-v1.0/earth-clock_hu_d63c4df36cab8461.webp 320w, https://yhk.life/projects/earths-v1.0/earth-clock_hu_8869834fdb14a7bd.webp 480w, https://yhk.life/projects/earths-v1.0/earth-clock_hu_15712572bd5890a.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://yhk.life/projects/earths-v1.0/earth-clock_hu_d63c4df36cab8461.webp"
width="760"
height="475"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 3：earth-clock.that.earth，基于 Three.js 的 3D 地球、真实太阳光照与时钟界面。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;技术栈。&lt;/strong&gt; 前端是 TypeScript + Three.js + Vite，天气和天文数据由独立的 Node 服务提供；GFS 1° 风场每 6 小时刷新，云图来自 VIIRS 每日真彩拼图或 GFS 云量，极光、火点、气旋、闪电分别接不同的实时源。项目还保留了早期 D3 + Canvas 的 &lt;code&gt;classic&lt;/code&gt; 版本，并派生出 Windows 屏保和 Wallpaper Engine 版本。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据变量。&lt;/strong&gt; 风场粒子、云量、极光概率、活跃火点、热带气旋及 5 天路径、实时闪电、气压、温度、湿度、可降水量、云水；以及太阳/月亮位置、日月食、晨昏线、时区、夜光等天文与时间图层。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据源。&lt;/strong&gt; GFS、NASA GIBS 的 VIIRS 真彩云图、NOAA SWPC 的 OVATION 极光、NASA FIRMS 火点、NOAA NHC 气旋、Blitzortung 闪电、NASA Deep Star Maps 星空、Natural Earth 海岸线，以及 Meeus 的月球历表算法。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我学到的。&lt;/strong&gt; 一是把&lt;strong&gt;时间当作一等公民&lt;/strong&gt;：同一个场景里，地球自转、太阳位置、天气图层和日月食必须共享同一个 &lt;code&gt;simulatedTime&lt;/code&gt;；二是“真实感”来自物理一致，而不是贴图精度；三是数据新鲜度要能被界面表达——当模拟时间偏离现在超过 24 小时，实时天气图层应该主动隐藏，而不是假装还在更新。&lt;/p&gt;
&lt;h3 id="4-ventusky产品化的天气预报长什么样"&gt;4. Ventusky：产品化的天气预报长什么样&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;原项目：
&lt;/li&gt;
&lt;li&gt;我的复刻：
&lt;/li&gt;
&lt;li&gt;代码库：
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ventusky 是四个项目里产品化程度最高的一个。它不只是“把数据画出来”，而是把多家数值模式的多个时次、雷达拼图、卫星云图、空气质量和海浪等图层，组织成一个普通用户也能用的天气预报产品。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Ventusky 复刻版：温度场与天气图层"
srcset="https://yhk.life/projects/earths-v1.0/ventusky_hu_cae6333d077ce2d2.webp 320w, https://yhk.life/projects/earths-v1.0/ventusky_hu_2d588cb550f5289c.webp 480w, https://yhk.life/projects/earths-v1.0/ventusky_hu_1a1323ede4c92e57.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://yhk.life/projects/earths-v1.0/ventusky_hu_cae6333d077ce2d2.webp"
width="760"
height="475"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 4：ventusky.that.earth，多模式温度预报、风场动画与天气图层菜单。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;技术栈。&lt;/strong&gt; 前端以 PHP + JavaScript + Canvas 2D 为主，使用自研的瓦片式渲染和交互层，针对不同模式、不同区域、不同变量做分辨率和时次管理。数据通过 &lt;code&gt;/proxy&lt;/code&gt; 反向代理到 &lt;code&gt;static.ventusky.com&lt;/code&gt;、&lt;code&gt;data.ventusky.com&lt;/code&gt;、&lt;code&gt;api.ventusky.com&lt;/code&gt; 等服务，部署在 Netlify 边缘。我的复刻采用“反向代理镜像 + 本地部署”的方式，先把完整的数据与渲染链路跑通，而不是逐行重写。这个选择让我更快地看清它的产品结构，也让我意识到：&lt;strong&gt;真正难的不是前端，而是后面的数据服务、模式调度、雷达拼图和授权体系。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据变量。&lt;/strong&gt; 温度、体感温度、降水、雷达、卫星、风速、阵风、云量、气压、CAPE/CIN/切变/螺旋度、积雪、湿度、能见度、雷暴、空气质量、海浪/海流/海表温度、极光、太阳辐射等 50 多个图层，并支持地面到高空的多个层次。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据源。&lt;/strong&gt; NOAA 的 GFS/HRRR/RTOFS/STOFS/NBM、DWD 的 ICON、CMC 的 GEM、ECMWF、UKMO、MeteoFrance 的 AROME/MFWAM、挪威气象局、芬兰气象局的 SILAM、Copernicus，以及 GOES/Himawari/Meteosat 卫星和各国雷达网；底图来自 OpenStreetMap。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;为什么没有复刻 Windy。&lt;/strong&gt; Windy 是唯一一个我停下来的项目。不是前端画不出来，而是它背后的数据服务、瓦片体系、多模式/雷达/卫星/摄像头融合、移动端和商业授权，已经不是一个前端项目能覆盖的。强行做一个“看起来像”的空壳没有意义。这个“没做”的决定，反而让我更清楚地看到这类产品的护城河在哪里：&lt;strong&gt;数据管道的深度，决定了产品的上限。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="四个项目放在一起看"&gt;四个项目放在一起看&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;earth.nullschool&lt;/strong&gt;：原生 ES Modules + WebGL/Canvas，GRIB2/NetCDF 切成多投影压缩瓦片。学到的是投影畸变、粒子平流和瓦片元数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fluid Earth&lt;/strong&gt;：Svelte 5 + WebGL + Node 数据服务，原始场转二进制瓦片。学到的是“数据层是一半产品”，元数据必须统一。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;earth-clock&lt;/strong&gt;：TypeScript + Three.js，GFS/实时源 + 天文历表。学到的是把时间当作第一维度，物理一致比贴图精度重要。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ventusky&lt;/strong&gt;：PHP + Canvas 2D，多模式、多时次、雷达/卫星融合。学到的是数据服务与运维才是壁垒。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windy&lt;/strong&gt;：未复刻。学到的是知道什么时候该停。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="这类网站的技术栈与数据管道接下来会怎么走"&gt;这类网站的技术栈与数据管道，接下来会怎么走&lt;/h2&gt;
&lt;p&gt;把这四个项目放在 2026 年的时间点看，地球可视化正在从“画一张场”转向“管理一个可计算的地球”。变化主要发生在五层。&lt;/p&gt;
&lt;h3 id="1-渲染从-canvas-到-webgpu"&gt;1. 渲染：从 Canvas 到 WebGPU&lt;/h3&gt;
&lt;p&gt;Canvas 2D 解决了“能画”，WebGL 解决了“画得快”，WebGPU 正在解决“画得复杂”。WebGPU 把 compute shader 带进浏览器，粒子平流、体积渲染、三维粒子追踪、实时等值面才有可能在消费级设备上跑起来。与此同时，WASM 把 GRIB、NetCDF、Zarr 的解码能力带到客户端，OffscreenCanvas + Worker 让渲染不阻塞交互。Three.js、Cesium、deck.gl 负责场景与图层，WebXR 则把同一个数据地球带进头显。&lt;/p&gt;
&lt;h3 id="2-数据从文件到云原生-arco"&gt;2. 数据：从文件到云原生 ARCO&lt;/h3&gt;
&lt;p&gt;过去的主流做法是“下载 GRIB2/NetCDF → 服务端转成私有瓦片 → 浏览器取瓦片”。下一步更可能是“对象存储 + 云原生分块格式”：Zarr/Icechunk/Kerchunk 负责多维数组，COG/COPC 负责影像与点云，STAC 负责目录与发现，浏览器按 chunk 做范围请求。数据不再被转换成某个项目私有的瓦片，而是以接近原始组织的方式被直接消费。&lt;strong&gt;元数据——CF 约定、单位、坐标、时间、缺失值——会比像素本身更重要。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="3-管道从定时脚本到事件驱动"&gt;3. 管道：从定时脚本到事件驱动&lt;/h3&gt;
&lt;p&gt;数据管道会从“cron 定时跑脚本”变成“模型跑完就触发”的事件驱动系统：增量更新、质量控制和血缘追踪成为标配，Airflow/Prefect/Dagster/Temporal 负责编排，多模式、多时次、集合预报、雷达/卫星/站点融合在同一个图里管理。边缘缓存和 CDN 负责把最近一次结果推到离用户最近的地方，成本可观测性则决定这套系统能不能长期跑下去。&lt;/p&gt;
&lt;h3 id="4-维度从单层切片到-3d4d"&gt;4. 维度：从单层切片到 3D/4D&lt;/h3&gt;
&lt;p&gt;这是 Earths-v1.0 最需要补的一课。真正的三维地球需要：垂直坐标（等压面、高度、深度、地形追随坐标）、任意剖面、帘幕、等值面、体渲染、拉格朗日轨迹、时间插值、LOD 和渐进加载。数据量会涨一到两个数量级，必须靠分块、压缩和 GPU 一起解决。再往后是集合预报和不确定性可视化——不是画一条“最可能的路径”，而是画出一簇可能的世界。&lt;/p&gt;
&lt;h3 id="5-ai让数据更多也让画清楚更难"&gt;5. AI：让数据更多，也让“画清楚”更难&lt;/h3&gt;
&lt;p&gt;GraphCast、Pangu-Weather、AIFS、FuXi 这类 AI 天气模型，让预报更快、更便宜，也让可视化面对更多成员、更高频次、更大不确定性的数据。AI 可以做降尺度、偏差校正、学习式压缩，但“把不确定性画清楚”仍然是难点。&lt;strong&gt;AI 不会自动让可视化更清楚，它只会把“数据太多、维度太多”的问题放大。&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;层次&lt;/th&gt;
&lt;th&gt;现在 → 正在发生&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;渲染&lt;/td&gt;
&lt;td&gt;Canvas/WebGL → WebGPU、compute shader、WebXR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据格式&lt;/td&gt;
&lt;td&gt;GRIB2/NetCDF → 私有瓦片，走向 Zarr/Icechunk、COG/COPC、STAC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;传输&lt;/td&gt;
&lt;td&gt;静态瓦片 + CDN → chunk 范围请求、边缘计算、流式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;计算&lt;/td&gt;
&lt;td&gt;服务端 ETL → WASM 客户端解码、serverless&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;编排&lt;/td&gt;
&lt;td&gt;cron → 事件驱动、增量、血缘、质量控制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;维度&lt;/td&gt;
&lt;td&gt;2D 单层 → 3D/4D、体渲染、集合与不确定性&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="回到-earths-v10下一步不是把球做得更炫"&gt;回到 Earths-v1.0：下一步不是把球做得更炫&lt;/h2&gt;
&lt;p&gt;v1.0 的价值，是把“多源公开数据 → 统一地球界面”这条路走通了。它证明了球体可以成为共同底座，但也暴露了真正的瓶颈：&lt;strong&gt;数据模型还是二维的&lt;/strong&gt;。只要数据仍然是“一层一层”的，界面再三维，认知仍然是平面的。&lt;/p&gt;
&lt;p&gt;下一步我会优先做四件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;把“层”变成真正的维度。&lt;/strong&gt; 以 CF/STAC 为骨架统一网格、单位、时间和垂直坐标，让 &lt;code&gt;level/depth&lt;/code&gt; 成为数据模型的一等字段，而不是界面上的一个下拉框。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;补上三维表达。&lt;/strong&gt; 剖面、帘幕、等值面、体渲染、GPU 粒子；从“看一层”变成“切一个体”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;把管道云原生化。&lt;/strong&gt; 原始 GRIB/NetCDF 不再落成一堆私有文件，而是按 chunk 组织、增量更新、事件驱动；前端按需取，不再全量预生成。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;从“看”走向“算”。&lt;/strong&gt; 接上 v2.0 的实时预测和 v3.0 的数字孪生，把预报、集合、不确定性和决策放进同一个界面。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;v1.0 是地基，不是终点。它的意义不在于假装自己已经是数字孪生，而在于把通往数字孪生的第一段路走完，并且清楚地知道下一段路在哪里。&lt;/p&gt;
&lt;h2 id="附站点与代码"&gt;附：站点与代码&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;站点与代码&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Earths-v1.0&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;earth.nullschool 复刻&lt;/td&gt;
&lt;td&gt;
·
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fluid Earth 复刻&lt;/td&gt;
&lt;td&gt;
·
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;earth-clock 复刻&lt;/td&gt;
&lt;td&gt;
·
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ventusky 复刻&lt;/td&gt;
&lt;td&gt;
·
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;em&gt;文中截图摄于 2026 年 10 月 22 日，实时数据以站点当前显示为准。&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>