<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Townsend 学术主页</title><link>https://townsend1.site/</link><atom:link href="https://townsend1.site/index.xml" rel="self" type="application/rss+xml"/><description>Townsend 学术主页</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>zh-CN</language><lastBuildDate>Wed, 08 Apr 2026 00:00:00 +0000</lastBuildDate><image><url>https://townsend1.site/media/icon_hu_da05098ef60dc2e7.png</url><title>Townsend 学术主页</title><link>https://townsend1.site/</link></image><item><title>SSH 免密登录教程：从原理到实战，一次配置永久生效</title><link>https://townsend1.site/blog/ssh-passwordless-login/</link><pubDate>Thu, 16 Apr 2026 14:50:00 +0800</pubDate><guid>https://townsend1.site/blog/ssh-passwordless-login/</guid><description>
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;注意&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：Windows 本地 → Linux 远程服务器（HPC 集群、实验室工作站等）。
配置一次，永久免密。全文约 5 分钟。&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="一为什么要配置免密登录"&gt;一、为什么要配置免密登录？&lt;/h2&gt;
&lt;p&gt;每次 &lt;code&gt;ssh&lt;/code&gt; 都要手动输入密码，不仅&lt;strong&gt;操作繁琐&lt;/strong&gt;，还存在安全隐患——密码在网络传输中可能被截获。&lt;/p&gt;
&lt;p&gt;SSH 密钥认证使用&lt;strong&gt;非对称加密&lt;/strong&gt;替代密码登录，同时解决了这两个问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🔒 &lt;strong&gt;更安全&lt;/strong&gt; — 私钥从不离开本机，无法被中间人截获&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;更方便&lt;/strong&gt; — 连接时自动完成身份验证，无需交互&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二原理图解"&gt;二、原理图解&lt;/h2&gt;
&lt;p&gt;SSH 密钥是&lt;strong&gt;成对出现&lt;/strong&gt;的两个文件：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: center"&gt;文件&lt;/th&gt;
&lt;th style="text-align: left"&gt;存放位置&lt;/th&gt;
&lt;th style="text-align: left"&gt;作用&lt;/th&gt;
&lt;th style="text-align: center"&gt;能否公开&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;🔑 &lt;strong&gt;私钥&lt;/strong&gt; &lt;code&gt;id_rsa&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;你的电脑 &lt;code&gt;~/.ssh/&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;签名，证明&amp;quot;我是我&amp;quot;&lt;/td&gt;
&lt;td style="text-align: center"&gt;❌ 绝不泄露&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;🔓 &lt;strong&gt;公钥&lt;/strong&gt; &lt;code&gt;id_rsa.pub&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;服务器 &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;验证签名&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅ 可以公开&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="四步握手流程"&gt;四步握手流程&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 你的电脑 (客户端) 远程服务器
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ① │──── &amp;#34;我是 &amp;lt;用户名&amp;gt;&amp;#34; ───────────────→│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ② │←─── 找到公钥，发送随机挑战 ─────────│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ③ │──── 用私钥签名挑战 ────────────────→│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ④ │←─── 用公钥验证签名 → ✅ 免密登录！ ──│
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-emerald-100 dark:bg-emerald-900 border-emerald-500"
data-callout="tip"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-emerald-600 dark:text-emerald-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 18v-5.25m0 0a6 6 0 0 0 1.5-.189m-1.5.189a6 6 0 0 1-1.5-.189m3.75 7.478a12.1 12.1 0 0 1-4.5 0m3.75 2.383a14.4 14.4 0 0 1-3 0M14.25 18v-.192c0-.983.658-1.823 1.508-2.316a7.5 7.5 0 1 0-7.517 0c.85.493 1.509 1.333 1.509 2.316V18"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;提示&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;&lt;strong&gt;直觉理解&lt;/strong&gt;：把公钥当作一把&amp;quot;锁&amp;quot;装在服务器门上，私钥是唯一配套的&amp;quot;钥匙&amp;quot;。能开锁 = 证明身份 = 不用密码。&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="三操作步骤"&gt;三、操作步骤&lt;/h2&gt;
&lt;h3 id="31--检查是否已有密钥"&gt;3.1 🔍 检查是否已有密钥&lt;/h3&gt;
&lt;p&gt;打开 &lt;strong&gt;PowerShell&lt;/strong&gt; 或 &lt;strong&gt;cmd&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;type &lt;/span&gt;&lt;span class="nv"&gt;$env:USERPROFILE&lt;/span&gt;&lt;span class="p"&gt;\.&lt;/span&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;id_rsa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;pub&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;输出结果&lt;/th&gt;
&lt;th style="text-align: left"&gt;说明&lt;/th&gt;
&lt;th style="text-align: left"&gt;操作&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;显示 &lt;code&gt;ssh-rsa AAAAB3...&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;✅ 已有密钥&lt;/td&gt;
&lt;td style="text-align: left"&gt;直接跳到 &lt;strong&gt;3.3&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;报错&amp;quot;找不到文件&amp;quot;&lt;/td&gt;
&lt;td style="text-align: left"&gt;❌ 尚未生成&lt;/td&gt;
&lt;td style="text-align: left"&gt;继续 &lt;strong&gt;3.2&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="32--生成密钥对仅首次"&gt;3.2 🔧 生成密钥对（仅首次）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;ssh-keygen&lt;/span&gt; &lt;span class="n"&gt;-t&lt;/span&gt; &lt;span class="n"&gt;rsa&lt;/span&gt; &lt;span class="n"&gt;-b&lt;/span&gt; &lt;span class="mf"&gt;4096&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;连按 &lt;strong&gt;三次回车&lt;/strong&gt;（全部使用默认值，不设密码短语）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Generating public/private rsa key pair.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Enter file in which to save the key (.../.ssh/id_rsa): ← 回车
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Enter passphrase (empty for no passphrase): ← 回车
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Enter same passphrase again: ← 回车
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;生成完毕后，&lt;code&gt;C:\Users\你的用户名\.ssh\&lt;/code&gt; 目录下会出现两个文件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;id_rsa&lt;/code&gt; — 私钥 ⚠️ &lt;strong&gt;绝对不要发给任何人&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;id_rsa.pub&lt;/code&gt; — 公钥（需复制到服务器）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="33--一键推送公钥到服务器"&gt;3.3 📤 一键推送公钥到服务器&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;type &lt;/span&gt;&lt;span class="nv"&gt;$env:USERPROFILE&lt;/span&gt;&lt;span class="p"&gt;\.&lt;/span&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;id_rsa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;pub&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;ssh&lt;/span&gt; &lt;span class="n"&gt;-p&lt;/span&gt; &lt;span class="n"&gt;端口号&lt;/span&gt; &lt;span class="n"&gt;用户名&lt;/span&gt;&lt;span class="nv"&gt;@服务器地址&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mkdir -p ~/.ssh &amp;amp;&amp;amp; chmod 700 ~/.ssh &amp;amp;&amp;amp; cat &amp;gt;&amp;gt; ~/.ssh/authorized_keys &amp;amp;&amp;amp; chmod 600 ~/.ssh/authorized_keys&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;实际例子&lt;/strong&gt;（中科算联云 · 西北 1 集群）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;type &lt;/span&gt;&lt;span class="nv"&gt;$env:USERPROFILE&lt;/span&gt;&lt;span class="p"&gt;\.&lt;/span&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;id_rsa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;pub&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;ssh&lt;/span&gt; &lt;span class="n"&gt;-p&lt;/span&gt; &lt;span class="mf"&gt;50888&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;用户名&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;@c1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;hpcmaster&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;com&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mkdir -p ~/.ssh &amp;amp;&amp;amp; chmod 700 ~/.ssh &amp;amp;&amp;amp; cat &amp;gt;&amp;gt; ~/.ssh/authorized_keys &amp;amp;&amp;amp; chmod 600 ~/.ssh/authorized_keys&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-orange-100 dark:bg-orange-900 border-orange-500"
data-callout="warning"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-orange-600 dark:text-orange-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0zM12 15.75h.007v.008H12z"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;警告&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;首次连接会提示 &lt;code&gt;Are you sure you want to continue connecting?&lt;/code&gt;，输入 &lt;code&gt;yes&lt;/code&gt;。随后需要输入一次密码——&lt;strong&gt;这是你最后一次输入密码&lt;/strong&gt;。&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;details&gt;
&lt;summary&gt;📋 命令逐段拆解（点击展开）&lt;/summary&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;部分&lt;/th&gt;
&lt;th style="text-align: left"&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;type ...id_rsa.pub&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;读取本地公钥内容&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;|&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;通过管道传输给远程 SSH&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;mkdir -p ~/.ssh&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;在服务器上创建 &lt;code&gt;.ssh&lt;/code&gt; 目录&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;chmod 700 ~/.ssh&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;设置目录权限（仅本人可访问）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;cat &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;将公钥追加到授权列表&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;chmod 600 ~/.ssh/authorized_keys&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;设置文件权限（仅本人可读写）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/details&gt;
&lt;h3 id="34--验证免密登录"&gt;3.4 ✅ 验证免密登录&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ssh&lt;/span&gt; &lt;span class="n"&gt;-p&lt;/span&gt; &lt;span class="mf"&gt;50888&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;用户名&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;@c1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;hpcmaster&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;com&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hostname&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果&lt;strong&gt;直接返回主机名&lt;/strong&gt;而没有要求密码 → 🎉 &lt;strong&gt;配置成功！&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="四进阶配置-ssh-别名"&gt;四、进阶：配置 SSH 别名&lt;/h2&gt;
&lt;p&gt;每次输 &lt;code&gt;ssh -p 50888 &amp;lt;用户名&amp;gt;@c1.hpcmaster.com&lt;/code&gt; 太长了？配个别名，一劳永逸。&lt;/p&gt;
&lt;p&gt;编辑 &lt;code&gt;C:\Users\你的用户名\.ssh\config&lt;/code&gt; 文件，添加：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ═══ 中科算联云 ═══
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host hpc-west1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HostName c1.hpcmaster.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Port 50888
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User &amp;lt;用户名&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host hpc-west
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HostName c2.hpcmaster.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Port 50888
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User &amp;lt;用户名&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ═══ 矿大内网服务器 ═══
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host cumt-server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HostName &amp;lt;内网服务器IP&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Port 5911
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User wrf4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配置后的效果：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ssh&lt;/span&gt; &lt;span class="nb"&gt;hpc-west1&lt;/span&gt; &lt;span class="c"&gt;# 等价于 ssh -p 50888 &amp;lt;用户名&amp;gt;@c1.hpcmaster.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ssh&lt;/span&gt; &lt;span class="nb"&gt;hpc-west&lt;/span&gt; &lt;span class="c"&gt;# 等价于 ssh -p 50888 &amp;lt;用户名&amp;gt;@c2.hpcmaster.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ssh&lt;/span&gt; &lt;span class="nb"&gt;cumt-server&lt;/span&gt; &lt;span class="c"&gt;# 等价于 ssh -p 5911 wrf4@&amp;lt;内网服务器IP&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-emerald-100 dark:bg-emerald-900 border-emerald-500"
data-callout="tip"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-emerald-600 dark:text-emerald-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 18v-5.25m0 0a6 6 0 0 0 1.5-.189m-1.5.189a6 6 0 0 1-1.5-.189m3.75 7.478a12.1 12.1 0 0 1-4.5 0m3.75 2.383a14.4 14.4 0 0 1-3 0M14.25 18v-.192c0-.983.658-1.823 1.508-2.316a7.5 7.5 0 1 0-7.517 0c.85.493 1.509 1.333 1.509 2.316V18"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;提示&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;&lt;code&gt;scp&lt;/code&gt; 也支持别名，文件传输同样变简洁：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;scp&lt;/span&gt; &lt;span class="n"&gt;本地文件&lt;/span&gt; &lt;span class="nb"&gt;hpc-west1&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;用户名&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;目标路径&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="五常见问题排查"&gt;五、常见问题排查&lt;/h2&gt;
&lt;h3 id="-推送公钥后还是要密码"&gt;❓ 推送公钥后还是要密码？&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;依次检查以下三项：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;① 权限问题&lt;/strong&gt;（最常见）——SSH 对文件权限要求极严格：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod &lt;span class="m"&gt;700&lt;/span&gt; ~/.ssh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod &lt;span class="m"&gt;600&lt;/span&gt; ~/.ssh/authorized_keys
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;② 公钥是否正确追加&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat ~/.ssh/authorized_keys
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 应看到 ssh-rsa AAAAB3... 开头的完整一行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;③ 服务器是否开启密钥认证&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep PubkeyAuthentication /etc/ssh/sshd_config
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 应为 PubkeyAuthentication yes，若为 no 需联系管理员&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="-能给多台服务器配免密吗"&gt;❓ 能给多台服务器配免密吗？&lt;/h3&gt;
&lt;p&gt;可以。&lt;strong&gt;同一把公钥&lt;/strong&gt;可以推送到任意多台服务器——重复执行 3.3 步骤，替换服务器地址即可。&lt;/p&gt;
&lt;h3 id="-换了电脑怎么办"&gt;❓ 换了电脑怎么办？&lt;/h3&gt;
&lt;p&gt;两种方案：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;迁移密钥&lt;/strong&gt;：把旧电脑的 &lt;code&gt;~/.ssh/id_rsa&lt;/code&gt; + &lt;code&gt;id_rsa.pub&lt;/code&gt; 复制到新电脑同一位置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重新生成&lt;/strong&gt;：在新电脑执行 3.2 → 3.3，重新推送新公钥&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="-私钥泄露了怎么办"&gt;❓ 私钥泄露了怎么办？&lt;/h3&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-red-100 dark:bg-red-900 border-red-500"
data-callout="caution"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-red-600 dark:text-red-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0zM12 15.75h.007v.008H12z"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;小心&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;私钥泄露属于严重安全事件，请立即执行：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录&lt;strong&gt;每台&lt;/strong&gt;已配置的服务器，编辑 &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt;，&lt;strong&gt;删除旧公钥&lt;/strong&gt;对应的行&lt;/li&gt;
&lt;li&gt;在本地重新 &lt;code&gt;ssh-keygen&lt;/code&gt; 生成新密钥对&lt;/li&gt;
&lt;li&gt;重新推送新公钥到所有服务器&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="-warning-remote-port-forwarding-failed-for-listen-port-7890"&gt;❓ &lt;code&gt;Warning: remote port forwarding failed for listen port 7890&lt;/code&gt;？&lt;/h3&gt;
&lt;p&gt;这是代理软件（如 Clash）的端口转发配置导致的，&lt;strong&gt;不影响 SSH 连接&lt;/strong&gt;，可以安全忽略。
如需消除警告，检查 SSH config 中是否有 &lt;code&gt;RemoteForward&lt;/code&gt; 相关行并移除。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="六安全建议速查"&gt;六、安全建议速查&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;🛡️ 做法&lt;/th&gt;
&lt;th style="text-align: left"&gt;📌 建议&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;私钥文件&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;永远不要&lt;/strong&gt;发给他人、上传 GitHub、或复制到不信任的设备&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;密码短语&lt;/td&gt;
&lt;td style="text-align: left"&gt;对高安全需求场景，建议在 &lt;code&gt;ssh-keygen&lt;/code&gt; 时设置 passphrase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;定期轮换&lt;/td&gt;
&lt;td style="text-align: left"&gt;每 &lt;strong&gt;1–2 年&lt;/strong&gt;更换一次密钥对&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;清理旧钥&lt;/td&gt;
&lt;td style="text-align: left"&gt;定期检查 &lt;code&gt;authorized_keys&lt;/code&gt;，删除不再使用的旧公钥&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>《小王子》读书笔记：爱如何从喜欢走向责任与珍惜</title><link>https://townsend1.site/blog/du-shu-bi-ji/xiao-wang-zi-du-shu-bi-ji/</link><pubDate>Tue, 14 Apr 2026 09:15:00 +0800</pubDate><guid>https://townsend1.site/blog/du-shu-bi-ji/xiao-wang-zi-du-shu-bi-ji/</guid><description>
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;这次重读《小王子》，我更在意的不是它“提醒人保持纯真”，而是它如何写爱从喜欢慢慢走向责任、珍惜与尊重。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;读《小王子》之前，这本书给我的印象一直很鲜明。它太有名了，几乎每个年龄阶段的人都能从中读出不同的感受。对我来说，它一开始更像一种隐喻：在当下复杂、喧闹的社会里，一个人如何还能追求内心、保持纯真。&lt;/p&gt;
&lt;p&gt;真正读完之后，我发现最打动我的并不只是这种“保持纯真”的主题，而是它对爱的理解。它并没有把爱写成一种天然圆满、顺理成章的东西，而是写出了爱如何从喜欢开始，经过困惑、离开、理解，最后慢慢走向责任、珍惜与尊重。&lt;/p&gt;
&lt;h2 id="喜欢往往从一朵玫瑰开始"&gt;喜欢，往往从一朵玫瑰开始&lt;/h2&gt;
&lt;p&gt;最令我动容的是，生命最开始的时候，我们都像小王子一样，生活在自己的 B612 号小行星上。那个世界并不大，也不复杂，生活本身也足够简单。直到某一天，我们遇见了一朵“从天而降”的玫瑰，第一次感受到心动，也第一次产生了走向更大世界的冲动。&lt;/p&gt;
&lt;p&gt;从那一刻起，人不再只是围绕自己生活。我们会因为“一朵花”而欢喜，也会因为“一朵花”而难过；会想靠近，会想理解，也会想替她遮风挡雨。喜欢，往往就是这样开始的。它最初并不一定成熟，却真实地改变了一个人看待世界的方式。&lt;/p&gt;
&lt;h2 id="困惑是喜欢走向理解之前的必经阶段"&gt;困惑，是喜欢走向理解之前的必经阶段&lt;/h2&gt;
&lt;p&gt;但《小王子》并没有把喜欢写成一种轻松明亮的体验。恰恰相反，小王子对玫瑰的感情，一开始是吸引，也是一种困惑。他被玫瑰的美丽、独特和骄傲吸引，却也常常被她的矫情、敏感和试探弄得不知所措。小王子并不是不爱她，而是那时的他还太年轻，还不能分辨一段关系里表面的情绪和真正的在意，也不懂得如何回应一个自己珍视的人。&lt;/p&gt;
&lt;p&gt;所以他选择了离开。在我看来，这个离开并不只是情节上的分开，而是理解发生的前提。很多时候，人只有离开之后，才会真正看清一段关系的意义。如果小王子始终停留在玫瑰身边，他也许只会继续被她表面的骄傲、敏感和矫情所困住；但当他走出自己的小星球，见到更多相似的花、见到更多不同的人之后，他才慢慢意识到，玫瑰之所以重要，并不是因为她客观上比别的花更完美，而是因为自己曾经为她付出过时间、耐心和牵挂。&lt;/p&gt;
&lt;h2 id="独一无二不是天生的而是被爱赋予的"&gt;“独一无二”不是天生的，而是被爱赋予的&lt;/h2&gt;
&lt;p&gt;也正是在这里，我重新理解了《小王子》里“独一无二”的含义。独一无二并不是天然存在的属性，而是在关系中被一点点赋予的意义。不是因为玫瑰天生就比别的花更值得爱，所以她才特别；而是因为小王子曾经为她浇水、挡风、陪伴、牵挂，所以她才变得不可替代。换句话说，爱不是发现一个天然完美的对象，而是在投入时间与情感之后，慢慢确认谁对自己真正重要。&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;所谓“独一无二”，并不是先验存在的属性，而是在时间、情感与责任中慢慢形成的意义。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="狐狸让爱变得成熟"&gt;狐狸让爱变得成熟&lt;/h2&gt;
&lt;p&gt;而真正让这种理解变得清楚的人，是狐狸。狐狸告诉小王子，所谓“驯养”，就是建立联系；而一旦建立联系，原本普通的事物就会因此变得不同。正因为彼此之间投入了时间、耐心和情感，一个人、一朵花、一片麦田，才会从“成千上万中的一个”变成“独一无二”。&lt;/p&gt;
&lt;p&gt;这也是我最喜欢狐狸的地方。它让小王子明白了玫瑰为什么重要，但更重要的是，它让人看见一种成熟的爱。狐狸明知道建立联系会带来离别，明知道自己会因此难过，但仍然愿意靠近。它很清醒，也很温柔。它知道小王子终究要离开，知道小王子心里始终有那朵想回去守护的玫瑰，但它没有因为自己的不舍而试图占有对方，而是选择理解和成全。&lt;/p&gt;
&lt;h2 id="爱如何从喜欢走向责任与珍惜"&gt;爱如何从喜欢走向责任与珍惜&lt;/h2&gt;
&lt;p&gt;所以对我来说，《小王子》里最打动人的，并不是停留在“纯真”二字上，而是它写出了爱的成长过程。爱可以从喜欢开始，但不会停在喜欢本身。喜欢也许只是心动，是被吸引，是愿意为一个人笑、为一个人流泪；而真正成熟的爱，则会继续向前走，走到责任，走到珍惜，走到理解，也走到尊重。&lt;/p&gt;
&lt;p&gt;如果说玫瑰让小王子明白了什么是珍贵，那么狐狸则进一步让他明白了什么是成熟。成熟并不意味着感情变淡，相反，它意味着一个人更清楚地知道什么重要，也更清楚地知道，真正的爱未必以占有为结局。真正成熟的爱，既理解珍贵，也接受不能占有。&lt;/p&gt;
&lt;h2 id="结语"&gt;结语&lt;/h2&gt;
&lt;p&gt;因此，在我看来，《小王子》真正动人的地方，并不只是它提醒人保持童真，而是它写出了一个人如何在关系中慢慢学会爱。爱如何从喜欢开始，经过困惑、分离、反思和回望，最后变成责任、珍惜、理解与尊重。也正因为如此，这本书才会在不同年龄反复被阅读。它写的并不是一个孩子的童话，而是一个人如何在成长里逐渐明白爱。&lt;/p&gt;</description></item><item><title>ERA5 数据下载教程</title><link>https://townsend1.site/blog/era5-download-tutorial/</link><pubDate>Fri, 10 Apr 2026 12:50:00 +0800</pubDate><guid>https://townsend1.site/blog/era5-download-tutorial/</guid><description>&lt;h1 id="era5-数据下载教程"&gt;ERA5 数据下载教程&lt;/h1&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;使用 CDS API 通过 Python 脚本下载 ECMWF ERA5 再分析气象数据&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="1-注册与获取-api-key"&gt;1. 注册与获取 API Key&lt;/h2&gt;
&lt;h3 id="11-注册账号"&gt;1.1 注册账号&lt;/h3&gt;
&lt;p&gt;访问
并注册账号。&lt;/p&gt;
&lt;h3 id="12-获取-api-key"&gt;1.2 获取 API Key&lt;/h3&gt;
&lt;p&gt;登录后，点击右上角用户图标 → &lt;strong&gt;Your profile&lt;/strong&gt;，页面底部可以看到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Personal Access Token&lt;/strong&gt;（即 API Key）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="13-配置本地凭证"&gt;1.3 配置本地凭证&lt;/h3&gt;
&lt;p&gt;在用户主目录下创建 &lt;code&gt;.cdsapirc&lt;/code&gt; 文件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;C:\Users\&amp;lt;你的用户名&amp;gt;\.cdsapirc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linux/Mac&lt;/strong&gt;: &lt;code&gt;~/.cdsapirc&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;文件内容：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;url: https://cds.climate.copernicus.eu/api
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;key: &amp;lt;你的Personal Access Token&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-purple-100 dark:bg-purple-900 border-purple-500"
data-callout="important"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-purple-600 dark:text-purple-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 9v3.75m9-.75a9 9 0 1 1-18 0a9 9 0 0 1 18 0m-9 3.75h.008v.008H12z"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;重要&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;&lt;code&gt;key&lt;/code&gt; 后面直接填 Token 字符串，不要加引号。&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="2-安装依赖"&gt;2. 安装依赖&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install cdsapi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;验证安装：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;cdsapi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cdsapi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# 如果没报错，说明配置成功&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="3-基础用法"&gt;3. 基础用法&lt;/h2&gt;
&lt;h3 id="31-最简示例"&gt;3.1 最简示例&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;cdsapi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cdsapi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;retrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;reanalysis-era5-single-levels&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# 数据集名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;product_type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;reanalysis&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# 产品类型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;variable&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;2m_temperature&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# 变量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;year&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;2023&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# 年&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;month&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;01&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# 月&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;day&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;01&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# 日&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;time&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;12:00&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# 时间 (UTC)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;area&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;110&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;115&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;# 区域 [北, 西, 南, 东]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;format&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;netcdf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# 输出格式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;output.nc&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;# 输出文件名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="32-参数说明"&gt;3.2 参数说明&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&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;code&gt;product_type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;产品类型&lt;/td&gt;
&lt;td&gt;&lt;code&gt;'reanalysis'&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;variable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;变量名（可多个）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;['2m_temperature', 'surface_pressure']&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;year&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;年份（可多个）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;'2023'&lt;/code&gt; 或 &lt;code&gt;['2022', '2023']&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;month&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;月份（可多个）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;'06'&lt;/code&gt; 或 &lt;code&gt;[f'{m:02d}' for m in range(1,13)]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;day&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;日期（可多个）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[f'{d:02d}' for d in range(1,32)]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;time&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;UTC 时间（可多个）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;'03:00'&lt;/code&gt; 或 &lt;code&gt;['03:00', '04:00', '05:00']&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;area&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;裁剪区域&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[北纬, 西经, 南纬, 东经]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;format&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;输出格式&lt;/td&gt;
&lt;td&gt;&lt;code&gt;'netcdf'&lt;/code&gt; 或 &lt;code&gt;'grib'&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="4-常用变量速查"&gt;4. 常用变量速查&lt;/h2&gt;
&lt;h3 id="41-单层变量single-levels"&gt;4.1 单层变量（single-levels）&lt;/h3&gt;
&lt;p&gt;数据集名：&lt;code&gt;reanalysis-era5-single-levels&lt;/code&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API 变量名&lt;/th&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;code&gt;10m_u_component_of_wind&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;10m 东西风分量&lt;/td&gt;
&lt;td&gt;m/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;10m_v_component_of_wind&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;10m 南北风分量&lt;/td&gt;
&lt;td&gt;m/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2m_temperature&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2m 温度&lt;/td&gt;
&lt;td&gt;K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;surface_pressure&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;地表气压&lt;/td&gt;
&lt;td&gt;Pa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;total_precipitation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;总降水量&lt;/td&gt;
&lt;td&gt;m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2m_dewpoint_temperature&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2m 露点温度&lt;/td&gt;
&lt;td&gt;K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mean_sea_level_pressure&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;海平面气压&lt;/td&gt;
&lt;td&gt;Pa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;boundary_layer_height&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;边界层高度&lt;/td&gt;
&lt;td&gt;m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;total_cloud_cover&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;总云量&lt;/td&gt;
&lt;td&gt;0~1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="42-气压层变量pressure-levels"&gt;4.2 气压层变量（pressure-levels）&lt;/h3&gt;
&lt;p&gt;数据集名：&lt;code&gt;reanalysis-era5-pressure-levels&lt;/code&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API 变量名&lt;/th&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;code&gt;u_component_of_wind&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;东西风&lt;/td&gt;
&lt;td&gt;m/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;v_component_of_wind&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;南北风&lt;/td&gt;
&lt;td&gt;m/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;temperature&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;温度&lt;/td&gt;
&lt;td&gt;K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;geopotential&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;位势&lt;/td&gt;
&lt;td&gt;m²/s²&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;relative_humidity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;相对湿度&lt;/td&gt;
&lt;td&gt;%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;specific_humidity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;比湿&lt;/td&gt;
&lt;td&gt;kg/kg&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;气压层需额外指定 &lt;code&gt;pressure_level&lt;/code&gt; 参数：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;pressure_level&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;500&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;700&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;850&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;925&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;1000&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 单位: hPa&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="5-实战示例"&gt;5. 实战示例&lt;/h2&gt;
&lt;h3 id="51-下载特定区域的风场数据"&gt;5.1 下载特定区域的风场数据&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;cdsapi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cdsapi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;retrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;reanalysis-era5-single-levels&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;product_type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;reanalysis&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;variable&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;10m_u_component_of_wind&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;10m_v_component_of_wind&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;2m_temperature&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;surface_pressure&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;year&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;2024&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;month&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;02d&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt; &lt;span class="c1"&gt;# 全年&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;day&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;02d&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt; &lt;span class="c1"&gt;# 全月&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;time&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;03:00&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;04:00&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;05:00&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;# 仅卫星过境时段&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;area&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;112&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;113&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;# 李村矿区&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;format&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;netcdf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;era5_2024_wind.nc&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="52-并行下载多年数据"&gt;5.2 并行下载多年数据&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;cdsapi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;concurrent.futures&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;as_completed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;download_year&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;下载单年数据&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;era5_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;.nc&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cdsapi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# 每个线程创建独立客户端&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;retrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;reanalysis-era5-single-levels&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;product_type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;reanalysis&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;variable&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;10m_u_component_of_wind&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;10m_v_component_of_wind&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;year&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;month&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;02d&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;day&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;02d&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;time&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;03:00&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;04:00&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;05:00&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;area&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;112&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;113&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;format&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;netcdf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;output&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;[OK] &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;[FAIL] &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 最多 4 个并发&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_workers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;executor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;futures&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;executor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;submit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;download_year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;future&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;as_completed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;futures&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;future&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="53-下载后合并多个文件"&gt;5.3 下载后合并多个文件&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;xarray&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;xr&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;era5_2020.nc&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;era5_2021.nc&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;era5_2022.nc&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open_mfdataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;combine&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;by_coords&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_netcdf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;era5_2020-2022_merged.nc&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;合并完成&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="54-下载气压层数据"&gt;5.4 下载气压层数据&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;cdsapi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cdsapi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;retrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;reanalysis-era5-pressure-levels&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# 注意数据集名不同&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;product_type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;reanalysis&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;variable&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;u_component_of_wind&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;v_component_of_wind&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;temperature&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;pressure_level&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;850&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;925&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;# 气压层 (hPa)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;year&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;2024&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;month&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;06&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;day&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;15&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;time&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;03:00&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;area&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;112&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;113&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;format&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;netcdf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;era5_pressure_levels.nc&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="6-注意事项"&gt;6. 注意事项&lt;/h2&gt;
&lt;h3 id="61-请求大小限制"&gt;6.1 请求大小限制&lt;/h3&gt;
&lt;p&gt;CDS API 对单次请求有大小限制。如果报 &lt;code&gt;403 cost limits exceeded&lt;/code&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;strong&gt;减少时间&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;只下需要的小时（如 &lt;code&gt;03:00-05:00&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;拆分年份&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;按年分别提交&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;缩小区域&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;尽量只覆盖研究区&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-emerald-100 dark:bg-emerald-900 border-emerald-500"
data-callout="tip"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-emerald-600 dark:text-emerald-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 18v-5.25m0 0a6 6 0 0 0 1.5-.189m-1.5.189a6 6 0 0 1-1.5-.189m3.75 7.478a12.1 12.1 0 0 1-4.5 0m3.75 2.383a14.4 14.4 0 0 1-3 0M14.25 18v-.192c0-.983.658-1.823 1.508-2.316a7.5 7.5 0 1 0-7.517 0c.85.493 1.509 1.333 1.509 2.316V18"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;提示&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;一般经验：&lt;strong&gt;1年 × 3小时 × 小区域&lt;/strong&gt; 的单层数据可以一次提交。全年 24 小时的通常需要按月或按季度拆分。&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="62-时间说明"&gt;6.2 时间说明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ERA5 时间均为 &lt;strong&gt;UTC&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;北京时间 = UTC + 8 小时&lt;/li&gt;
&lt;li&gt;例：北京时间 11:00 ≈ UTC 03:00&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="63-空间分辨率"&gt;6.3 空间分辨率&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ERA5 默认分辨率：&lt;strong&gt;0.25° × 0.25°&lt;/strong&gt;（约 25km）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;area&lt;/code&gt; 中的边界会自动对齐到最近的 0.25° 网格&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="64-常见错误"&gt;6.4 常见错误&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;错误&lt;/th&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;code&gt;403 cost limits exceeded&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;请求数据量太大&lt;/td&gt;
&lt;td&gt;减少时间/拆分年份&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ModuleNotFoundError: cdsapi&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;未安装&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pip install cdsapi&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Exception: Missing/malformed configuration&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.cdsapirc&lt;/code&gt; 配置错误&lt;/td&gt;
&lt;td&gt;检查文件路径和格式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SSLError / ConnectionReset&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;网络不稳定&lt;/td&gt;
&lt;td&gt;重试，或挂代理&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="7-读取下载的数据"&gt;7. 读取下载的数据&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;xarray&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;xr&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open_dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;era5_2024_wind.nc&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;netcdf4&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看基本信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;变量:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data_vars&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;坐标:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 提取某时刻某位置的风速&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;lon&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;112.87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;36.09&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;u10&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;longitude&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lon&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;latitude&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;nearest&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;v10&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;longitude&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lon&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;latitude&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;nearest&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;wind_speed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 风向 (气象标准: 从北顺时针)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;wind_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;270&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;degrees&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arctan2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;360&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;风速: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wind_speed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valid_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;.2f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; m/s&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;风向: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wind_dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valid_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;.1f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;°&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="8-参考链接"&gt;8. 参考链接&lt;/h2&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;li&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>拨开云雾见甲烷：一文读懂遥感反演中的匹配滤波 (Matched Filter) 算法</title><link>https://townsend1.site/blog/matched-filter/</link><pubDate>Fri, 10 Apr 2026 10:00:00 +0800</pubDate><guid>https://townsend1.site/blog/matched-filter/</guid><description>&lt;p&gt;在处理高分辨率点源卫星（如 GHGSat、PRISMA 或 EMIT）数据时，我们经常会面临一个棘手的挑战：如何从极其复杂的地表背景中，提取出微弱的特定气体（如甲烷）吸收信号？&lt;/p&gt;
&lt;p&gt;甲烷在短波红外（SWIR）波段（特别是 $1.6\ \mu\text{m}$ 或 $2.3\ \mu\text{m}$ 附近）具有独特的特征吸收峰。然而，这种由气体吸收引起的光谱变化往往只有百分之几甚至更低，完全被淹没在巨大的地表反射率（Albedo）自然起伏和传感器噪声之中。&lt;/p&gt;
&lt;p&gt;为了解决这个“大海捞针”的问题，&lt;strong&gt;匹配滤波（Matched Filter, MF）&lt;/strong&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=""
srcset="https://townsend1.site/blog/matched-filter/matched-filter-cover_hu_a5ec289c2667d329.webp 320w, https://townsend1.site/blog/matched-filter/matched-filter-cover_hu_2ef71a79d4b04f44.webp 480w, https://townsend1.site/blog/matched-filter/matched-filter-cover_hu_9f7aea93366a785.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://townsend1.site/blog/matched-filter/matched-filter-cover_hu_a5ec289c2667d329.webp"
width="760"
height="415"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-核心思想从正向模拟到逆向解算"&gt;1. 核心思想：从“正向模拟”到“逆向解算”&lt;/h2&gt;
&lt;p&gt;整个卫星影像的反演流程，本质上是&lt;strong&gt;正向物理模拟&lt;/strong&gt;与&lt;strong&gt;逆向统计解算&lt;/strong&gt;的完美结合。&lt;/p&gt;
&lt;h3 id="正向物理模拟构建标准尺子"&gt;正向物理模拟（构建标准尺子）&lt;/h3&gt;
&lt;p&gt;首先，我们需要知道“甲烷信号长什么样”。这里通常依赖辐射传输模型（RTM，如 SCIATRAN 或 MODTRAN）。通过输入当前的大气廓线、太阳天顶角等参数，我们可以模拟出不同地面浓度的甲烷会导致卫星观测到的辐射亮度（Radiance）发生怎样的变化。&lt;/p&gt;
&lt;p&gt;在数学上，这个转换关系被称为甲烷的&lt;strong&gt;雅可比矩阵（Jacobian）&lt;/strong&gt;，我们将其定义为&lt;strong&gt;目标波谱 $t$&lt;/strong&gt;。它相当于 RTM 在当前观测条件下为我们提供的一把“标准尺子”。&lt;/p&gt;
&lt;h3 id="逆向统计解算复杂背景下的信号提取"&gt;逆向统计解算（复杂背景下的信号提取）&lt;/h3&gt;
&lt;p&gt;有了尺子，接下来的挑战是如何在充满杂波的真实影像中使用它。这就轮到匹配滤波登场了。它的核心目的只有一个：&lt;strong&gt;抑制背景噪声与地表杂波，最大化目标气体（甲烷）的信噪比（SNR）。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="2-匹配滤波的两个关键动作"&gt;2. 匹配滤波的两个关键动作&lt;/h2&gt;
&lt;p&gt;我们可以用一个生活化的场景来理解匹配滤波：&lt;strong&gt;在火车站汹涌的人潮中，找出一个具有特定长相的通缉犯。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在这个场景里，“通缉犯”是微弱的甲烷吸收信号 $t$，“汹涌的人潮”则是复杂的地表（植被、土壤、建筑）和仪器干扰。匹配滤波主要通过以下两步完成任务：&lt;/p&gt;
&lt;h3 id="动作一背景白化与杂波抑制-background-whitening"&gt;动作一：背景白化与杂波抑制 (Background Whitening)&lt;/h3&gt;
&lt;p&gt;如果你死盯着照片在人群中找人，很容易被路人干扰。匹配滤波的第一步不是找甲烷，而是去“学习背景长什么样”。&lt;/p&gt;
&lt;p&gt;算法会先统计局部图像的背景光谱均值 $\mu$ 和&lt;strong&gt;背景协方差矩阵 $C$&lt;/strong&gt;。协方差矩阵描述了图像中地表光谱的自然变异性。通过乘以协方差矩阵的逆（$C^{-1}$），算法能在数学上把复杂的植被、土壤等背景特征进行“去相关”处理，将其“压平”成均匀的白噪声。这就相当于主动过滤掉了正常路人的特征，让背景变得干净。&lt;/p&gt;
&lt;h3 id="动作二特征投影与完美对冲-target-projection"&gt;动作二：特征投影与完美对冲 (Target Projection)&lt;/h3&gt;
&lt;p&gt;背景被“漂白”后，算法将第一步用 RTM 算出来的“标准尺子”（目标光谱 $t$）作为一个滤波器，投影到处理后的像元光谱上。这就好比拿着通缉犯的照片，在过滤后的环境中进行比对。如果特征完美吻合，滤波器就会输出一个极值（尖峰）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="3-数学推导与公式"&gt;3. 数学推导与公式&lt;/h2&gt;
&lt;p&gt;根据比尔-朗伯定律的线性化近似，包含微弱甲烷羽流的像素光谱 $x$ 可以表示为：&lt;/p&gt;
$$x = \mu + \alpha t + n$$&lt;p&gt;其中，$\mu$ 是背景均值，$\alpha$ 是需要反演的甲烷柱浓度增强量，$n$ 是仪器噪声。&lt;/p&gt;
&lt;p&gt;为了从观测光谱 $x$ 中解算出浓度 $\alpha$，我们通过拉格朗日乘数法寻找一个最优的线性滤波器 $q$，得到经典的匹配滤波算子：&lt;/p&gt;
$$q = \frac{C^{-1} t}{t^T C^{-1} t}$$&lt;p&gt;将该算子应用于去均值后的观测光谱 $(x - \mu)$，即可直接估算出该像素的甲烷浓度 $\hat{\alpha}$：&lt;/p&gt;
$$\hat{\alpha} = \frac{(x - \mu)^T C^{-1} t}{t^T C^{-1} t}$$&lt;p&gt;通过将这个公式遍历影像中的每一个像素，我们就能得到一张以 $\text{ppm}\cdot\text{m}$ 为单位的二维甲烷浓度图。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="4-算法的工程局限性"&gt;4. 算法的工程局限性&lt;/h2&gt;
&lt;p&gt;虽然匹配滤波在数学上非常优雅，且计算效率极高，但在实际遥感工程中，它也并非银弹：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;对背景统计极度敏感：&lt;/strong&gt; 算法的成败完全取决于背景均值 $\mu$ 和协方差矩阵 $C$ 的准确性。如果计算背景的窗口内包含了大面积的甲烷羽流，会导致“信号自相残杀”；如果窗口选取得过大，地表异质性过高，协方差矩阵将无法准确代表局部特征。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;地表反照率（Albedo）的干扰：&lt;/strong&gt; 经典的 MF 算法对地表反射率极其敏感。在极端高亮地表（如金属屋顶）或极暗地表（如水体、阴影），公式中的 $(x - \mu)$ 项会异常变大，从而在最终的浓度图中产生强烈的假阳性（False Positives）或噪声伪影。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;延伸思考：&lt;/strong&gt; 为了解决反照率带来的假阳性问题，学术界目前提出了&lt;strong&gt;反射率校正匹配滤波（Albedo-Corrected Matched Filter, AMF）&lt;/strong&gt;，通过引入一个与反照率相关的缩放因子来优化基础公式，显著降低了由地表亮度急剧变化引起的误报率。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="结语"&gt;结语&lt;/h2&gt;
&lt;p&gt;匹配滤波不仅是一个数学公式，更是连接遥感物理机制与统计信号处理的桥梁。理解了从 RTM 的正向模拟到协方差矩阵的逆向白化，我们在处理海量的高光谱或多光谱数据时，就能更加游刃有余地拨开地表的“云雾”，捕捉到那些隐藏在像素深处的关键信息。&lt;/p&gt;
&lt;h2 id="补充示例"&gt;补充示例&lt;/h2&gt;
&lt;p&gt;我们直接拿遥感卫星最常关注的**短波红外（SWIR）波段来“解剖”这个计算过程。&lt;/p&gt;
&lt;p&gt;由于你掌握着遥感科学与技术的专业背景，我们假设你现在正在处理高光谱数据。甲烷在 $1.6\ \mu\text{m}$ 附近有一个非常著名的吸收带组。&lt;/p&gt;
&lt;p&gt;为了说明问题，我们从你跑的 SCIATRAN 数据中，抽出&lt;strong&gt;两个极具代表性的具体波长&lt;/strong&gt;来进行对比：一个是&lt;strong&gt;强吸收波长&lt;/strong&gt;，另一个是&lt;strong&gt;无吸收（连续统）波长&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="场景设定"&gt;场景设定&lt;/h3&gt;
&lt;p&gt;假设你输入 SCIATRAN 的地表参数和太阳角度固定不变。你只改变了羽流的浓度增强量（X轴），分别跑了 4 组模拟：&lt;strong&gt;0, 100, 200, 300 $\text{ppm}\cdot\text{m}$&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;（注：为方便阅读，假设辐射亮度的单位为标准的 $W/(m^2 \cdot sr \cdot \mu m)$）&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="实例-1切入甲烷的大动脉波长-"&gt;实例 1：切入甲烷的“大动脉”（波长 $= 1650.9\ \text{nm}$）&lt;/h3&gt;
&lt;p&gt;这是甲烷特征吸收极强的一个波段。你提取出这 4 次模拟中该波长的 Radiance 结果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;当浓度为 &lt;strong&gt;0&lt;/strong&gt; $\text{ppm}\cdot\text{m}$ (背景) 时，Radiance = &lt;strong&gt;10.000&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当浓度为 &lt;strong&gt;100&lt;/strong&gt; $\text{ppm}\cdot\text{m}$ 时，Radiance = &lt;strong&gt;9.850&lt;/strong&gt; &lt;em&gt;(甲烷吸收了部分能量，亮度下降)&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当浓度为 &lt;strong&gt;200&lt;/strong&gt; $\text{ppm}\cdot\text{m}$ 时，Radiance = &lt;strong&gt;9.700&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当浓度为 &lt;strong&gt;300&lt;/strong&gt; $\text{ppm}\cdot\text{m}$ 时，Radiance = &lt;strong&gt;9.550&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;开始算雅可比 $t$：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;你把这 4 个点放在坐标系里，用代码进行线性拟合求斜率：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;公式：$\text{Slope} = \frac{\Delta \text{Radiance}}{\Delta \text{浓度}}$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;计算：$(9.850 - 10.000) / 100 = \mathbf{-0.0015}$&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="q1--多组浓度"&gt;Q1 ： 多组浓度&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;结论：&lt;/strong&gt; 在 $1650.9\ \text{nm}$ 这个波段，雅可比刻度是 &lt;strong&gt;-0.0015&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;物理意义：在当前气象条件下，地表每增加 $1\ \text{ppm}\cdot\text{m}$ 的甲烷，卫星在这个波段接收到的辐射亮度就会&lt;strong&gt;固定减少&lt;/strong&gt; $0.0015$。&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="实例-2切入旁边的白板波长-"&gt;实例 2：切入旁边的“白板”（波长 $= 1550.0\ \text{nm}$）&lt;/h3&gt;
&lt;p&gt;这个波长距离吸收峰很远，属于纯粹的连续统（Continuum）背景，甲烷对这里的电磁波几乎完全透明。你再次提取出这 4 次模拟的 Radiance 结果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;当浓度为 &lt;strong&gt;0&lt;/strong&gt; $\text{ppm}\cdot\text{m}$ (背景) 时，Radiance = &lt;strong&gt;12.000&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当浓度为 &lt;strong&gt;100&lt;/strong&gt; $\text{ppm}\cdot\text{m}$ 时，Radiance = &lt;strong&gt;12.000&lt;/strong&gt; &lt;em&gt;(甲烷不吸收这个波段，亮度毫无反应)&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当浓度为 &lt;strong&gt;200&lt;/strong&gt; $\text{ppm}\cdot\text{m}$ 时，Radiance = &lt;strong&gt;12.000&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当浓度为 &lt;strong&gt;300&lt;/strong&gt; $\text{ppm}\cdot\text{m}$ 时，Radiance = &lt;strong&gt;12.000&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;开始算雅可比 $t$：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;同样去求斜率：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;计算：$(12.000 - 12.000) / 100 = \mathbf{0}$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;结论：&lt;/strong&gt; 在 $1550.0\ \text{nm}$ 这个波段，雅可比刻度是 &lt;strong&gt;0&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="最终的目标波谱-是如何成型的"&gt;最终的“目标波谱 $t$”是如何成型的？&lt;/h3&gt;
&lt;p&gt;高光谱卫星通常有几百个波段。你的代码写了一个 &lt;code&gt;for&lt;/code&gt; 循环，把上面这个“求斜率”的过程在每一个波长上都跑了一遍。&lt;/p&gt;
&lt;p&gt;最终，你得到了一个包含几百个斜率值的&lt;strong&gt;列向量（雅可比矩阵）&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;$t = \begin{bmatrix} \dots \\ 0 \\ \dots \\ -0.0015 \\ \dots \\ 0 \\ \dots \end{bmatrix} \begin{matrix} \leftarrow 1550.0\ \text{nm 的斜率} \\ \\ \leftarrow 1650.9\ \text{nm 的斜率} \\ \\ \end{matrix}$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这就是匹配滤波算法手里拿的那把“标准尺子”！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当你把卫星拍到的真实影像数据喂给匹配滤波算法时，算法就会拿着这个 $t$ 向量去跟影像里的每一个像元做点积（投影）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果算法看到某个像元在 $1650.9\ \text{nm}$ 处亮度大幅下降，而在 $1550.0\ \text{nm}$ 处亮度正常，它就会发现这个特征与 $t$ 向量&lt;strong&gt;完美匹配&lt;/strong&gt;，从而判定这里有甲烷，并根据下降的幅度（结合那把 $-0.0015$ 的尺子）直接换算出真实的浓度。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>国产 OGI 技术发展全景：2025-2030 路线图</title><link>https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/</link><pubDate>Wed, 08 Apr 2026 19:10:00 +0800</pubDate><guid>https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/</guid><description>&lt;h2 id="1-介绍"&gt;1 介绍&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;光学气体成像（Optical Gas Imaging, OGI）利用气体在红外或紫外波段吸收特性的差异，通过中红外（MWIR）、短波红外（SWIR）或紫外成像，实现对气体泄漏的可视化检测。OGI 在石油石化、天然气长输管道、化工园区、环保监管与军工侦察（CBRN、尾焰、烟幕）等领域具有不可替代的价值。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="2-ogi-技术概述"&gt;2 OGI 技术概述&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;整个波段&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="OGI 全波段示意"
srcset="https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-01-spectrum_hu_54d6a0d30c5badf9.webp 320w, https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-01-spectrum_hu_21e9c742e30d639a.webp 480w, https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-01-spectrum_hu_b4f861dd3429ab53.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-01-spectrum_hu_54d6a0d30c5badf9.webp"
width="760"
height="395"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;核心硬件包括：&lt;strong&gt;探测器、制冷机、滤光片、光学镜头、AI 算法&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="3-国内-ogi-技术热点"&gt;3 国内 OGI 技术热点&lt;/h2&gt;
&lt;p&gt;当前国内关注的关键主题包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;甲烷 / VOC 泄漏可视化（MWIR）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;无人机轻量化 OGI（SWIR）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OGI 定量化（QOGI）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;超窄带滤光片国产化&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多模态（OGI + 热像 + 可见光）融合&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;战场态势感知（烟幕、尾焰、化学剂）&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="4-国产-ogi-关键突破点"&gt;4 国产 OGI 关键突破点&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;五大核心突破点&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="国产 OGI 关键突破点"
srcset="https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-02-breakthroughs_hu_e1adc520d1407e9c.webp 320w, https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-02-breakthroughs_hu_226a68127915d399.webp 480w, https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-02-breakthroughs_hu_5b2f73bff596a1be.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-02-breakthroughs_hu_e1adc520d1407e9c.webp"
width="760"
height="391"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&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;th&gt;当前瓶颈 (2025)&lt;/th&gt;
&lt;th&gt;2025 阶段目标&lt;/th&gt;
&lt;th&gt;2026 阶段目标&lt;/th&gt;
&lt;th&gt;2027-2028 阶段目标&lt;/th&gt;
&lt;th&gt;2029-2030 阶段目标 (2030 总目标)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;MCT 冷却探测器&lt;/td&gt;
&lt;td&gt;NETD 偏高；640 阵列成熟但 1024 不足&lt;/td&gt;
&lt;td&gt;320/640 阵列工程化稳定量产；冷却机/ROIC 配套成熟&lt;/td&gt;
&lt;td&gt;完成 1024×1024 工程样机；小规模试点&lt;/td&gt;
&lt;td&gt;1024×768 / 1024×1024 性能优化，实现小批量工程应用&lt;/td&gt;
&lt;td&gt;1024×1024 工程化量产；NETD &amp;lt;20 mK，接近国际先进&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Stirling 制冷机&lt;/td&gt;
&lt;td&gt;寿命仅 8,000-12,000 h&lt;/td&gt;
&lt;td&gt;国产制冷机稳定应用于工业 OGI&lt;/td&gt;
&lt;td&gt;寿命提升至 12,000-15,000 h；噪声/振动降低&lt;/td&gt;
&lt;td&gt;寿命达 15,000-18,000 h；可靠性验证体系完善&lt;/td&gt;
&lt;td&gt;&amp;gt;20,000 h；满足固定监测与军工高可靠性要求&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;SWIR 全谱国产化 (InGaAs)&lt;/td&gt;
&lt;td&gt;640 成熟；1280 在量产中&lt;/td&gt;
&lt;td&gt;640×512 国产成熟，用于固定/移动 OGI&lt;/td&gt;
&lt;td&gt;1280×1024 实用化，进入 UAV 巡检主力&lt;/td&gt;
&lt;td&gt;多光谱 SWIR (VIS-SWIR) 量产；夜视+烟雾穿透提升&lt;/td&gt;
&lt;td&gt;2K 面阵量产；成本下降 30-50%；成为 UAV 主流探测器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;超窄带滤光片&lt;/td&gt;
&lt;td&gt;&amp;lt;40 nm 可量产；中心波长精度有限&lt;/td&gt;
&lt;td&gt;40-80 nm 工程化成熟；OGI 基础应用广&lt;/td&gt;
&lt;td&gt;多滤光片切换 (CH4/VOC/CO) 结构成熟&lt;/td&gt;
&lt;td&gt;成功量产 &amp;lt;30 nm 超窄带滤光片；精度/透过率提升&lt;/td&gt;
&lt;td&gt;&amp;lt;20 nm、OD4-OD5 标准化；定量 OGI 标配器件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;定量 OGI (QOGI) 算法体系&lt;/td&gt;
&lt;td&gt;无统一数据集，误报率高&lt;/td&gt;
&lt;td&gt;AI 羽流检测（定性检测稳定化）&lt;/td&gt;
&lt;td&gt;QOGI 1.0 初级定量：相对泄漏量估计&lt;/td&gt;
&lt;td&gt;QOGI 2.0 工程化定量：深度学习 + 物理模型；kg/h 反演&lt;/td&gt;
&lt;td&gt;QOGI 3.0 国标级定量：建立国家标准；支持碳核查与 CCUS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;附&lt;/td&gt;
&lt;td&gt;T2SL (二类超晶格 MWIR/LWIR 探测器)&lt;/td&gt;
&lt;td&gt;外延周期多（&amp;gt;1000 层）一致性不足；ROIC 匹配不成熟&lt;/td&gt;
&lt;td&gt;完成 640×512 T2SL 原型样机；验证初步 MWIR 灵敏度&lt;/td&gt;
&lt;td&gt;优化外延材料体系，提升均匀性；640→1024 工程型机突破&lt;/td&gt;
&lt;td&gt;形成 1024×1024 T2SL 原型机；NETD、暗电流接近中端 MCT&lt;/td&gt;
&lt;td&gt;1280×1024 工程化样机；可满足工业/军工应用；成为国产 MWIR 战略备份路线&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="5-红外成像光谱发展路线"&gt;5 红外成像光谱发展路线&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;发展路线&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;阶段&lt;/th&gt;
&lt;th&gt;SWIR (短波红外)&lt;/th&gt;
&lt;th&gt;MWIR (中波红外)&lt;/th&gt;
&lt;th&gt;光学件&lt;/th&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;2025&lt;/td&gt;
&lt;td&gt;640×512&lt;/td&gt;
&lt;td&gt;320/640 稳定&lt;/td&gt;
&lt;td&gt;普通带宽成熟&lt;/td&gt;
&lt;td&gt;AI 羽流检测&lt;/td&gt;
&lt;td&gt;工厂巡检、车载&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026&lt;/td&gt;
&lt;td&gt;1280×1024&lt;/td&gt;
&lt;td&gt;制冷机寿命提升&lt;/td&gt;
&lt;td&gt;多滤光片切换&lt;/td&gt;
&lt;td&gt;初级定量&lt;/td&gt;
&lt;td&gt;环保、化工&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2027-2028&lt;/td&gt;
&lt;td&gt;多光谱 SWIR&lt;/td&gt;
&lt;td&gt;1024×768 研发突破&lt;/td&gt;
&lt;td&gt;&amp;lt;30 nm&lt;/td&gt;
&lt;td&gt;工程化定量&lt;/td&gt;
&lt;td&gt;UAV 巡线、CCUS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2029-2030&lt;/td&gt;
&lt;td&gt;2K 面阵&lt;/td&gt;
&lt;td&gt;1024×1024 工程化&lt;/td&gt;
&lt;td&gt;&amp;lt;20 nm 标准化&lt;/td&gt;
&lt;td&gt;国标级定量&lt;/td&gt;
&lt;td&gt;固定监测、CBRN&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="6-国产-ogi-产业链全景"&gt;6 国产 OGI 产业链全景&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;产业链全景&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="国产 OGI 产业链全景"
srcset="https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-03-industry-chain_hu_b3ccd34e9152315a.webp 320w, https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-03-industry-chain_hu_bf913e69350e9872.webp 480w, https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-03-industry-chain_hu_fdc4cbab08d7b4a0.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-03-industry-chain_hu_b3ccd34e9152315a.webp"
width="760"
height="421"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="7-国际主流厂商对标分析"&gt;7 国际主流厂商对标分析&lt;/h2&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="国际主流厂商对标"
srcset="https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-04-benchmark_hu_885f12e4ec1b4e60.webp 320w, https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-04-benchmark_hu_596c6c4a133c874d.webp 480w, https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-04-benchmark_hu_e8665118d7a284c6.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-04-benchmark_hu_885f12e4ec1b4e60.webp"
width="760"
height="406"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&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;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;外延片 (MCT/InGaAs)、IR 镜片材料&lt;/td&gt;
&lt;td&gt;三安光电、北方华创&lt;/td&gt;
&lt;td&gt;外延一致性仍是瓶颈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;核心探测器 (SWIR)&lt;/td&gt;
&lt;td&gt;InGaAs 400–1700 nm&lt;/td&gt;
&lt;td&gt;GHOPTO（国惠）、泓科光电&lt;/td&gt;
&lt;td&gt;技术成熟、国产优势强&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;核心探测器 (MWIR)&lt;/td&gt;
&lt;td&gt;MCT/InSb&lt;/td&gt;
&lt;td&gt;GST（高德）、航天系、Ulirvision（优利德）&lt;/td&gt;
&lt;td&gt;高端面阵仍在突破&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;制冷机&lt;/td&gt;
&lt;td&gt;Stirling（斯特林制冷机）&lt;/td&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;3.3 μm、4.6 μm、超窄带&lt;/td&gt;
&lt;td&gt;Multi IR、Ant、WaveteK&lt;/td&gt;
&lt;td&gt;国产成熟&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;整机产品&lt;/td&gt;
&lt;td&gt;MWIR/SWIR OGI 相机&lt;/td&gt;
&lt;td&gt;GST、Ulirvision、GuideIR（高德）&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;td&gt;和利时、中控、中石油装备&lt;/td&gt;
&lt;td&gt;与 SCADA/DCS 集成明显&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="8-国内外差距总结"&gt;8 国内外差距总结&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;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;FLIR&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;工业 OGI 全球第一、算法最成熟&lt;/td&gt;
&lt;td&gt;行业标准建立者&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Teledyne&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;全链条 MWIR 产业&lt;/td&gt;
&lt;td&gt;MCT 先进&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Xenics&lt;/td&gt;
&lt;td&gt;比利时&lt;/td&gt;
&lt;td&gt;SWIR 领先&lt;/td&gt;
&lt;td&gt;已被 Teledyne 收购&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lynred&lt;/td&gt;
&lt;td&gt;法国&lt;/td&gt;
&lt;td&gt;全球最强 MCT 外延&lt;/td&gt;
&lt;td&gt;军用核心供应商&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IRCameras&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;科研级 MWIR、超高灵敏度&lt;/td&gt;
&lt;td&gt;高端市场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DRS&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;最强制冷机&lt;/td&gt;
&lt;td&gt;&amp;gt;30000 h 寿命&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infratec&lt;/td&gt;
&lt;td&gt;德国&lt;/td&gt;
&lt;td&gt;工业红外系统强者&lt;/td&gt;
&lt;td&gt;应用广&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="9-未来趋势"&gt;9 未来趋势&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;th&gt;核心驱动力&lt;/th&gt;
&lt;th&gt;2030 预期&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T1&lt;/td&gt;
&lt;td&gt;UAV + 轻量化 OGI&lt;/td&gt;
&lt;td&gt;SWIR 成熟、巡检需求&lt;/td&gt;
&lt;td&gt;市占率 35–45%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T2&lt;/td&gt;
&lt;td&gt;工厂固定 OGI 网络&lt;/td&gt;
&lt;td&gt;安全监管升级&lt;/td&gt;
&lt;td&gt;每厂 10–30 台&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T3&lt;/td&gt;
&lt;td&gt;OGI 定量化 (QOGI)&lt;/td&gt;
&lt;td&gt;EPA/CCUS/碳核查&lt;/td&gt;
&lt;td&gt;泄漏量化 kg/h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T4&lt;/td&gt;
&lt;td&gt;多模态融合&lt;/td&gt;
&lt;td&gt;降误报、融入风险感知&lt;/td&gt;
&lt;td&gt;主流产品≥2传感器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T5&lt;/td&gt;
&lt;td&gt;CBRN + 战场态势感知&lt;/td&gt;
&lt;td&gt;战场多模态需求&lt;/td&gt;
&lt;td&gt;装备化应用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T6&lt;/td&gt;
&lt;td&gt;国产化自主可控&lt;/td&gt;
&lt;td&gt;全国产链成熟&lt;/td&gt;
&lt;td&gt;出口能力提升&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="10-趋势国际政策--工程数据--军事需求"&gt;10 趋势（国际政策 + 工程数据 + 军事需求）&lt;/h2&gt;
&lt;h3 id="101-国际形势"&gt;10.1 国际形势&lt;/h3&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="国际政策驱动"
srcset="https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-05-policy_hu_f0635a023628fc7c.webp 320w, https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-05-policy_hu_361c09543f5aa9e5.webp 480w, https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-05-policy_hu_3a631e000b8b2eb2.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-05-policy_hu_f0635a023628fc7c.webp"
width="760"
height="393"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;EPA Methane Rule 2024：首次要求 OGI 具备“定量能力”&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;欧盟 CCUS 管理标准：要求 CO2 泄漏量化报告&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;OGI 必须从“看到”升级到“量到”。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="102-工程应用趋势"&gt;10.2 工程应用趋势&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;无人机 OGI 全球采购增速 &amp;gt;50%/年&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;北美油田 38% 巡检已由 UAV 完成&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;国产 SWIR OGI 成本下降 30–50%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UAV + OGI 在效率和安全性上明显优于人工巡检&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="103-军事需求"&gt;10.3 军事需求&lt;/h3&gt;
&lt;p&gt;国外已在多个场景部署 OGI：&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;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;美国&lt;/td&gt;
&lt;td&gt;MWIR&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;td&gt;UV-DIAL&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;td&gt;SWIR&lt;/td&gt;
&lt;td&gt;看穿烟雾&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="104-国内行业趋势"&gt;10.4 国内行业趋势&lt;/h3&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="国内行业趋势"
srcset="https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-06-domestic-trend_hu_b92dc0f15dbc073.webp 320w, https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-06-domestic-trend_hu_86d90abe50d1909e.webp 480w, https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-06-domestic-trend_hu_18b284d15a19656f.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://townsend1.site/blog/ogi-technology-roadmap-2025-2030/img-06-domestic-trend_hu_b92dc0f15dbc073.webp"
width="760"
height="407"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;化工园区试点“OGI 固定监测网”成功&lt;/li&gt;
&lt;li&gt;国家管网推广“无人机 + OGI 巡检”&lt;/li&gt;
&lt;li&gt;碳监测体系明确要求“甲烷排放量化工具”&lt;/li&gt;
&lt;li&gt;OGI 将从“设备”升级为“平台 + 系统”能力&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="11-总结"&gt;11 总结&lt;/h2&gt;
&lt;p&gt;2025–2030 年将是国产 OGI 从“追赶期”跨越到“体系化突破期”的关键阶段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SWIR：国产全面成熟，具备竞争力&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MWIR：MCT + 制冷机仍是核心技术瓶颈&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;滤光片：国产已领先&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;算法：未来决胜点在定量化（QOGI）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;应用：从巡检扩展到固定监测与战场态势感知&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;产业链：正在形成自主可控体系&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;随着国产探测器、光学件、算法与系统能力成熟，中国将在 2030 年前后具备完整的 OGI 自主可控能力，并有机会在 SWIR、UAV、定量化 OGI 等方向形成国际优势。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;来源微信公众号：光学工作站&lt;/p&gt;</description></item><item><title>如何用 Hugo 搭建自己的学术博客（完整实战）</title><link>https://townsend1.site/blog/how-to-build-my-blog/</link><pubDate>Wed, 08 Apr 2026 16:32:00 +0800</pubDate><guid>https://townsend1.site/blog/how-to-build-my-blog/</guid><description>&lt;p&gt;这篇文章记录了我搭建个人学术博客的完整过程。目标很明确：做一个可长期维护、能服务博士阶段研究工作的知识库网站。&lt;/p&gt;
&lt;p&gt;我最终采用了 &lt;strong&gt;Hugo + HugoBlox Academic CV + GitHub Pages&lt;/strong&gt; 的组合。下面是可复用的全过程。&lt;/p&gt;
&lt;h2 id="一为什么选-hugo"&gt;一、为什么选 Hugo&lt;/h2&gt;
&lt;p&gt;我最初尝试过 Astro，也成功部署了，但后续更需要“学术主页 + 博客 + 简历/经历”这一类结构，所以切换到 HugoBlox Academic CV。&lt;/p&gt;
&lt;p&gt;这套方案的优势：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;静态站点，部署稳定，成本低。&lt;/li&gt;
&lt;li&gt;学术主页结构成熟，适合博士生。&lt;/li&gt;
&lt;li&gt;内容用 Markdown/YAML 管理，长期维护成本低。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="二环境准备windows--powershell"&gt;二、环境准备（Windows / PowerShell）&lt;/h2&gt;
&lt;h3 id="1-安装-hugo-extended"&gt;1. 安装 Hugo Extended&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-id&lt;/span&gt; &lt;span class="n"&gt;Hugo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Hugo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Extended&lt;/span&gt; &lt;span class="n"&gt;-e&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-source&lt;/span&gt; &lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-accept-package-agreements&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-accept-source-agreements&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;验证：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;hugo&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-安装-gohugo-modules-需要"&gt;2. 安装 Go（Hugo Modules 需要）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-id&lt;/span&gt; &lt;span class="n"&gt;GoLang&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Go&lt;/span&gt; &lt;span class="n"&gt;-e&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-source&lt;/span&gt; &lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-accept-package-agreements&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-accept-source-agreements&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-安装-node-依赖主题构建需要"&gt;3. 安装 Node 依赖（主题构建需要）&lt;/h3&gt;
&lt;p&gt;在项目目录执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;npm&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="三创建并初始化站点"&gt;三、创建并初始化站点&lt;/h2&gt;
&lt;p&gt;我使用了 HugoBlox 官方 Academic CV 模板，直接克隆最省事：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;&lt;span class="n"&gt;D:&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;8_blox&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;clone&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="p"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;HugoBlox&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;theme-academic&lt;/span&gt;&lt;span class="n"&gt;-cv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;git&lt;/span&gt; &lt;span class="nb"&gt;my-blog&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd my-blog&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="四配置成自己的学术主页"&gt;四、配置成自己的学术主页&lt;/h2&gt;
&lt;p&gt;关键文件如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;config/_default/hugo.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;config/_default/menus.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;data/authors/me.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;content/_index.md&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="必改项"&gt;必改项&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;baseURL&lt;/code&gt;：改为你的 Pages 地址（例如 &lt;code&gt;https://用户名.github.io/仓库名/&lt;/code&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;h2 id="五本地预览与构建"&gt;五、本地预览与构建&lt;/h2&gt;
&lt;p&gt;本地开发：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;hugo&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="n"&gt;-D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;生产构建：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;hugo&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-gc&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-minify&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-baseURL&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://用户名.github.io/仓库名/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="六推送-github-并启用自动部署"&gt;六、推送 GitHub 并启用自动部署&lt;/h2&gt;
&lt;h3 id="1-初始化并推送仓库"&gt;1. 初始化并推送仓库&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt; &lt;span class="n"&gt;-b&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;commit&lt;/span&gt; &lt;span class="n"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;init blog&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;origin&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="p"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;用户名&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;仓库名&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;git&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;push&lt;/span&gt; &lt;span class="n"&gt;-u&lt;/span&gt; &lt;span class="n"&gt;origin&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-github-pages-设置"&gt;2. GitHub Pages 设置&lt;/h3&gt;
&lt;p&gt;仓库中打开：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Settings -&amp;gt; Pages -&amp;gt; Source = GitHub Actions&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;然后每次 &lt;code&gt;git push&lt;/code&gt; 都会自动部署。&lt;/p&gt;
&lt;h2 id="七我遇到的典型问题与解决方法"&gt;七、我遇到的典型问题与解决方法&lt;/h2&gt;
&lt;h3 id="1-author-identity-unknown"&gt;1. &lt;code&gt;Author identity unknown&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;原因：Git 用户名/邮箱未配置。&lt;br&gt;
解决：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-global&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;你的用户名&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-global&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;email&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;你的邮箱&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-src-refspec-main-does-not-match-any"&gt;2. &lt;code&gt;src refspec main does not match any&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;原因：还没有成功 commit。&lt;br&gt;
解决：先 &lt;code&gt;git add&lt;/code&gt; + &lt;code&gt;git commit&lt;/code&gt;，再 &lt;code&gt;git push -u origin main&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id="3-pages-第一次部署报-not-found"&gt;3. Pages 第一次部署报 Not Found&lt;/h3&gt;
&lt;p&gt;原因：刚切换到 GitHub Actions，Pages 站点状态还没同步。&lt;br&gt;
解决：重跑一次 workflow 即可。&lt;/p&gt;
&lt;h3 id="4-头像不显示"&gt;4. 头像不显示&lt;/h3&gt;
&lt;p&gt;这是我这次踩过的坑：&lt;br&gt;
本地有头像，但文件没提交到 GitHub，线上构建拿不到资源。&lt;/p&gt;
&lt;p&gt;正确做法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;头像放在 &lt;code&gt;assets/media/authors/me.jpg&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;确认已 &lt;code&gt;git add&lt;/code&gt; 并推送。&lt;/li&gt;
&lt;li&gt;等 Actions 绿灯后强刷页面。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="八我当前的网站结构"&gt;八、我当前的网站结构&lt;/h2&gt;
&lt;p&gt;为了先保证质量，我目前只保留：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;简介&lt;/li&gt;
&lt;li&gt;博客&lt;/li&gt;
&lt;li&gt;经历&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;“论文”和“项目”先隐藏，等内容积累后再开放。&lt;/p&gt;
&lt;h2 id="九可复用更新流程"&gt;九、可复用更新流程&lt;/h2&gt;
&lt;p&gt;以后每次更新都可以按这个流程：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;commit&lt;/span&gt; &lt;span class="n"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;update content&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;push&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;等待 GitHub Actions 成功后，网站自动更新。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;对我来说，博客不是一次性作品，而是博士阶段的长期基础设施。&lt;br&gt;
它的核心价值不是“页面好看”，而是把论文阅读、实验复盘和写作经验，沉淀成可复用的研究资产。&lt;/p&gt;</description></item><item><title>经历</title><link>https://townsend1.site/experience/</link><pubDate>Wed, 08 Apr 2026 00:00:00 +0000</pubDate><guid>https://townsend1.site/experience/</guid><description/></item><item><title>Pandas</title><link>https://townsend1.site/projects/pandas/</link><pubDate>Thu, 26 Oct 2023 00:00:00 +0000</pubDate><guid>https://townsend1.site/projects/pandas/</guid><description>&lt;p&gt;Flexible and powerful data analysis / manipulation library for Python, providing labeled data structures.&lt;/p&gt;</description></item><item><title>PyTorch</title><link>https://townsend1.site/projects/pytorch/</link><pubDate>Thu, 26 Oct 2023 00:00:00 +0000</pubDate><guid>https://townsend1.site/projects/pytorch/</guid><description>&lt;p&gt;PyTorch is a Python package that provides tensor computation (like NumPy) with strong GPU acceleration.&lt;/p&gt;</description></item><item><title>scikit-learn</title><link>https://townsend1.site/projects/scikit/</link><pubDate>Thu, 26 Oct 2023 00:00:00 +0000</pubDate><guid>https://townsend1.site/projects/scikit/</guid><description>&lt;p&gt;scikit-learn is a Python module for machine learning built on top of SciPy and is distributed under the 3-Clause BSD license.&lt;/p&gt;</description></item><item><title>An example preprint / working paper</title><link>https://townsend1.site/publications/preprint/</link><pubDate>Sun, 07 Apr 2019 00:00:00 +0000</pubDate><guid>https://townsend1.site/publications/preprint/</guid><description>&lt;p&gt;This work is driven by the results in my
on LLMs.&lt;/p&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;注意&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Create your slides in Markdown - click the &lt;em&gt;Slides&lt;/em&gt; button to check out the example.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Add the publication&amp;rsquo;s &lt;strong&gt;full text&lt;/strong&gt; or &lt;strong&gt;supplementary notes&lt;/strong&gt; here. You can use rich formatting such as including
.&lt;/p&gt;</description></item><item><title>An example journal article</title><link>https://townsend1.site/publications/journal-article/</link><pubDate>Tue, 01 Sep 2015 00:00:00 +0000</pubDate><guid>https://townsend1.site/publications/journal-article/</guid><description>
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;注意&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Click the &lt;em&gt;Cite&lt;/em&gt; button above to demo the feature to enable visitors to import publication metadata into their reference management software.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;注意&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Create your slides in Markdown - click the &lt;em&gt;Slides&lt;/em&gt; button to check out the example.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Add the publication&amp;rsquo;s &lt;strong&gt;full text&lt;/strong&gt; or &lt;strong&gt;supplementary notes&lt;/strong&gt; here. You can use rich formatting such as including
.&lt;/p&gt;</description></item><item><title>An example conference paper</title><link>https://townsend1.site/publications/conference-paper/</link><pubDate>Mon, 01 Jul 2013 00:00:00 +0000</pubDate><guid>https://townsend1.site/publications/conference-paper/</guid><description>
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;注意&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Click the &lt;em&gt;Cite&lt;/em&gt; button above to demo the feature to enable visitors to import publication metadata into their reference management software.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;注意&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Create your slides in Markdown - click the &lt;em&gt;Slides&lt;/em&gt; button to check out the example.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Add the publication&amp;rsquo;s &lt;strong&gt;full text&lt;/strong&gt; or &lt;strong&gt;supplementary notes&lt;/strong&gt; here. You can use rich formatting such as including
.&lt;/p&gt;</description></item><item><title/><link>https://townsend1.site/gemini_generated_image_6w910l6w910l6w91/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://townsend1.site/gemini_generated_image_6w910l6w910l6w91/</guid><description/></item></channel></rss>