<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Riceneeder</title>
  
  <subtitle>白天研究生、晚上研究死</subtitle>
  <link href="https://gankun.cn.lu/atom.xml" rel="self"/>
  
  <link href="https://gankun.cn.lu/"/>
  <updated>2026-04-02T11:31:19.018Z</updated>
  <id>https://gankun.cn.lu/</id>
  
  <author>
    <name>梵高先生</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>通过BIOMOD2进行白芷未来气候适宜性预测——承接前文的后续投影实践</title>
    <link href="https://gankun.cn.lu/posts/2026-04-02/"/>
    <id>https://gankun.cn.lu/posts/2026-04-02/</id>
    <published>2026-04-02T09:57:30.000Z</published>
    <updated>2026-04-02T11:31:19.018Z</updated>
    
    <content type="html"><![CDATA[<p>上一篇文章已经完成了白芷在当前气候条件下的物种分布建模、评估与集成预测。真正有价值的下一步，不只是看“现在哪里适合”，而是继续回答“未来哪些区域还适合、适合性会如何变化”这个问题。这个步骤通常被称为未来情景投影，也是物种分布模型在气候变化研究中的核心应用之一。</p><p>这篇文章就接着前文，介绍如何在已经保存好 BIOMOD2 建模对象的前提下，直接开展后续预测。整个流程的重点很简单：先准备未来气候环境变量，再把它们与训练阶段的变量顺序和名称对齐，最后调用 BIOMOD2 的投影与集成预测接口，输出未来情景下的白芷适宜性分布图。</p><h2 id="一、前提条件"><a href="#一、前提条件" class="headerlink" title="一、前提条件"></a>一、前提条件</h2><p>这一部分默认你已经完成了当前气候下的建模，并保存了 <code>biomod_objects.rds</code>，其中至少包含：</p><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 读取前文保存的 BIOMOD2 模型对象</span></span><br><span class="line">objs <span class="operator">&lt;-</span> readRDS<span class="punctuation">(</span><span class="string">&quot;outputs/Angelica_dahurica/biomod_objects.rds&quot;</span><span class="punctuation">)</span></span><br><span class="line">biomod_model_out <span class="operator">&lt;-</span> objs<span class="operator">$</span>biomod_model_out  <span class="comment"># 单个模型的训练结果</span></span><br><span class="line">biomod_em <span class="operator">&lt;-</span> objs<span class="operator">$</span>biomod_em              <span class="comment"># 集成模型的结果</span></span><br></pre></td></tr></table></figure></div><p>换句话说，后续预测不需要重新训练模型，只需要复用已经筛选和集成好的模型对象。这样做的好处很明显：</p><ul><li>节省大量计算时间；</li><li>保证未来投影与当前模型完全一致；</li><li>便于批量切换不同 SSP 情景和未来时间段。</li></ul><h2 id="二、准备未来气候数据"><a href="#二、准备未来气候数据" class="headerlink" title="二、准备未来气候数据"></a>二、准备未来气候数据</h2><p>未来预测最容易出错的地方，不是模型本身，而是环境变量的准备。未来栅格文件必须满足两个条件：</p><ol><li>变量种类与当前建模阶段一致；</li><li>变量名称和顺序与训练时严格一致。</li></ol><p>通常建议把未来环境变量单独放进一个目录，例如：</p><div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">future_env/</span><br><span class="line">└── ssp126_2041-2060/</span><br><span class="line">    ├── bio1.tif</span><br><span class="line">    ├── bio2.tif</span><br><span class="line">    ├── bio3.tif</span><br><span class="line">    └── ...</span><br></pre></td></tr></table></figure></div><p>如果你后面还要预测 SSP245、SSP585，或者 2021-2040、2061-2080 等时间段，可以继续按同样结构扩展目录。这样脚本只需要改一个路径，就能切换情景。</p><h2 id="三、读取已保存对象"><a href="#三、读取已保存对象" class="headerlink" title="三、读取已保存对象"></a>三、读取已保存对象</h2><p>未来预测脚本的第一步，是直接读取前文保存的模型对象：</p><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 设置工作目录为项目根目录</span></span><br><span class="line">setwd<span class="punctuation">(</span><span class="string">&quot;/data2/xty/zqf/gzk&quot;</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">library<span class="punctuation">(</span>terra<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>sp<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>dismo<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>ggplot2<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>viridis<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>biomod2<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>R.utils<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>randomForest<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>gbm<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>mgcv<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>stats<span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">output_dir <span class="operator">&lt;-</span> file.path<span class="punctuation">(</span>getwd<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">,</span> <span class="string">&quot;outputs&quot;</span><span class="punctuation">,</span> <span class="string">&quot;Angelica_dahurica&quot;</span><span class="punctuation">)</span></span><br><span class="line"><span class="comment"># 定义已保存对象文件的完整路径</span></span><br><span class="line">objs_path <span class="operator">&lt;-</span> file.path<span class="punctuation">(</span>output_dir<span class="punctuation">,</span> <span class="string">&quot;biomod_objects.rds&quot;</span><span class="punctuation">)</span></span><br><span class="line"><span class="comment"># 检查对象文件是否存在</span></span><br><span class="line"><span class="keyword">if</span> <span class="punctuation">(</span><span class="operator">!</span>file.exists<span class="punctuation">(</span>objs_path<span class="punctuation">)</span><span class="punctuation">)</span> <span class="punctuation">&#123;</span></span><br><span class="line">  stop<span class="punctuation">(</span><span class="string">&quot;未找到 biomod_objects.rds，请先运行当前气候脚本到保存对象步骤。&quot;</span><span class="punctuation">)</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line"><span class="comment"># 从磁盘读取已保存的 BIOMOD2 对象</span></span><br><span class="line">objs <span class="operator">&lt;-</span> readRDS<span class="punctuation">(</span>objs_path<span class="punctuation">)</span></span><br><span class="line">biomod_model_out <span class="operator">&lt;-</span> objs<span class="operator">$</span>biomod_model_out  <span class="comment"># 取出单模型训练结果</span></span><br><span class="line">biomod_em <span class="operator">&lt;-</span> objs<span class="operator">$</span>biomod_em                <span class="comment"># 取出集成模型结果</span></span><br></pre></td></tr></table></figure></div><p>这段代码的意义在于：当前模型和集成模型已经被固定下来，后续只做投影，不再重新拟合。</p><h2 id="四、加载未来环境变量"><a href="#四、加载未来环境变量" class="headerlink" title="四、加载未来环境变量"></a>四、加载未来环境变量</h2><p>未来栅格建议使用 <code>terra</code> 统一处理。它比传统的 <code>raster</code> 更适合大栅格数据，内存占用也更友好。</p><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 构建未来环境变量所在目录的路径</span></span><br><span class="line">future_env_dir <span class="operator">&lt;-</span> file.path<span class="punctuation">(</span>getwd<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">,</span> <span class="string">&quot;future_env&quot;</span><span class="punctuation">,</span> <span class="string">&quot;ssp126_2041-2060&quot;</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 检查目录是否存在</span></span><br><span class="line"><span class="keyword">if</span> <span class="punctuation">(</span><span class="operator">!</span>dir.exists<span class="punctuation">(</span>future_env_dir<span class="punctuation">)</span><span class="punctuation">)</span> <span class="punctuation">&#123;</span></span><br><span class="line">  stop<span class="punctuation">(</span>paste<span class="punctuation">(</span><span class="string">&quot;未来环境目录不存在:&quot;</span><span class="punctuation">,</span> future_env_dir<span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 列出目录中所有 .tif 栅格文件的完整路径</span></span><br><span class="line">future_files <span class="operator">&lt;-</span> list.files<span class="punctuation">(</span>future_env_dir<span class="punctuation">,</span> pattern <span class="operator">=</span> <span class="string">&quot;\\.tif$&quot;</span><span class="punctuation">,</span> full.names <span class="operator">=</span> <span class="literal">TRUE</span><span class="punctuation">)</span></span><br><span class="line"><span class="comment"># 检查是否找到了文件</span></span><br><span class="line"><span class="keyword">if</span> <span class="punctuation">(</span><span class="built_in">length</span><span class="punctuation">(</span>future_files<span class="punctuation">)</span> <span class="operator">==</span> <span class="number">0</span><span class="punctuation">)</span> <span class="punctuation">&#123;</span></span><br><span class="line">  stop<span class="punctuation">(</span><span class="string">&quot;未来环境目录中未找到 .tif 文件&quot;</span><span class="punctuation">)</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 用 terra::rast() 读取所有 .tif 文件成为栅格堆（不读入内存，提高效率）</span></span><br><span class="line">future_stack <span class="operator">&lt;-</span> terra<span class="operator">::</span>rast<span class="punctuation">(</span>future_files<span class="punctuation">)</span></span><br></pre></td></tr></table></figure></div><p>如果未来文件本身没有正确命名，可以再补一层处理：</p><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 从已训练模型中提取训练时使用的变量名称列表</span></span><br><span class="line">train_var_names <span class="operator">&lt;-</span> biomod_model_out<span class="operator">@</span>expl.var.names</span><br><span class="line"></span><br><span class="line"><span class="comment"># 检查未来栅格是否缺少名称，若缺少则从文件名提取</span></span><br><span class="line"><span class="keyword">if</span> <span class="punctuation">(</span><span class="built_in">is.null</span><span class="punctuation">(</span><span class="built_in">names</span><span class="punctuation">(</span>future_stack<span class="punctuation">)</span><span class="punctuation">)</span> <span class="operator">||</span> <span class="built_in">any</span><span class="punctuation">(</span><span class="built_in">names</span><span class="punctuation">(</span>future_stack<span class="punctuation">)</span> <span class="operator">==</span> <span class="string">&quot;&quot;</span><span class="punctuation">)</span><span class="punctuation">)</span> <span class="punctuation">&#123;</span></span><br><span class="line">  <span class="comment"># 从文件路径中提取文件名（不含扩展名），作为栅格层的名称</span></span><br><span class="line">  <span class="built_in">names</span><span class="punctuation">(</span>future_stack<span class="punctuation">)</span> <span class="operator">&lt;-</span> tools<span class="operator">::</span>file_path_sans_ext<span class="punctuation">(</span>basename<span class="punctuation">(</span>future_files<span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure></div><p>这一段看起来简单，但很关键。BIOMOD2 在投影时并不是只看“文件里有多少层”，而是看这些层是否能与训练时的变量一一对应。名称对不上，后面就会报错；顺序不对，结果也可能失真。</p><h2 id="五、检查变量一致性"><a href="#五、检查变量一致性" class="headerlink" title="五、检查变量一致性"></a>五、检查变量一致性</h2><p>投影前最好先做一次显式校验：</p><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 找出在训练变量中出现、但在未来栅格中缺少的变量</span></span><br><span class="line">missing_vars <span class="operator">&lt;-</span> setdiff<span class="punctuation">(</span>train_var_names<span class="punctuation">,</span> <span class="built_in">names</span><span class="punctuation">(</span>future_stack<span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line"><span class="comment"># 如果发现缺失的变量，立即停止并报错</span></span><br><span class="line"><span class="keyword">if</span> <span class="punctuation">(</span><span class="built_in">length</span><span class="punctuation">(</span>missing_vars<span class="punctuation">)</span> <span class="operator">&gt;</span> <span class="number">0</span><span class="punctuation">)</span> <span class="punctuation">&#123;</span></span><br><span class="line">  stop<span class="punctuation">(</span>paste<span class="punctuation">(</span><span class="string">&quot;未来环境缺少变量:&quot;</span><span class="punctuation">,</span> paste<span class="punctuation">(</span>missing_vars<span class="punctuation">,</span> collapse <span class="operator">=</span> <span class="string">&quot;, &quot;</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 按训练阶段的变量顺序重新排列未来栅格堆中的层</span></span><br><span class="line">future_stack <span class="operator">&lt;-</span> future_stack<span class="punctuation">[[</span>train_var_names<span class="punctuation">]</span><span class="punctuation">]</span></span><br></pre></td></tr></table></figure></div><p>这里的逻辑非常直接：</p><ul><li><code>setdiff()</code> 用来找出训练阶段有、未来数据里没有的变量；</li><li><code>future_stack[[train_var_names]]</code> 用来按训练时的变量顺序重新排列。</li></ul><p>只要这一步做对，后续投影就会稳很多。</p><h2 id="六、开展未来投影"><a href="#六、开展未来投影" class="headerlink" title="六、开展未来投影"></a>六、开展未来投影</h2><p>接下来就进入核心步骤：单模型投影和集成预测。</p><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 定义投影的名称（用于区分不同的气候情景和时间段）</span></span><br><span class="line">proj_name <span class="operator">&lt;-</span> <span class="string">&quot;future_SSP126_2041-2060&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 第一步：用所有单个模型进行未来环境投影</span></span><br><span class="line">biomod_proj_future <span class="operator">&lt;-</span> BIOMOD_Projection<span class="punctuation">(</span></span><br><span class="line">  bm.mod <span class="operator">=</span> biomod_model_out<span class="punctuation">,</span>      <span class="comment"># 已训练的单模型集合</span></span><br><span class="line">  new.env <span class="operator">=</span> future_stack<span class="punctuation">,</span>         <span class="comment"># 未来环境变量栅格堆</span></span><br><span class="line">  proj.name <span class="operator">=</span> proj_name<span class="punctuation">,</span>          <span class="comment"># 投影名称</span></span><br><span class="line">  models.chosen <span class="operator">=</span> <span class="string">&quot;all&quot;</span><span class="punctuation">,</span>          <span class="comment"># 使用所有模型</span></span><br><span class="line">  metric.binary <span class="operator">=</span> <span class="string">&quot;TSS&quot;</span><span class="punctuation">,</span>          <span class="comment"># 基于 TSS 指标的二元阈值</span></span><br><span class="line">  nb.cpu <span class="operator">=</span> <span class="number">1</span>                      <span class="comment"># 使用单个 CPU（根据需要可调整）</span></span><br><span class="line"><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 清理内存</span></span><br><span class="line">gc<span class="punctuation">(</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 第二步：基于集成模型进行集成投影预测</span></span><br><span class="line">biomod_em_proj_future <span class="operator">&lt;-</span> BIOMOD_EnsembleForecasting<span class="punctuation">(</span></span><br><span class="line">  bm.em <span class="operator">=</span> biomod_em<span class="punctuation">,</span>              <span class="comment"># 已训练的集成模型</span></span><br><span class="line">  bm.proj <span class="operator">=</span> biomod_proj_future<span class="punctuation">,</span>   <span class="comment"># 单模型投影结果</span></span><br><span class="line">  proj.name <span class="operator">=</span> proj_name<span class="punctuation">,</span>          <span class="comment"># 投影名称</span></span><br><span class="line">  models.chosen <span class="operator">=</span> <span class="string">&quot;all&quot;</span><span class="punctuation">,</span>          <span class="comment"># 使用所有集成方法</span></span><br><span class="line">  metric.binary <span class="operator">=</span> <span class="string">&quot;TSS&quot;</span><span class="punctuation">,</span>          <span class="comment"># 基于 TSS 的阈值</span></span><br><span class="line">  nb.cpu <span class="operator">=</span> <span class="number">1</span>                      <span class="comment"># 单 CPU 计算</span></span><br><span class="line"><span class="punctuation">)</span></span><br></pre></td></tr></table></figure></div><p>这一步的含义可以这样理解：</p><ul><li><code>BIOMOD_Projection()</code> 先把训练好的单个模型投到未来环境中；</li><li><code>BIOMOD_EnsembleForecasting()</code> 再基于集成模型生成最终的综合结果。</li></ul><p>如果你前面在集成建模阶段使用了 <code>EMmean</code>、<code>EMcv</code> 和 <code>EMwmean</code>，这里输出的也会是对应的一套集成投影结果。</p><div class="callout callout--simple danger mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2 items-center"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="callout__content markdown-body flex-1 min-w-0"><p>这一步对于计算资源的要求可能比较高，尤其是当未来环境变量较多、模型数量较多时。建议在服务器上运行，并且根据实际情况调整 <code>nb.cpu</code> 参数以加速计算。</p></div></div><h2 id="七、导出结果文件"><a href="#七、导出结果文件" class="headerlink" title="七、导出结果文件"></a>七、导出结果文件</h2><p>完成预测后，建议把结果统一写到单独的输出目录里，避免和当前气候结果混在一起：</p><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 生成输出目录路径（按投影名称组织）</span></span><br><span class="line">output_path <span class="operator">&lt;-</span> file.path<span class="punctuation">(</span>output_dir<span class="punctuation">,</span> paste0<span class="punctuation">(</span><span class="string">&quot;proj_&quot;</span><span class="punctuation">,</span> proj_name<span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line"><span class="comment"># 创建输出目录（若不存在）</span></span><br><span class="line">dir.create<span class="punctuation">(</span>output_path<span class="punctuation">,</span> recursive <span class="operator">=</span> <span class="literal">TRUE</span><span class="punctuation">,</span> showWarnings <span class="operator">=</span> <span class="literal">FALSE</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 将 terra 的 SpatRaster 对象解包成能直接写入栅格文件的格式</span></span><br><span class="line">unpacked_val <span class="operator">&lt;-</span> terra<span class="operator">::</span>unwrap<span class="punctuation">(</span>biomod_em_proj_future<span class="operator">@</span>proj.out<span class="operator">@</span>val<span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 导出完整的集成预测结果（包含所有层）</span></span><br><span class="line">writeRaster<span class="punctuation">(</span></span><br><span class="line">  unpacked_val<span class="punctuation">,</span></span><br><span class="line">  filename <span class="operator">=</span> file.path<span class="punctuation">(</span>output_path<span class="punctuation">,</span> <span class="string">&quot;Angelica_SSP126_2041-2060_ensemble.tif&quot;</span><span class="punctuation">)</span><span class="punctuation">,</span></span><br><span class="line">  overwrite <span class="operator">=</span> <span class="literal">TRUE</span></span><br><span class="line"><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 导出集成预测的第一层（通常是 EMmean，集成模型的平均值）</span></span><br><span class="line"><span class="keyword">if</span> <span class="punctuation">(</span>nlyr<span class="punctuation">(</span>unpacked_val<span class="punctuation">)</span> <span class="operator">&gt;=</span> <span class="number">1</span><span class="punctuation">)</span> <span class="punctuation">&#123;</span></span><br><span class="line">  writeRaster<span class="punctuation">(</span>unpacked_val<span class="punctuation">[[</span><span class="number">1</span><span class="punctuation">]</span><span class="punctuation">]</span><span class="punctuation">,</span> file.path<span class="punctuation">(</span>output_path<span class="punctuation">,</span> <span class="string">&quot;Angelica_SSP126_2041-2060_EMmean.tif&quot;</span><span class="punctuation">)</span><span class="punctuation">,</span> overwrite <span class="operator">=</span> <span class="literal">TRUE</span><span class="punctuation">)</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line"><span class="comment"># 导出第二层（通常是 EMcv，集成模型的变异系数，反映模型间的差异）</span></span><br><span class="line"><span class="keyword">if</span> <span class="punctuation">(</span>nlyr<span class="punctuation">(</span>unpacked_val<span class="punctuation">)</span> <span class="operator">&gt;=</span> <span class="number">2</span><span class="punctuation">)</span> <span class="punctuation">&#123;</span></span><br><span class="line">  writeRaster<span class="punctuation">(</span>unpacked_val<span class="punctuation">[[</span><span class="number">2</span><span class="punctuation">]</span><span class="punctuation">]</span><span class="punctuation">,</span> file.path<span class="punctuation">(</span>output_path<span class="punctuation">,</span> <span class="string">&quot;Angelica_SSP126_2041-2060_EMcv.tif&quot;</span><span class="punctuation">)</span><span class="punctuation">,</span> overwrite <span class="operator">=</span> <span class="literal">TRUE</span><span class="punctuation">)</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line"><span class="comment"># 导出第三层（通常是 EMwmean，集成模型的加权平均值）</span></span><br><span class="line"><span class="keyword">if</span> <span class="punctuation">(</span>nlyr<span class="punctuation">(</span>unpacked_val<span class="punctuation">)</span> <span class="operator">&gt;=</span> <span class="number">3</span><span class="punctuation">)</span> <span class="punctuation">&#123;</span></span><br><span class="line">  writeRaster<span class="punctuation">(</span>unpacked_val<span class="punctuation">[[</span><span class="number">3</span><span class="punctuation">]</span><span class="punctuation">]</span><span class="punctuation">,</span> file.path<span class="punctuation">(</span>output_path<span class="punctuation">,</span> <span class="string">&quot;Angelica_SSP126_2041-2060_EMwmean.tif&quot;</span><span class="punctuation">)</span><span class="punctuation">,</span> overwrite <span class="operator">=</span> <span class="literal">TRUE</span><span class="punctuation">)</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 打印完成提示信息</span></span><br><span class="line">message<span class="punctuation">(</span><span class="string">&quot;未来气候预测完成，结果已保存至: &quot;</span><span class="punctuation">,</span> output_path<span class="punctuation">)</span></span><br></pre></td></tr></table></figure></div><p>导出后，你会得到一个总的集成结果文件，以及若干拆分后的子结果。这样后续无论是做制图、阈值分类，还是和当前气候结果做差值分析，都会方便很多。</p><h2 id="八、可选的自动提醒"><a href="#八、可选的自动提醒" class="headerlink" title="八、可选的自动提醒"></a>八、可选的自动提醒</h2><p>如果你经常在本地或服务器上跑长时间任务，可以顺手加一个 Bark 推送，脚本跑完后直接收到通知：</p><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Bark 推送服务的基础 URL（需替换为自己设备的 Key）</span></span><br><span class="line">bark_base_url <span class="operator">&lt;-</span> <span class="string">&quot;https://api.day.app/你自己设备的BarkKey/&quot;</span></span><br><span class="line"><span class="comment"># 推送消息的标题</span></span><br><span class="line">bark_title <span class="operator">&lt;-</span> <span class="string">&quot;BIOMOD2&quot;</span></span><br><span class="line"><span class="comment"># 推送消息的内容体</span></span><br><span class="line">bark_body <span class="operator">&lt;-</span> paste0<span class="punctuation">(</span><span class="string">&quot;未来气候预测完成，结果已保存至: &quot;</span><span class="punctuation">,</span> output_path<span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 组合完整的推送 URL（将标题和内容进行 URL 编码）</span></span><br><span class="line">bark_url <span class="operator">&lt;-</span> paste0<span class="punctuation">(</span></span><br><span class="line">  bark_base_url<span class="punctuation">,</span></span><br><span class="line">  utils<span class="operator">::</span>URLencode<span class="punctuation">(</span>bark_title<span class="punctuation">,</span> reserved <span class="operator">=</span> <span class="literal">TRUE</span><span class="punctuation">)</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;/&quot;</span><span class="punctuation">,</span></span><br><span class="line">  utils<span class="operator">::</span>URLencode<span class="punctuation">(</span>bark_body<span class="punctuation">,</span> reserved <span class="operator">=</span> <span class="literal">TRUE</span><span class="punctuation">)</span></span><br><span class="line"><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用 curl 命令发送 HTTP 请求到 Bark 服务（不显示输出）</span></span><br><span class="line">try<span class="punctuation">(</span><span class="punctuation">&#123;</span></span><br><span class="line">  system<span class="punctuation">(</span>paste<span class="punctuation">(</span><span class="string">&quot;curl -fsS&quot;</span><span class="punctuation">,</span> shQuote<span class="punctuation">(</span>bark_url<span class="punctuation">)</span><span class="punctuation">)</span><span class="punctuation">,</span> ignore.stdout <span class="operator">=</span> <span class="literal">TRUE</span><span class="punctuation">,</span> ignore.stderr <span class="operator">=</span> <span class="literal">TRUE</span><span class="punctuation">)</span></span><br><span class="line"><span class="punctuation">&#125;</span><span class="punctuation">,</span> silent <span class="operator">=</span> <span class="literal">TRUE</span><span class="punctuation">)</span>  <span class="comment"># 若发送失败也不中断脚本</span></span><br></pre></td></tr></table></figure></div><p>这部分不是必须，但对于长时间批量投影很实用。</p><h2 id="九、后续可以怎么扩展"><a href="#九、后续可以怎么扩展" class="headerlink" title="九、后续可以怎么扩展"></a>九、后续可以怎么扩展</h2><p>如果你想把这套流程继续做得更完整，下一步通常有三种扩展方向：</p><ol><li>批量跑多个 SSP 情景，比如 SSP126、SSP245、SSP585；</li><li>比较不同时间段的变化，比如 2031-2050、2041-2060、2061-2080；</li><li>把未来结果和当前结果做差值分析，输出适宜区扩张、收缩和迁移方向。</li></ol><p>其中第三步往往最有论文价值，因为它不仅能告诉你“未来哪里适合”，还可以进一步解释“适宜区是增加了还是减少了”。</p><h2 id="十、总结"><a href="#十、总结" class="headerlink" title="十、总结"></a>十、总结</h2><p>白芷的未来适宜性预测，本质上是把前文训练好的 BIOMOD2 模型，迁移到气候变化情景下重新评估其空间适宜度。只要确保模型对象已保存、未来环境变量与训练变量完全一致，再用 <code>BIOMOD_Projection()</code> 和 <code>BIOMOD_EnsembleForecasting()</code> 依次完成单模型和集成投影，就能得到相对可靠的未来分布结果。</p><div class="callout callout--titled warning mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-solid leading-none text-(--callout-primary-color) text-sm shrink-0"></i> AIGC声明</div><div class="callout__content markdown-body flex-1 min-w-0"><p>本文内容使用AI根据源代码生成，可能存在不准确或不完整的地方，请读者自行核实相关信息。</p></div></div></div>]]></content>
    
    
    <summary type="html">这篇文章承接前文的当前气候建模结果，进一步介绍如何利用已保存的 BIOMOD2 模型对象，在未来气候情景下完成白芷适宜性投影、集成预测与结果导出，并给出可直接复用的脚本框架。</summary>
    
    
    
    <category term="研究生生活" scheme="https://gankun.cn.lu/categories/%E7%A0%94%E7%A9%B6%E7%94%9F%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="R" scheme="https://gankun.cn.lu/tags/R/"/>
    
    <category term="biomod2" scheme="https://gankun.cn.lu/tags/biomod2/"/>
    
    <category term="物种分布模型" scheme="https://gankun.cn.lu/tags/%E7%89%A9%E7%A7%8D%E5%88%86%E5%B8%83%E6%A8%A1%E5%9E%8B/"/>
    
    <category term="气候变化" scheme="https://gankun.cn.lu/tags/%E6%B0%94%E5%80%99%E5%8F%98%E5%8C%96/"/>
    
    <category term="情景预测" scheme="https://gankun.cn.lu/tags/%E6%83%85%E6%99%AF%E9%A2%84%E6%B5%8B/"/>
    
    <category term="生态位模型" scheme="https://gankun.cn.lu/tags/%E7%94%9F%E6%80%81%E4%BD%8D%E6%A8%A1%E5%9E%8B/"/>
    
  </entry>
  
  <entry>
    <title>通过biomod2整合多个模型对物种进行预测——白芷为例</title>
    <link href="https://gankun.cn.lu/posts/2025-10-30/"/>
    <id>https://gankun.cn.lu/posts/2025-10-30/</id>
    <published>2025-10-30T09:54:35.000Z</published>
    <updated>2026-04-02T11:31:19.018Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前准备"><a href="#前准备" class="headerlink" title="前准备"></a>前准备</h2><blockquote><p>项目文件结构</p></blockquote><div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">Angelica_BIOMOD2/</span><br><span class="line">├── data/</span><br><span class="line">│   └── Angelica_points.csv</span><br><span class="line">├── <span class="built_in">env</span>/                    <span class="comment"># 环境bio文件</span></span><br><span class="line">│   ├── bio1.tif</span><br><span class="line">│   ├── bio2.tif</span><br><span class="line">│   ├── soil_ph.tif</span><br><span class="line">│   ├── soil_organic.tif</span><br><span class="line">│   └── ...</span><br><span class="line">├── maxent.jar</span><br><span class="line">├── outputs/</span><br><span class="line">│   └── Angelica_dahurica/</span><br><span class="line">└── BIOMOD2_angelica.R</span><br></pre></td></tr></table></figure></div><ul><li><code>renv</code>是 R 的项目环境管理工具，用于固定项目依赖包的版本，确保代码可复现。</li><li><code>renv::init()</code>用于初始化项目环境</li></ul><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">install.packages<span class="punctuation">(</span><span class="string">&quot;renv&quot;</span><span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>renv<span class="punctuation">)</span></span><br><span class="line">renv<span class="operator">::</span>init<span class="punctuation">(</span><span class="punctuation">)</span></span><br></pre></td></tr></table></figure></div><h3 id="1-环境准备"><a href="#1-环境准备" class="headerlink" title="1. 环境准备"></a>1. 环境准备</h3><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">renv<span class="operator">::</span>install<span class="punctuation">(</span><span class="built_in">c</span><span class="punctuation">(</span><span class="string">&quot;biomod2&quot;</span><span class="punctuation">,</span> <span class="string">&quot;terra&quot;</span><span class="punctuation">,</span> <span class="string">&quot;sp&quot;</span><span class="punctuation">,</span> <span class="string">&quot;dismo&quot;</span><span class="punctuation">,</span> <span class="string">&quot;ggplot2&quot;</span><span class="punctuation">,</span> <span class="string">&quot;viridis&quot;</span><span class="punctuation">,</span><span class="string">&#x27;tidyterra&#x27;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">library<span class="punctuation">(</span>terra<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>sp<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>dismo<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>ggplot2<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>viridis<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>biomod2<span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">setwd<span class="punctuation">(</span><span class="string">&quot;E:\\甘政坤\\Angelica_BIOMOD2&quot;</span><span class="punctuation">)</span>  <span class="comment"># ← 改成你的项目路径</span></span><br></pre></td></tr></table></figure></div><h3 id="2-数据导入"><a href="#2-数据导入" class="headerlink" title="2. 数据导入"></a>2. 数据导入</h3><p>白芷分布点数据（presence only） CSV格式示例：</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">species,lon,lat</span><br><span class="line">Angelica_dahurica,104.08,30.67</span><br><span class="line">Angelica_dahurica,105.24,31.48</span><br></pre></td></tr></table></figure></div><ul><li>读取 CSV 格式的分布点数据</li><li>将数据转换为空间点对象（sp包格式），指定经度和纬度为坐标</li><li>设置坐标参考系（CRS）为 WGS84（经纬度坐标系，全球通用）</li></ul><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">occ <span class="operator">&lt;-</span> read.csv<span class="punctuation">(</span><span class="string">&quot;data/Angelica_points.csv&quot;</span><span class="punctuation">)</span></span><br><span class="line">coordinates<span class="punctuation">(</span>occ<span class="punctuation">)</span> <span class="operator">&lt;-</span> <span class="operator">~</span>lon <span class="operator">+</span> lat</span><br><span class="line">proj4string<span class="punctuation">(</span>occ<span class="punctuation">)</span> <span class="operator">&lt;-</span> CRS<span class="punctuation">(</span><span class="string">&quot;+proj=longlat +datum=WGS84&quot;</span><span class="punctuation">)</span></span><br></pre></td></tr></table></figure></div><ul><li>读取<code>env</code>文件夹下所有<code>.tif</code>格式的环境变量文件（如 WorldClim 的 19 个生物气候变量、HWSD2 土壤变量等）</li><li>将多个环境变量合并为一个raster栈（<code>env_stack</code>），方便后续统一处理</li><li>打印环境变量名称，确认数据正确导入</li><li>绘制第一个环境变量（如 <code>Bio1</code>，年平均温度）的空间分布，并叠加白芷分布点（红色小点），直观展示分布点与环境的关系</li></ul><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">env_files <span class="operator">&lt;-</span> list.files<span class="punctuation">(</span><span class="string">&quot;env/&quot;</span><span class="punctuation">,</span> pattern <span class="operator">=</span> <span class="string">&quot;.tif$&quot;</span><span class="punctuation">,</span> full.names <span class="operator">=</span> <span class="literal">TRUE</span><span class="punctuation">)</span></span><br><span class="line">env_stack <span class="operator">&lt;-</span> stack<span class="punctuation">(</span>env_files<span class="punctuation">)</span></span><br><span class="line">print<span class="punctuation">(</span><span class="built_in">names</span><span class="punctuation">(</span>env_stack<span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">plot<span class="punctuation">(</span>env_stack<span class="punctuation">[[</span><span class="number">1</span><span class="punctuation">]</span><span class="punctuation">]</span><span class="punctuation">,</span> main<span class="operator">=</span><span class="string">&quot;示例环境变量（Bio1）&quot;</span><span class="punctuation">)</span></span><br><span class="line">points<span class="punctuation">(</span>occ<span class="punctuation">,</span> col<span class="operator">=</span><span class="string">&quot;red&quot;</span><span class="punctuation">,</span> pch<span class="operator">=</span><span class="number">20</span><span class="punctuation">)</span></span><br></pre></td></tr></table></figure></div><h3 id="3-格式化输入数据"><a href="#3-格式化输入数据" class="headerlink" title="3. 格式化输入数据"></a>3. 格式化输入数据</h3><ul><li><code>BIOMOD_FormatingData</code>是 <code>BIOMOD2</code> 的核心函数，用于将分布数据和环境数据格式化为模型输入格式</li><li>因原始数据只有存在点（presence-only），需生成伪缺失点（Pseudo-Absences, PA）作为模型的 “缺失” 样本（模型训练需要存在 &#x2F; 缺失对比）</li><li>这里设置生成 <code>3</code> 组伪缺失点，每组 <code>10000</code> 个，随机分布在研究区域</li></ul><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">biomod_data <span class="operator">&lt;-</span> BIOMOD_FormatingData<span class="punctuation">(</span></span><br><span class="line">  resp.var <span class="operator">=</span> <span class="built_in">rep</span><span class="punctuation">(</span><span class="number">1</span><span class="punctuation">,</span> nrow<span class="punctuation">(</span>occ<span class="punctuation">)</span><span class="punctuation">)</span><span class="punctuation">,</span></span><br><span class="line">  resp.xy <span class="operator">=</span> occ<span class="operator">@</span>coords<span class="punctuation">,</span></span><br><span class="line">  resp.name <span class="operator">=</span> <span class="string">&quot;Angelica.dahurica&quot;</span><span class="punctuation">,</span></span><br><span class="line">  expl.var <span class="operator">=</span> env_stack<span class="punctuation">,</span></span><br><span class="line">  PA.nb.rep <span class="operator">=</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line">  PA.nb.absences <span class="operator">=</span> <span class="number">10000</span><span class="punctuation">,</span></span><br><span class="line">  PA.strategy <span class="operator">=</span> <span class="string">&quot;random&quot;</span></span><br><span class="line"><span class="punctuation">)</span></span><br></pre></td></tr></table></figure></div><h3 id="4-模型配置"><a href="#4-模型配置" class="headerlink" title="4. 模型配置"></a>4. 模型配置</h3><ul><li>定义 5 种常用物种分布模型的参数：<ul><li><code>GLM</code>（广义线性模型）：使用二次项，无交互项，以 <code>AIC</code> 准则选择变量</li><li><code>GAM</code>（广义可加模型）：平滑参数 <code>k=4</code>，二项分布链接函数</li><li><code>RF</code>（随机森林）：<code>500</code> 棵决策树</li><li><code>GBM</code>（梯度提升机）：<code>3000</code> 棵树，学习率 <code>0.005</code>，控制过拟合</li><li><code>MAXENT</code>（最大熵模型）：包含线性项、二次项、 <code>hinge</code> 项等特征</li></ul></li><li><code>user.val</code>整合所有模型的参数，<code>allModels</code>指定最终运行的模型列表</li></ul><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 定义模型参数</span></span><br><span class="line">user.GLM <span class="operator">&lt;-</span> <span class="built_in">list</span><span class="punctuation">(</span><span class="string">&#x27;_allData_allRun&#x27;</span> <span class="operator">=</span> <span class="built_in">list</span><span class="punctuation">(</span>type <span class="operator">=</span> <span class="string">&#x27;quadratic&#x27;</span><span class="punctuation">,</span></span><br><span class="line">                                          interaction.level <span class="operator">=</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">                                          test <span class="operator">=</span> <span class="string">&#x27;AIC&#x27;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">user.GAM <span class="operator">&lt;-</span> <span class="built_in">list</span><span class="punctuation">(</span><span class="string">&#x27;_allData_allRun&#x27;</span> <span class="operator">=</span> <span class="built_in">list</span><span class="punctuation">(</span>k <span class="operator">=</span> <span class="number">4</span><span class="punctuation">,</span></span><br><span class="line">                                          family <span class="operator">=</span> binomial<span class="punctuation">(</span>link <span class="operator">=</span> <span class="string">&#x27;logit&#x27;</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">user.RF <span class="operator">&lt;-</span> <span class="built_in">list</span><span class="punctuation">(</span><span class="string">&#x27;_allData_allRun&#x27;</span> <span class="operator">=</span> <span class="built_in">list</span><span class="punctuation">(</span>ntree <span class="operator">=</span> <span class="number">500</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">user.GBM <span class="operator">&lt;-</span> <span class="built_in">list</span><span class="punctuation">(</span><span class="string">&#x27;_allData_allRun&#x27;</span> <span class="operator">=</span> <span class="built_in">list</span><span class="punctuation">(</span>n.trees <span class="operator">=</span> <span class="number">3000</span><span class="punctuation">,</span>        <span class="comment"># Increase trees</span></span><br><span class="line">                                          interaction.depth <span class="operator">=</span> <span class="number">3</span><span class="punctuation">,</span> <span class="comment"># Keep this</span></span><br><span class="line">                                          shrinkage <span class="operator">=</span> <span class="number">0.005</span><span class="punctuation">,</span>     <span class="comment"># Decrease learning rate</span></span><br><span class="line">                                          n.minobsinnode <span class="operator">=</span> <span class="number">10</span><span class="punctuation">,</span>     <span class="comment"># Increase this slightly</span></span><br><span class="line">                                          distribution <span class="operator">=</span> <span class="string">&#x27;bernoulli&#x27;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">user.MAXENT <span class="operator">&lt;-</span> <span class="built_in">list</span><span class="punctuation">(</span><span class="string">&#x27;_allData_allRun&#x27;</span> <span class="operator">=</span> <span class="built_in">list</span><span class="punctuation">(</span></span><br><span class="line">  memory_allocated <span class="operator">=</span> <span class="literal">NULL</span><span class="punctuation">,</span></span><br><span class="line">  initial_heap_size <span class="operator">=</span> <span class="literal">NULL</span><span class="punctuation">,</span></span><br><span class="line">  max_heap_size <span class="operator">=</span> <span class="literal">NULL</span><span class="punctuation">,</span></span><br><span class="line">  background_data_dir <span class="operator">=</span> <span class="literal">NULL</span><span class="punctuation">,</span></span><br><span class="line">  visible <span class="operator">=</span> <span class="literal">FALSE</span><span class="punctuation">,</span></span><br><span class="line">  linear <span class="operator">=</span> <span class="literal">TRUE</span><span class="punctuation">,</span></span><br><span class="line">  quadratic <span class="operator">=</span> <span class="literal">TRUE</span><span class="punctuation">,</span></span><br><span class="line">  product <span class="operator">=</span> <span class="literal">FALSE</span><span class="punctuation">,</span></span><br><span class="line">  threshold <span class="operator">=</span> <span class="literal">FALSE</span><span class="punctuation">,</span></span><br><span class="line">  hinge <span class="operator">=</span> <span class="literal">TRUE</span><span class="punctuation">,</span></span><br><span class="line">  lq2lqptthreshold <span class="operator">=</span> <span class="number">80</span><span class="punctuation">,</span></span><br><span class="line">  l2lqthreshold <span class="operator">=</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">  hingethreshold <span class="operator">=</span> <span class="number">15</span><span class="punctuation">,</span></span><br><span class="line">  beta_threshold <span class="operator">=</span> <span class="operator">-</span><span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">  beta_categorical <span class="operator">=</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">  beta_lqp <span class="operator">=</span> <span class="operator">-</span><span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">  beta_hinge <span class="operator">=</span> <span class="operator">-</span><span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">  betamultiplier <span class="operator">=</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">  defaultprevalence <span class="operator">=</span> <span class="number">0.5</span></span><br><span class="line"><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">user.val <span class="operator">&lt;-</span> <span class="built_in">list</span><span class="punctuation">(</span></span><br><span class="line">  MAXENT.binary.MAXENT.MAXENT <span class="operator">=</span> user.MAXENT<span class="punctuation">,</span></span><br><span class="line">  GLM.binary.stats.glm <span class="operator">=</span> user.GLM<span class="punctuation">,</span></span><br><span class="line">  GAM.binary.mgcv.gam <span class="operator">=</span> user.GAM<span class="punctuation">,</span></span><br><span class="line">  RF.binary.randomForest.randomForest <span class="operator">=</span> user.RF<span class="punctuation">,</span></span><br><span class="line">  GBM.binary.gbm.gbm <span class="operator">=</span> user.GBM</span><br><span class="line"><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">allModels <span class="operator">&lt;-</span> <span class="built_in">c</span><span class="punctuation">(</span> <span class="string">&#x27;MAXENT&#x27;</span><span class="punctuation">,</span><span class="string">&#x27;GLM&#x27;</span><span class="punctuation">,</span> <span class="string">&#x27;GAM&#x27;</span><span class="punctuation">,</span> <span class="string">&#x27;RF&#x27;</span><span class="punctuation">,</span> <span class="string">&#x27;GBM&#x27;</span><span class="punctuation">)</span></span><br><span class="line"></span><br></pre></td></tr></table></figure></div><ul><li>用<code>bm_ModelingOptions</code>统一配置建模参数，指定数据类型、模型列表、参数来源等，为后续建模做准备。</li></ul><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">myOptions <span class="operator">&lt;-</span> bm_ModelingOptions<span class="punctuation">(</span></span><br><span class="line">  data.type <span class="operator">=</span> <span class="string">&#x27;binary&#x27;</span><span class="punctuation">,</span></span><br><span class="line">  models <span class="operator">=</span> allModels<span class="punctuation">,</span></span><br><span class="line">  strategy <span class="operator">=</span> <span class="string">&#x27;user.defined&#x27;</span><span class="punctuation">,</span></span><br><span class="line">  user.val <span class="operator">=</span> user.val<span class="punctuation">,</span></span><br><span class="line">  bm.format <span class="operator">=</span> biomod_data<span class="punctuation">,</span> </span><br><span class="line">  user.base <span class="operator">=</span> <span class="string">&quot;bigboss&quot;</span></span><br><span class="line"><span class="punctuation">)</span></span><br></pre></td></tr></table></figure></div><h3 id="5-运行建模"><a href="#5-运行建模" class="headerlink" title="5. 运行建模"></a>5. 运行建模</h3><ul><li><code>BIOMOD_Modeling</code>是模型训练的核心函数，基于输入数据和配置运行所有模型</li><li>交叉验证（<code>10</code> 次重复，<code>75%</code> 训练 &#x2F; <code>25%</code> 验证）用于评估模型稳定性</li><li>记录 <code>TSS</code> 和 <code>ROC</code> 作为模型性能指标，并计算变量重要性（评估环境变量对分布的影响程度）</li></ul><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">biomod_model_out <span class="operator">&lt;-</span> BIOMOD_Modeling<span class="punctuation">(</span></span><br><span class="line">  bm.format <span class="operator">=</span> biomod_data<span class="punctuation">,</span></span><br><span class="line">  modeling.id <span class="operator">=</span> <span class="string">&#x27;Angelica.dahurica&#x27;</span><span class="punctuation">,</span></span><br><span class="line">  models <span class="operator">=</span> allModels<span class="punctuation">,</span></span><br><span class="line">  OPT.user <span class="operator">=</span> myOptions<span class="punctuation">,</span></span><br><span class="line">  CV.strategy <span class="operator">=</span> <span class="string">&#x27;random&#x27;</span><span class="punctuation">,</span></span><br><span class="line">  CV.nb.rep <span class="operator">=</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line">  CV.perc <span class="operator">=</span> <span class="number">0.75</span><span class="punctuation">,</span></span><br><span class="line">  metric.eval <span class="operator">=</span> <span class="built_in">c</span><span class="punctuation">(</span><span class="string">&#x27;TSS&#x27;</span><span class="punctuation">,</span> <span class="string">&#x27;ROC&#x27;</span><span class="punctuation">)</span><span class="punctuation">,</span></span><br><span class="line">  var.import <span class="operator">=</span> <span class="number">3</span></span><br><span class="line"><span class="punctuation">)</span></span><br></pre></td></tr></table></figure></div><h3 id="6-模型评估"><a href="#6-模型评估" class="headerlink" title="6. 模型评估"></a>6. 模型评估</h3><ul><li>提取模型评估结果（如各模型在训练集和验证集上的 <code>TSS</code>、<code>ROC</code> 值），用于判断模型表现（<code>TSS&gt;0.7</code>、<code>ROC&gt;0.8</code> 通常认为模型较好）</li></ul><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">evals <span class="operator">&lt;-</span> get_evaluations<span class="punctuation">(</span>biomod_model_out<span class="punctuation">)</span></span><br><span class="line">evals_summary <span class="operator">&lt;-</span> BIOMOD_LoadModels<span class="punctuation">(</span>biomod_model_out<span class="punctuation">)</span></span><br><span class="line">print<span class="punctuation">(</span>evals<span class="punctuation">)</span></span><br></pre></td></tr></table></figure></div><ul><li>可视化模型评估结果：<ul><li>平均评估图：展示各模型在训练 &#x2F; 验证集上的平均性能；</li><li>箱线图：展示不同模型在多次重复中的性能分布，反映稳定性。</li></ul></li></ul><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">bm_PlotEvalMean<span class="punctuation">(</span>bm.out <span class="operator">=</span> biomod_model_out<span class="punctuation">,</span> dataset <span class="operator">=</span> <span class="string">&#x27;calibration&#x27;</span><span class="punctuation">)</span></span><br><span class="line">bm_PlotEvalMean<span class="punctuation">(</span>bm.out <span class="operator">=</span> biomod_model_out<span class="punctuation">,</span> dataset <span class="operator">=</span> <span class="string">&#x27;validation&#x27;</span><span class="punctuation">)</span></span><br><span class="line">bm_PlotEvalBoxplot<span class="punctuation">(</span>bm.out <span class="operator">=</span> biomod_model_out<span class="punctuation">,</span> group.by <span class="operator">=</span> <span class="built_in">c</span><span class="punctuation">(</span><span class="string">&#x27;algo&#x27;</span><span class="punctuation">,</span> <span class="string">&#x27;run&#x27;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br></pre></td></tr></table></figure></div><h3 id="7-变量重要性"><a href="#7-变量重要性" class="headerlink" title="7. 变量重要性"></a>7. 变量重要性</h3><ul><li>绘制变量重要性箱线图，展示不同环境变量在各模型（<code>algo</code>）和多次重复（<code>run</code>）中的重要性分布</li><li>帮助识别对白芷分布影响最大的环境变量（如某个气候因子或土壤因子）</li></ul><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">bm_PlotVarImpBoxplot<span class="punctuation">(</span>bm.out <span class="operator">=</span> biomod_model_out<span class="punctuation">,</span> group.by <span class="operator">=</span> <span class="built_in">c</span><span class="punctuation">(</span><span class="string">&#x27;expl.var&#x27;</span><span class="punctuation">,</span> <span class="string">&#x27;algo&#x27;</span><span class="punctuation">,</span> <span class="string">&#x27;algo&#x27;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">bm_PlotVarImpBoxplot<span class="punctuation">(</span>bm.out <span class="operator">=</span> biomod_model_out<span class="punctuation">,</span> group.by <span class="operator">=</span> <span class="built_in">c</span><span class="punctuation">(</span><span class="string">&#x27;expl.var&#x27;</span><span class="punctuation">,</span> <span class="string">&#x27;algo&#x27;</span><span class="punctuation">,</span> <span class="string">&#x27;run&#x27;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">bm_PlotVarImpBoxplot<span class="punctuation">(</span>bm.out <span class="operator">=</span> biomod_model_out<span class="punctuation">,</span> group.by <span class="operator">=</span> <span class="built_in">c</span><span class="punctuation">(</span><span class="string">&#x27;algo&#x27;</span><span class="punctuation">,</span> <span class="string">&#x27;expl.var&#x27;</span><span class="punctuation">,</span> <span class="string">&#x27;run&#x27;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br></pre></td></tr></table></figure></div><h3 id="8-集成建模"><a href="#8-集成建模" class="headerlink" title="8. 集成建模"></a>8. 集成建模</h3><ul><li>集成多个单个模型的结果，减少单一模型的不确定性，提高预测可靠性</li><li>先筛选出性能较好的模型（<code>TSS≥0.7</code>），再通过 3 种算法（平均、交叉验证平均、加权平均）生成集成模型</li></ul><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">biomod_em <span class="operator">&lt;-</span> BIOMOD_EnsembleModeling<span class="punctuation">(</span></span><br><span class="line">  bm.mod <span class="operator">=</span> biomod_model_out<span class="punctuation">,</span></span><br><span class="line">  models.chosen <span class="operator">=</span> <span class="string">&#x27;all&#x27;</span><span class="punctuation">,</span></span><br><span class="line">  em.by <span class="operator">=</span> <span class="string">&#x27;all&#x27;</span><span class="punctuation">,</span></span><br><span class="line">  metric.select <span class="operator">=</span> <span class="built_in">c</span><span class="punctuation">(</span><span class="string">&#x27;TSS&#x27;</span><span class="punctuation">)</span><span class="punctuation">,</span></span><br><span class="line">  metric.select.thresh <span class="operator">=</span> <span class="built_in">c</span><span class="punctuation">(</span><span class="number">0.7</span><span class="punctuation">)</span><span class="punctuation">,</span></span><br><span class="line">  metric.eval <span class="operator">=</span> <span class="built_in">c</span><span class="punctuation">(</span><span class="string">&#x27;TSS&#x27;</span><span class="punctuation">,</span> <span class="string">&#x27;ROC&#x27;</span><span class="punctuation">)</span><span class="punctuation">,</span></span><br><span class="line">  var.import <span class="operator">=</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line">  em.algo <span class="operator">=</span> <span class="built_in">c</span><span class="punctuation">(</span><span class="string">&#x27;EMmean&#x27;</span><span class="punctuation">,</span> <span class="string">&#x27;EMcv&#x27;</span><span class="punctuation">,</span> <span class="string">&#x27;EMwmean&#x27;</span><span class="punctuation">)</span></span><br><span class="line"><span class="punctuation">)</span></span><br></pre></td></tr></table></figure></div><h3 id="9-集成预测"><a href="#9-集成预测" class="headerlink" title="9. 集成预测"></a>9. 集成预测</h3><ul><li><code>BIOMOD_Projection</code>：用单个模型基于当前环境变量（<code>env_stack</code>）预测白芷的适宜性分布；</li><li><code>BIOMOD_EnsembleForecasting</code>：基于集成模型生成最终的适宜性预测结果（综合多个模型的优势）。</li></ul><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">biomod_proj &lt;- BIOMOD_Projection(</span><br><span class="line">  bm.mod = biomod_model_out,</span><br><span class="line">  new.env = env_stack,</span><br><span class="line">  proj.name = &quot;current&quot;,</span><br><span class="line">  models.chosen = &#x27;all&#x27;,</span><br><span class="line">  metric.binary = &#x27;TSS&#x27;</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line">biomod_em_proj &lt;- BIOMOD_EnsembleForecasting(</span><br><span class="line">  bm.em = biomod_em,</span><br><span class="line">  bm.proj = biomod_proj,</span><br><span class="line">  proj.name = &quot;currentEM&quot;,</span><br><span class="line">  models.chosen = &#x27;all&#x27;,</span><br><span class="line">  metric.binary = &#x27;TSS&#x27;</span><br><span class="line">)</span><br></pre></td></tr></table></figure></div><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">plot<span class="punctuation">(</span>biomod_em_proj<span class="punctuation">)</span> <span class="comment"># 快速可视化集成预测结果</span></span><br></pre></td></tr></table></figure></div><h3 id="10-结果导出"><a href="#10-结果导出" class="headerlink" title="10. 结果导出"></a>10. 结果导出</h3><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">output_path <span class="operator">&lt;-</span> paste0<span class="punctuation">(</span>getwd<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">,</span> <span class="string">&quot;/outputs/Angelica_dahurica/proj_current/&quot;</span><span class="punctuation">)</span></span><br><span class="line">dir.create<span class="punctuation">(</span>output_path<span class="punctuation">,</span> recursive <span class="operator">=</span> <span class="literal">TRUE</span><span class="punctuation">,</span> showWarnings <span class="operator">=</span> <span class="literal">FALSE</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">unpacked_val <span class="operator">&lt;-</span> terra<span class="operator">::</span>unwrap<span class="punctuation">(</span>biomod_em_proj<span class="operator">@</span>proj.out<span class="operator">@</span>val<span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 保存结果</span></span><br><span class="line">writeRaster<span class="punctuation">(</span></span><br><span class="line">  unpacked_val<span class="punctuation">,</span></span><br><span class="line">  filename <span class="operator">=</span> paste0<span class="punctuation">(</span>output_path<span class="punctuation">,</span> <span class="string">&quot;Angelica_EMmeanByTSS.tif&quot;</span><span class="punctuation">)</span><span class="punctuation">,</span></span><br><span class="line">  overwrite <span class="operator">=</span> <span class="literal">TRUE</span></span><br><span class="line"><span class="punctuation">)</span></span><br><span class="line">writeRaster<span class="punctuation">(</span></span><br><span class="line">  unpacked_val<span class="punctuation">[[</span><span class="number">1</span><span class="punctuation">]</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  filename <span class="operator">=</span> paste0<span class="punctuation">(</span>output_path<span class="punctuation">,</span> <span class="string">&quot;Angelica_EMmeanByTSS_mean.tif&quot;</span><span class="punctuation">)</span><span class="punctuation">,</span></span><br><span class="line">  overwrite <span class="operator">=</span> <span class="literal">TRUE</span></span><br><span class="line"><span class="punctuation">)</span></span><br><span class="line">writeRaster<span class="punctuation">(</span></span><br><span class="line">  unpacked_val<span class="punctuation">[[</span><span class="number">2</span><span class="punctuation">]</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  filename <span class="operator">=</span> paste0<span class="punctuation">(</span>output_path<span class="punctuation">,</span> <span class="string">&quot;Angelica_EMmeanByTSS_cv.tif&quot;</span><span class="punctuation">)</span><span class="punctuation">,</span></span><br><span class="line">  overwrite <span class="operator">=</span> <span class="literal">TRUE</span></span><br><span class="line"><span class="punctuation">)</span></span><br><span class="line">writeRaster<span class="punctuation">(</span></span><br><span class="line">  unpacked_val<span class="punctuation">[[</span><span class="number">3</span><span class="punctuation">]</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  filename <span class="operator">=</span> paste0<span class="punctuation">(</span>output_path<span class="punctuation">,</span> <span class="string">&quot;Angelica_EMmeanByTSS_wmean.tif&quot;</span><span class="punctuation">)</span><span class="punctuation">,</span></span><br><span class="line">  overwrite <span class="operator">=</span> <span class="literal">TRUE</span></span><br><span class="line"><span class="punctuation">)</span></span><br></pre></td></tr></table></figure></div><h3 id="11-可视化预测图"><a href="#11-可视化预测图" class="headerlink" title="11. 可视化预测图"></a>11. 可视化预测图</h3><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">pred_raster <span class="operator">&lt;-</span> raster<span class="punctuation">(</span>paste0<span class="punctuation">(</span>output_path<span class="punctuation">,</span> <span class="string">&quot;Angelica_EMmeanByTSS.tif&quot;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">pred_df <span class="operator">&lt;-</span> as.data.frame<span class="punctuation">(</span>rasterToPoints<span class="punctuation">(</span>pred_raster<span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line"><span class="built_in">names</span><span class="punctuation">(</span>pred_df<span class="punctuation">)</span> <span class="operator">&lt;-</span> <span class="built_in">c</span><span class="punctuation">(</span><span class="string">&quot;x&quot;</span><span class="punctuation">,</span> <span class="string">&quot;y&quot;</span><span class="punctuation">,</span> <span class="string">&quot;suitability&quot;</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">ggplot<span class="punctuation">(</span>pred_df<span class="punctuation">,</span> aes<span class="punctuation">(</span>x <span class="operator">=</span> x<span class="punctuation">,</span> y <span class="operator">=</span> y<span class="punctuation">,</span> fill <span class="operator">=</span> suitability<span class="punctuation">)</span><span class="punctuation">)</span> <span class="operator">+</span></span><br><span class="line">  geom_raster<span class="punctuation">(</span><span class="punctuation">)</span> <span class="operator">+</span></span><br><span class="line">  scale_fill_viridis<span class="punctuation">(</span>name <span class="operator">=</span> <span class="string">&quot;Habitat suitability&quot;</span><span class="punctuation">,</span> option <span class="operator">=</span> <span class="string">&quot;C&quot;</span><span class="punctuation">)</span> <span class="operator">+</span></span><br><span class="line">  coord_equal<span class="punctuation">(</span><span class="punctuation">)</span> <span class="operator">+</span></span><br><span class="line">  theme_minimal<span class="punctuation">(</span><span class="punctuation">)</span> <span class="operator">+</span></span><br><span class="line">  labs<span class="punctuation">(</span></span><br><span class="line">    title <span class="operator">=</span> <span class="string">&quot;Potential Suitable Distribution of Angelica dahurica&quot;</span><span class="punctuation">,</span></span><br><span class="line">    x <span class="operator">=</span> <span class="string">&quot;Longitude&quot;</span><span class="punctuation">,</span></span><br><span class="line">    y <span class="operator">=</span> <span class="string">&quot;Latitude&quot;</span></span><br><span class="line">  <span class="punctuation">)</span> <span class="operator">+</span></span><br><span class="line">  theme<span class="punctuation">(</span></span><br><span class="line">    plot.title <span class="operator">=</span> element_text<span class="punctuation">(</span>size <span class="operator">=</span> <span class="number">14</span><span class="punctuation">,</span> face <span class="operator">=</span> <span class="string">&quot;bold&quot;</span><span class="punctuation">)</span><span class="punctuation">,</span></span><br><span class="line">    axis.text <span class="operator">=</span> element_text<span class="punctuation">(</span>size <span class="operator">=</span> <span class="number">10</span><span class="punctuation">)</span></span><br><span class="line">  <span class="punctuation">)</span></span><br></pre></td></tr></table></figure></div><p>最终效果：<br><img                       lazyload                     src="/images/loading.svg"                     data-src="/images/000010.png"                                     ></p>]]></content>
    
    
    <summary type="html">该脚本完整实现了基于 BIOMOD2 的物种分布模型流程：从数据准备（分布点 + 环境变量）、模型训练与评估、变量重要性分析，到集成预测与结果可视化，最终输出白芷在当前环境下的适宜性分布，为其道地性研究提供科学依据</summary>
    
    
    
    <category term="研究生生活" scheme="https://gankun.cn.lu/categories/%E7%A0%94%E7%A9%B6%E7%94%9F%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="R" scheme="https://gankun.cn.lu/tags/R/"/>
    
    <category term="biovars" scheme="https://gankun.cn.lu/tags/biovars/"/>
    
    <category term="气象数据" scheme="https://gankun.cn.lu/tags/%E6%B0%94%E8%B1%A1%E6%95%B0%E6%8D%AE/"/>
    
    <category term="MaxEnt" scheme="https://gankun.cn.lu/tags/MaxEnt/"/>
    
    <category term="WorldClim" scheme="https://gankun.cn.lu/tags/WorldClim/"/>
    
    <category term="NCEI" scheme="https://gankun.cn.lu/tags/NCEI/"/>
    
    <category term="biomod2" scheme="https://gankun.cn.lu/tags/biomod2/"/>
    
  </entry>
  
  <entry>
    <title>从逐日气象数据生成生物气候变量</title>
    <link href="https://gankun.cn.lu/posts/2025-04-15/"/>
    <id>https://gankun.cn.lu/posts/2025-04-15/</id>
    <published>2025-04-15T00:28:21.528Z</published>
    <updated>2026-04-02T11:31:19.018Z</updated>
    
    <content type="html"><![CDATA[<p><strong>生物气候变量</strong>可以用于最大熵模型（Maxent，Maximum Entropy Model）中的<strong>生物信息学</strong>，用于物种分布预测，通过分析物种已知分布数据和环境变量，推断物种在未知区域的分布概率。一般来说，所使用的环境变量采用的世界气候数据库中的数据(<a class="link"   href="https://www.worldclim.org/" >http://www.worldclim.org<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>)，但是WorldClim里的数据并不是最新的，历史数据只包含1970-2000年，2000年以后的数据都是预测数据，用来做当年的分析多多少少不够准确</p><p>怎样才能自己用数据创建<strong>生物气候变量</strong> ？WorldClim的原话是这样的：</p><blockquote><p>To create these values yourself, you can use the ‘biovars’ function in the <em>R</em> package dismo</p></blockquote><p>也就是说，我们需要使用R语言进行计算，函数具体信息如下：</p><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Function to create &#x27;bioclimatic variables&#x27; from monthly climate data.</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Usage:</span></span><br><span class="line"><span class="comment">#prec    vector, matrix, or RasterStack/Brick of precipitation data</span></span><br><span class="line"><span class="comment">#tmin    vector, matrix, or RasterStack/Brick of minimum temperature data</span></span><br><span class="line"><span class="comment">#tmax    vector, matrix, or RasterStack/Brick of maximum temperature data</span></span><br><span class="line"><span class="comment">#...     Additional arguments</span></span><br><span class="line"><span class="comment"># Input data is normaly monthly. I.e. there should be 12 values (layers) for each variable, but the function should also work for e.g. weekly data (with some changes in the meaning of the output variables. E.g. #8 would then not be for a quater (3 months), but for a 3 week period)</span></span><br><span class="line"></span><br><span class="line">biovars<span class="punctuation">(</span>prec<span class="punctuation">,</span> tmin<span class="punctuation">,</span> tmax<span class="punctuation">,</span> ...<span class="punctuation">)</span></span><br></pre></td></tr></table></figure></div><p>从文档得知，要使用这个函数，需要准备12个月每月的平均降水、平均最低温和平均最高温数据。数据哪里来？可以参看这篇文章《<a class="link"   href="https://www.cnblogs.com/icydengyw/p/12664027.html" >中国气象站点数据获取的几种方式<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>》。我选择了难度最低的方法，在<a class="link"   href="https://www.ncei.noaa.gov/data/global-summary-of-the-day/archive/" >NCEI<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>获取数据，下面就以2024年的逐日数据为例，逐步处理最后得到生物气候变量</p><h2 id="站点气候数据获取与粗处理"><a href="#站点气候数据获取与粗处理" class="headerlink" title="站点气候数据获取与粗处理"></a>站点气候数据获取与粗处理</h2><p>我下载的是2024年逐日数据的归档数据，范围为全球，所以首先要将中国站点的数据找到，中国目前被收录的站点编号为50136099999-59997099999，每一个文件内的格式如下：</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&quot;STATION&quot;,&quot;DATE&quot;,&quot;LATITUDE&quot;,&quot;LONGITUDE&quot;,&quot;ELEVATION&quot;,&quot;NAME&quot;,&quot;TEMP&quot;,&quot;TEMP_ATTRIBUTES&quot;,&quot;DEWP&quot;,&quot;DEWP_ATTRIBUTES&quot;,&quot;SLP&quot;,&quot;SLP_ATTRIBUTES&quot;,&quot;STP&quot;,&quot;STP_ATTRIBUTES&quot;,&quot;VISIB&quot;,&quot;VISIB_ATTRIBUTES&quot;,&quot;WDSP&quot;,&quot;WDSP_ATTRIBUTES&quot;,&quot;MXSPD&quot;,&quot;GUST&quot;,&quot;MAX&quot;,&quot;MAX_ATTRIBUTES&quot;,&quot;MIN&quot;,&quot;MIN_ATTRIBUTES&quot;,&quot;PRCP&quot;,&quot;PRCP_ATTRIBUTES&quot;,&quot;SNDP&quot;,&quot;FRSHTT&quot;</span><br><span class="line">&quot;50136099999&quot;,&quot;2024-01-01&quot;,&quot;52.9666666&quot;,&quot;122.5333333&quot;,&quot;438.0&quot;,&quot;MOHE, CH&quot;,&quot; -17.1&quot;,&quot; 8&quot;,&quot; -24.6&quot;,&quot; 8&quot;,&quot;1021.6&quot;,&quot; 8&quot;,&quot;962.5&quot;,&quot; 8&quot;,&quot;  8.0&quot;,&quot; 8&quot;,&quot;  1.5&quot;,&quot; 8&quot;,&quot;  2.7&quot;,&quot;999.9&quot;,&quot;  -0.4&quot;,&quot; &quot;,&quot; -32.8&quot;,&quot; &quot;,&quot; 0.03&quot;,&quot;G&quot;,&quot;999.9&quot;,&quot;001000&quot;</span><br><span class="line">&quot;50136099999&quot;,&quot;2024-01-02&quot;,&quot;52.9666666&quot;,&quot;122.5333333&quot;,&quot;438.0&quot;,&quot;MOHE, CH&quot;,&quot; -12.3&quot;,&quot; 8&quot;,&quot; -18.8&quot;,&quot; 8&quot;,&quot;1018.3&quot;,&quot; 8&quot;,&quot;958.8&quot;,&quot; 8&quot;,&quot;  4.3&quot;,&quot; 8&quot;,&quot;  0.8&quot;,&quot; 8&quot;,&quot;  1.6&quot;,&quot;999.9&quot;,&quot;  -0.4&quot;,&quot; &quot;,&quot; -31.2&quot;,&quot; &quot;,&quot; 0.03&quot;,&quot;G&quot;,&quot;  7.5&quot;,&quot;001000&quot;</span><br></pre></td></tr></table></figure></div><p>将所有国内站点的数据放到新的文件夹，我这里命名为“2024中国气象站逐日数据”，然后将所有文件进行合并，以便后续分析，这里我使用Python进行处理：</p><div class="code-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">import</span> glob</span><br><span class="line"></span><br><span class="line"><span class="comment"># 读取数据</span></span><br><span class="line">csv_files = glob.glob(<span class="string">&quot;2024中国气象站逐日数据/*.csv&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 读取所有CSV文件并合并</span></span><br><span class="line">combined_data = pd.DataFrame()</span><br><span class="line"><span class="keyword">for</span> file <span class="keyword">in</span> csv_files:</span><br><span class="line">    data = pd.read_csv(file, encoding=<span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">    combined_data = pd.concat([combined_data, data], ignore_index=<span class="literal">True</span>)</span><br><span class="line"><span class="comment"># 保存文件</span></span><br><span class="line">combined_data.to_csv(<span class="string">&quot;2024中国气象站逐日数据-合并后.csv&quot;</span>, index=<span class="literal">False</span>, encoding=<span class="string">&#x27;utf-8&#x27;</span>)</span><br></pre></td></tr></table></figure></div><p>随后对合并后的数据进行清洗和计算月均值，同样使用Python：</p><div class="code-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">from</span> enum <span class="keyword">import</span> Enum</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MssingValue</span>(<span class="title class_ inherited__">Enum</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    缺失值</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    MAX = <span class="number">9999.9</span></span><br><span class="line">    MIN = <span class="number">9999.9</span></span><br><span class="line">    PRCP = <span class="number">99.99</span></span><br><span class="line"><span class="comment"># 计算每个站点的月均值,并将数据转换为中国标准</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">calculate_monthly_means</span>(<span class="params">df</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    计算每个站点的月均值</span></span><br><span class="line"><span class="string">    :param df: 分组后的数据</span></span><br><span class="line"><span class="string">    :return: 月均值数据</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># 根据缺失值进行数据清洗</span></span><br><span class="line">    df = df[df[<span class="string">&#x27;MAX&#x27;</span>] != MssingValue.MAX.value]</span><br><span class="line">    df = df[df[<span class="string">&#x27;MIN&#x27;</span>] != MssingValue.MIN.value]</span><br><span class="line">    df = df[df[<span class="string">&#x27;PRCP&#x27;</span>] != MssingValue.PRCP.value]</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 将日期列转换为日期类型</span></span><br><span class="line">    df[<span class="string">&#x27;DATE&#x27;</span>] = pd.to_datetime(df[<span class="string">&#x27;DATE&#x27;</span>], <span class="built_in">format</span>=<span class="string">&#x27;%Y-%m-%d&#x27;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 提取月份</span></span><br><span class="line">    df[<span class="string">&#x27;MONTH&#x27;</span>] = df[<span class="string">&#x27;DATE&#x27;</span>].dt.month</span><br><span class="line"></span><br><span class="line">    monthly_means = df.groupby([<span class="string">&#x27;STATION&#x27;</span>, <span class="string">&#x27;MONTH&#x27;</span>]).agg(&#123;</span><br><span class="line">        <span class="string">&#x27;MAX&#x27;</span>: <span class="string">&#x27;mean&#x27;</span>,</span><br><span class="line">        <span class="string">&#x27;MIN&#x27;</span>: <span class="string">&#x27;mean&#x27;</span>,</span><br><span class="line">        <span class="string">&#x27;PRCP&#x27;</span>: <span class="string">&#x27;sum&#x27;</span>,  <span class="comment"># 降水量求和</span></span><br><span class="line">    &#125;).reset_index()</span><br><span class="line">    <span class="comment"># 将月份转换为字符串格式</span></span><br><span class="line">    monthly_means[<span class="string">&#x27;MONTH&#x27;</span>] = monthly_means[<span class="string">&#x27;MONTH&#x27;</span>].astype(<span class="built_in">str</span>).<span class="built_in">str</span>.zfill(<span class="number">2</span>)</span><br><span class="line">    <span class="comment"># 每个站点的经纬度</span></span><br><span class="line">    station_info = df[[<span class="string">&#x27;STATION&#x27;</span>, <span class="string">&#x27;LATITUDE&#x27;</span>, <span class="string">&#x27;LONGITUDE&#x27;</span>, <span class="string">&#x27;ELEVATION&#x27;</span>, <span class="string">&#x27;NAME&#x27;</span>]].drop_duplicates(subset=<span class="string">&#x27;STATION&#x27;</span>)</span><br><span class="line">    monthly_means = monthly_means.merge(station_info, on=<span class="string">&#x27;STATION&#x27;</span>, how=<span class="string">&#x27;left&#x27;</span>)</span><br><span class="line"></span><br><span class="line">    monthly_means[<span class="string">&#x27;MAX&#x27;</span>] = (monthly_means[<span class="string">&#x27;MAX&#x27;</span>] - <span class="number">32</span>) / <span class="number">1.8</span>  <span class="comment"># 华氏度转摄氏度</span></span><br><span class="line">    monthly_means[<span class="string">&#x27;MIN&#x27;</span>] = (monthly_means[<span class="string">&#x27;MIN&#x27;</span>] - <span class="number">32</span>) / <span class="number">1.8</span>  <span class="comment"># 华氏度转摄氏度</span></span><br><span class="line">    monthly_means[<span class="string">&#x27;PRCP&#x27;</span>] = monthly_means[<span class="string">&#x27;PRCP&#x27;</span>] * <span class="number">25.4</span>  <span class="comment"># 英寸转毫米</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> monthly_means</span><br><span class="line"></span><br><span class="line"><span class="comment"># 处理数据</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">process_data</span>(<span class="params">file_path</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    处理数据</span></span><br><span class="line"><span class="string">    :param file_path: 文件路径</span></span><br><span class="line"><span class="string">    :return: 处理后的数据</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># 读取数据</span></span><br><span class="line">    df = pd.read_csv(file_path)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 计算每个站点的月均值</span></span><br><span class="line">    monthly_means = calculate_monthly_means(df)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> monthly_means</span><br><span class="line"><span class="comment"># 主函数</span></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    <span class="comment"># 文件路径</span></span><br><span class="line">    file_path = <span class="string">&quot;2024中国气象站逐日数据-合并后.csv&quot;</span></span><br><span class="line">    <span class="comment"># 处理数据</span></span><br><span class="line">    processed_data = process_data(file_path)</span><br><span class="line">    processed_data.to_csv(<span class="string">&quot;2024中国气象站逐日数据-月均值.csv&quot;</span>, index=<span class="literal">False</span>)</span><br></pre></td></tr></table></figure></div><p>此时得到的 <code>2024中国气象站逐日数据-合并后.csv</code>结构应该是这样的：</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">STATION,MONTH,MAX,MIN,PRCP,LATITUDE,LONGITUDE,ELEVATION,NAME</span><br><span class="line">50136099999,01,-15.600427350427351,-36.113247863247864,5.08,52.9666666,122.5333333,438.0,&quot;MOHE, CH&quot;</span><br><span class="line">50136099999,02,-10.016460905349795,-34.619341563786,6.096,52.9666666,122.5333333,438.0,&quot;MOHE, CH&quot;</span><br></pre></td></tr></table></figure></div><p>再将这个文件按月拆分开，同样使用Python：</p><div class="code-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"></span><br><span class="line"><span class="comment"># 读取数据</span></span><br><span class="line">df = pd.read_csv(<span class="string">&#x27;2024中国气象站逐日数据-月均值.csv&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 按月分割数据</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">split_monthly_data</span>(<span class="params">df</span>):</span><br><span class="line">    <span class="comment"># 将 &#x27;MONTH&#x27; 列转换为整数类型</span></span><br><span class="line">    df[<span class="string">&#x27;MONTH&#x27;</span>] = df[<span class="string">&#x27;MONTH&#x27;</span>].astype(<span class="built_in">int</span>)</span><br><span class="line">    <span class="comment"># 遍历每个月份</span></span><br><span class="line">    <span class="keyword">for</span> month <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, <span class="number">13</span>):</span><br><span class="line">        <span class="comment"># 过滤出当前月份的数据</span></span><br><span class="line">        monthly_data = df[df[<span class="string">&#x27;MONTH&#x27;</span>] == month]</span><br><span class="line">        <span class="comment"># 将数据保存到 CSV 文件中，文件名为 &#x27;month_XX.csv&#x27;</span></span><br><span class="line">        monthly_data.to_csv(<span class="string">f&#x27;2024中国气象站逐月数据/month_<span class="subst">&#123;month:02&#125;</span>.csv&#x27;</span>, index=<span class="literal">False</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;Month <span class="subst">&#123;month:02&#125;</span> data saved to month_<span class="subst">&#123;month:02&#125;</span>.csv&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    split_monthly_data(df)</span><br></pre></td></tr></table></figure></div><p>这个时候我们的工作目录结构应该是这样的：</p><div class="code-container" data-rel="Sh"><figure class="iseeu highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">.</span><br><span class="line">├── 按月分割月均值数据.py</span><br><span class="line">├── 合并气候数据.py</span><br><span class="line">├── 处理气候数据.py</span><br><span class="line">├── 2024中国气象站逐日数据</span><br><span class="line">│   ├── 50136099999.csv</span><br><span class="line">│   ├── 50353099999.csv</span><br><span class="line">│   ├── 50434099999.csv</span><br><span class="line">│   ├── 50468099999.csv</span><br><span class="line">│   ├── 50527099999.csv</span><br><span class="line">│   └── ............csv</span><br><span class="line">├── 2024中国气象站逐月数据</span><br><span class="line">│   ├── month_01.csv</span><br><span class="line">│   ├── month_02.csv</span><br><span class="line">│   ├── month_03.csv</span><br><span class="line">│   ├── month_04.csv</span><br><span class="line">│   ├── month_05.csv</span><br><span class="line">│   ├── month_06.csv</span><br><span class="line">│   ├── month_07.csv</span><br><span class="line">│   ├── month_08.csv</span><br><span class="line">│   ├── month_09.csv</span><br><span class="line">│   ├── month_10.csv</span><br><span class="line">│   ├── month_11.csv</span><br><span class="line">│   └── month_12.csv</span><br><span class="line">├── 2024中国气象站逐日数据-合并后.csv</span><br><span class="line">└── 2024中国气象站逐日数据-月均值.csv</span><br></pre></td></tr></table></figure></div><h2 id="月度气候数据插值"><a href="#月度气候数据插值" class="headerlink" title="月度气候数据插值"></a>月度气候数据插值</h2><p>现在得到的数据都是点类型的数据，并没有对国内进行覆盖，没有数据的坐标点就需要进行插值计算获取。这里我们使用R语言进行普通克里金法插值：</p><blockquote><p>为什么要插值？插值是由有限数量的采样点数据估计栅格中的单元的值。它可以用来估计任何地理点数据的未知值：高程、降雨、化学污染程度、噪声等级等等。在研究区域内，测量某种现象每个点的高度、等级或集聚程度一般是非常困难，同时也是很昂贵的。相反，用户可以选择一些离散的样本点进行测量，通过插值得出采样点的值。采样点可以是随机的、分层的或者规则的格网点，包含高度、污染程度或者等级等信息。具体概念和实现可以看这个论坛:<a class="link"   href="https://www.tyboard.net/forum.php?mod=viewthread&tid=706" >Python气象数据空间插值与绘图<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p></blockquote><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 加载必要的包</span></span><br><span class="line">library<span class="punctuation">(</span>raster<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>sp<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>rgdal<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>gstat<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>maptools<span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">output_dir <span class="operator">&lt;-</span> <span class="string">&quot;逐月数据插值结果&quot;</span></span><br><span class="line">input_dir <span class="operator">&lt;-</span> <span class="string">&quot;2024中国气象站逐月数据&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建输出目录</span></span><br><span class="line">dir.create<span class="punctuation">(</span>output_dir<span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 读取中国边界数据</span></span><br><span class="line">china_map <span class="operator">&lt;-</span> readOGR<span class="punctuation">(</span><span class="string">&quot;China.shp&quot;</span><span class="punctuation">)</span> <span class="comment">#需要自备中国范围的矢量文件</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建覆盖中国的规则网格</span></span><br><span class="line"><span class="comment"># 转换坐标系统为更适合中国区域的投影</span></span><br><span class="line">china_proj <span class="operator">&lt;-</span> spTransform<span class="punctuation">(</span></span><br><span class="line">    china_map<span class="punctuation">,</span></span><br><span class="line">    CRS<span class="punctuation">(</span><span class="string">&quot;+proj=laea +lat_0=36 +lon_0=104 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs&quot;</span><span class="punctuation">)</span></span><br><span class="line"><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建规则网格(使用相同的分辨率)</span></span><br><span class="line">grid_res <span class="operator">&lt;-</span> 0.04165 <span class="comment"># 分辨率，单位为度</span></span><br><span class="line">china_extent <span class="operator">&lt;-</span> extent<span class="punctuation">(</span>china_map<span class="punctuation">)</span></span><br><span class="line">x_seq <span class="operator">&lt;-</span> seq<span class="punctuation">(</span>china_extent<span class="operator">@</span>xmin<span class="punctuation">,</span> china_extent<span class="operator">@</span>xmax<span class="punctuation">,</span> by <span class="operator">=</span> grid_res<span class="punctuation">)</span></span><br><span class="line">y_seq <span class="operator">&lt;-</span> seq<span class="punctuation">(</span>china_extent<span class="operator">@</span>ymin<span class="punctuation">,</span> china_extent<span class="operator">@</span>ymax<span class="punctuation">,</span> by <span class="operator">=</span> grid_res<span class="punctuation">)</span></span><br><span class="line">grid <span class="operator">&lt;-</span> expand.grid<span class="punctuation">(</span>x <span class="operator">=</span> x_seq<span class="punctuation">,</span> y <span class="operator">=</span> y_seq<span class="punctuation">)</span></span><br><span class="line">coordinates<span class="punctuation">(</span>grid<span class="punctuation">)</span> <span class="operator">&lt;-</span> <span class="operator">~</span> x <span class="operator">+</span> y</span><br><span class="line">gridded<span class="punctuation">(</span>grid<span class="punctuation">)</span> <span class="operator">&lt;-</span> <span class="literal">TRUE</span></span><br><span class="line">proj4string<span class="punctuation">(</span>grid<span class="punctuation">)</span> <span class="operator">&lt;-</span> proj4string<span class="punctuation">(</span>china_map<span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 只保留中国边界内的网格点</span></span><br><span class="line">grid_in_china <span class="operator">&lt;-</span> grid<span class="punctuation">[</span>china_map<span class="punctuation">,</span> <span class="punctuation">]</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 定义插值处理函数</span></span><br><span class="line">process_monthly_data <span class="operator">&lt;-</span> <span class="keyword">function</span><span class="punctuation">(</span>month_num<span class="punctuation">)</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="comment"># 月份编号格式化(补零)</span></span><br><span class="line">    month_str <span class="operator">&lt;-</span> sprintf<span class="punctuation">(</span><span class="string">&quot;%02d&quot;</span><span class="punctuation">,</span> month_num<span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">    cat<span class="punctuation">(</span>paste0<span class="punctuation">(</span><span class="string">&quot;处理第 &quot;</span><span class="punctuation">,</span> month_str<span class="punctuation">,</span> <span class="string">&quot; 月数据...\n&quot;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 读取气象数据</span></span><br><span class="line">    file_path <span class="operator">&lt;-</span> paste0<span class="punctuation">(</span>input_dir<span class="punctuation">,</span> <span class="string">&quot;/month_&quot;</span><span class="punctuation">,</span> month_str<span class="punctuation">,</span> <span class="string">&quot;.csv&quot;</span><span class="punctuation">)</span></span><br><span class="line">    climate_data <span class="operator">&lt;-</span> read.csv<span class="punctuation">(</span>file_path<span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 转换为空间点数据框</span></span><br><span class="line">    coordinates<span class="punctuation">(</span>climate_data<span class="punctuation">)</span> <span class="operator">&lt;-</span> <span class="operator">~</span> LONGITUDE <span class="operator">+</span> LATITUDE</span><br><span class="line">    proj4string<span class="punctuation">(</span>climate_data<span class="punctuation">)</span> <span class="operator">&lt;-</span> CRS<span class="punctuation">(</span><span class="string">&quot;+proj=longlat +datum=WGS84&quot;</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 创建输出文件名前缀</span></span><br><span class="line">    output_prefix <span class="operator">&lt;-</span> paste0<span class="punctuation">(</span>output_dir<span class="punctuation">,</span> <span class="string">&quot;/month_&quot;</span><span class="punctuation">,</span> month_str<span class="punctuation">,</span> <span class="string">&quot;_&quot;</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 用普通克里金法插值平均温度(TEMP)</span></span><br><span class="line">    cat<span class="punctuation">(</span><span class="string">&quot;  插值平均温度(TEMP)...\n&quot;</span><span class="punctuation">)</span></span><br><span class="line">    v_temp <span class="operator">&lt;-</span> variogram<span class="punctuation">(</span>TEMP <span class="operator">~</span> <span class="number">1</span><span class="punctuation">,</span> climate_data<span class="punctuation">)</span></span><br><span class="line">    v_temp_fit <span class="operator">&lt;-</span> fit.variogram<span class="punctuation">(</span>v_temp<span class="punctuation">,</span> model <span class="operator">=</span> vgm<span class="punctuation">(</span><span class="string">&quot;Sph&quot;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">    temp_kriging <span class="operator">&lt;-</span> krige<span class="punctuation">(</span>TEMP <span class="operator">~</span> <span class="number">1</span><span class="punctuation">,</span> climate_data<span class="punctuation">,</span> grid_in_china<span class="punctuation">,</span> v_temp_fit<span class="punctuation">)</span></span><br><span class="line">    temp_raster <span class="operator">&lt;-</span> raster<span class="punctuation">(</span>temp_kriging<span class="punctuation">)</span></span><br><span class="line">    temp_raster_masked <span class="operator">&lt;-</span> mask<span class="punctuation">(</span>temp_raster<span class="punctuation">,</span> china_map<span class="punctuation">)</span></span><br><span class="line">    writeRaster<span class="punctuation">(</span>temp_raster_masked<span class="punctuation">,</span> paste0<span class="punctuation">(</span>output_prefix<span class="punctuation">,</span> <span class="string">&quot;temp.tif&quot;</span><span class="punctuation">)</span><span class="punctuation">,</span></span><br><span class="line">        format <span class="operator">=</span> <span class="string">&quot;GTiff&quot;</span><span class="punctuation">,</span> overwrite <span class="operator">=</span> <span class="literal">TRUE</span></span><br><span class="line">    <span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 对最高温度(MAX)插值</span></span><br><span class="line">    cat<span class="punctuation">(</span><span class="string">&quot;  插值最高温度(MAX)...\n&quot;</span><span class="punctuation">)</span></span><br><span class="line">    v_max <span class="operator">&lt;-</span> variogram<span class="punctuation">(</span>MAX <span class="operator">~</span> <span class="number">1</span><span class="punctuation">,</span> climate_data<span class="punctuation">)</span></span><br><span class="line">    v_max_fit <span class="operator">&lt;-</span> fit.variogram<span class="punctuation">(</span>v_max<span class="punctuation">,</span> model <span class="operator">=</span> vgm<span class="punctuation">(</span><span class="string">&quot;Sph&quot;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">    max_kriging <span class="operator">&lt;-</span> krige<span class="punctuation">(</span>MAX <span class="operator">~</span> <span class="number">1</span><span class="punctuation">,</span> climate_data<span class="punctuation">,</span> grid_in_china<span class="punctuation">,</span> v_max_fit<span class="punctuation">)</span></span><br><span class="line">    max_raster <span class="operator">&lt;-</span> raster<span class="punctuation">(</span>max_kriging<span class="punctuation">)</span></span><br><span class="line">    max_raster_masked <span class="operator">&lt;-</span> mask<span class="punctuation">(</span>max_raster<span class="punctuation">,</span> china_map<span class="punctuation">)</span></span><br><span class="line">    writeRaster<span class="punctuation">(</span>max_raster_masked<span class="punctuation">,</span> paste0<span class="punctuation">(</span>output_prefix<span class="punctuation">,</span> <span class="string">&quot;max.tif&quot;</span><span class="punctuation">)</span><span class="punctuation">,</span></span><br><span class="line">        format <span class="operator">=</span> <span class="string">&quot;GTiff&quot;</span><span class="punctuation">,</span> overwrite <span class="operator">=</span> <span class="literal">TRUE</span></span><br><span class="line">    <span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 对最低温度(MIN)插值</span></span><br><span class="line">    cat<span class="punctuation">(</span><span class="string">&quot;  插值最低温度(MIN)...\n&quot;</span><span class="punctuation">)</span></span><br><span class="line">    v_min <span class="operator">&lt;-</span> variogram<span class="punctuation">(</span>MIN <span class="operator">~</span> <span class="number">1</span><span class="punctuation">,</span> climate_data<span class="punctuation">)</span></span><br><span class="line">    v_min_fit <span class="operator">&lt;-</span> fit.variogram<span class="punctuation">(</span>v_min<span class="punctuation">,</span> model <span class="operator">=</span> vgm<span class="punctuation">(</span><span class="string">&quot;Sph&quot;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">    min_kriging <span class="operator">&lt;-</span> krige<span class="punctuation">(</span>MIN <span class="operator">~</span> <span class="number">1</span><span class="punctuation">,</span> climate_data<span class="punctuation">,</span> grid_in_china<span class="punctuation">,</span> v_min_fit<span class="punctuation">)</span></span><br><span class="line">    min_raster <span class="operator">&lt;-</span> raster<span class="punctuation">(</span>min_kriging<span class="punctuation">)</span></span><br><span class="line">    min_raster_masked <span class="operator">&lt;-</span> mask<span class="punctuation">(</span>min_raster<span class="punctuation">,</span> china_map<span class="punctuation">)</span></span><br><span class="line">    writeRaster<span class="punctuation">(</span>min_raster_masked<span class="punctuation">,</span> paste0<span class="punctuation">(</span>output_prefix<span class="punctuation">,</span> <span class="string">&quot;min.tif&quot;</span><span class="punctuation">)</span><span class="punctuation">,</span></span><br><span class="line">        format <span class="operator">=</span> <span class="string">&quot;GTiff&quot;</span><span class="punctuation">,</span> overwrite <span class="operator">=</span> <span class="literal">TRUE</span></span><br><span class="line">    <span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 对降水量(PRCP)插值</span></span><br><span class="line">    cat<span class="punctuation">(</span><span class="string">&quot;  插值降水量(PRCP)...\n&quot;</span><span class="punctuation">)</span></span><br><span class="line">    v_prcp <span class="operator">&lt;-</span> variogram<span class="punctuation">(</span>PRCP <span class="operator">~</span> <span class="number">1</span><span class="punctuation">,</span> climate_data<span class="punctuation">)</span></span><br><span class="line">    v_prcp_fit <span class="operator">&lt;-</span> fit.variogram<span class="punctuation">(</span>v_prcp<span class="punctuation">,</span> model <span class="operator">=</span> vgm<span class="punctuation">(</span><span class="string">&quot;Sph&quot;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">    prcp_kriging <span class="operator">&lt;-</span> krige<span class="punctuation">(</span>PRCP <span class="operator">~</span> <span class="number">1</span><span class="punctuation">,</span> climate_data<span class="punctuation">,</span> grid_in_china<span class="punctuation">,</span> v_prcp_fit<span class="punctuation">)</span></span><br><span class="line">    prcp_raster <span class="operator">&lt;-</span> raster<span class="punctuation">(</span>prcp_kriging<span class="punctuation">)</span></span><br><span class="line">    <span class="comment"># 将降水量负值替换为0</span></span><br><span class="line">    prcp_raster<span class="punctuation">[</span>prcp_raster <span class="operator">&lt;</span> <span class="number">0</span><span class="punctuation">]</span> <span class="operator">&lt;-</span> <span class="number">0</span></span><br><span class="line">    prcp_raster_masked <span class="operator">&lt;-</span> mask<span class="punctuation">(</span>prcp_raster<span class="punctuation">,</span> china_map<span class="punctuation">)</span></span><br><span class="line">    writeRaster<span class="punctuation">(</span>prcp_raster_masked<span class="punctuation">,</span> paste0<span class="punctuation">(</span>output_prefix<span class="punctuation">,</span> <span class="string">&quot;prcp.tif&quot;</span><span class="punctuation">)</span><span class="punctuation">,</span></span><br><span class="line">        format <span class="operator">=</span> <span class="string">&quot;GTiff&quot;</span><span class="punctuation">,</span> overwrite <span class="operator">=</span> <span class="literal">TRUE</span></span><br><span class="line">    <span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">    cat<span class="punctuation">(</span>paste0<span class="punctuation">(</span><span class="string">&quot;第 &quot;</span><span class="punctuation">,</span> month_str<span class="punctuation">,</span> <span class="string">&quot; 月数据处理完成\n&quot;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 批量处理所有月份</span></span><br><span class="line">start_time <span class="operator">&lt;-</span> Sys.time<span class="punctuation">(</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> <span class="punctuation">(</span>month <span class="keyword">in</span> <span class="number">1</span><span class="operator">:</span><span class="number">12</span><span class="punctuation">)</span> <span class="punctuation">&#123;</span></span><br><span class="line">    process_monthly_data<span class="punctuation">(</span>month<span class="punctuation">)</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line">end_time <span class="operator">&lt;-</span> Sys.time<span class="punctuation">(</span><span class="punctuation">)</span></span><br><span class="line">processing_time <span class="operator">&lt;-</span> difftime<span class="punctuation">(</span>end_time<span class="punctuation">,</span> start_time<span class="punctuation">,</span> units <span class="operator">=</span> <span class="string">&quot;mins&quot;</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">cat<span class="punctuation">(</span>paste0<span class="punctuation">(</span><span class="string">&quot;\n所有月份数据处理完成！\n&quot;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">cat<span class="punctuation">(</span>paste0<span class="punctuation">(</span><span class="string">&quot;总耗时: &quot;</span><span class="punctuation">,</span> <span class="built_in">round</span><span class="punctuation">(</span>processing_time<span class="punctuation">,</span> <span class="number">2</span><span class="punctuation">)</span><span class="punctuation">,</span> <span class="string">&quot; 分钟\n&quot;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">cat<span class="punctuation">(</span>paste0<span class="punctuation">(</span><span class="string">&quot;结果文件已保存到&quot;</span><span class="punctuation">,</span> output_dir<span class="punctuation">,</span> <span class="string">&quot;目录\n&quot;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br></pre></td></tr></table></figure></div><p>运行后得到全国的逐月三种气候数据：</p><div class="code-container" data-rel="Sh"><figure class="iseeu highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">.</span><br><span class="line">├── ...</span><br><span class="line">└── 逐月数据插值结果</span><br><span class="line">    ├── month_01_max.tif</span><br><span class="line">    ├── month_01_min.tif</span><br><span class="line">    ├── month_01_prcp.tif</span><br><span class="line">    └── ..............tif</span><br></pre></td></tr></table></figure></div><h2 id="计算生物气候变量"><a href="#计算生物气候变量" class="headerlink" title="计算生物气候变量"></a>计算<strong>生物气候变量</strong></h2><p>现在使用R语言<em>dismo</em>包中的<em>biovars</em>方法计算<strong>生物气候变量</strong>：</p><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 加载必要的包</span></span><br><span class="line">library<span class="punctuation">(</span>raster<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>dismo<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>rgdal<span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置输入和输出目录</span></span><br><span class="line">input_dir <span class="operator">&lt;-</span> <span class="string">&quot;逐月数据插值结果&quot;</span></span><br><span class="line">output_dir <span class="operator">&lt;-</span> <span class="string">&quot;逐月数据插值结果计算bioclims&quot;</span></span><br><span class="line">dir.create<span class="punctuation">(</span>output_dir<span class="punctuation">,</span> showWarnings <span class="operator">=</span> <span class="literal">FALSE</span><span class="punctuation">,</span> recursive <span class="operator">=</span> <span class="literal">TRUE</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">cat<span class="punctuation">(</span><span class="string">&quot;开始读取每月气候栅格数据...\n&quot;</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 读取每月温度和降水栅格数据</span></span><br><span class="line">tmax_stack <span class="operator">&lt;-</span> stack<span class="punctuation">(</span><span class="punctuation">)</span></span><br><span class="line">tmin_stack <span class="operator">&lt;-</span> stack<span class="punctuation">(</span><span class="punctuation">)</span></span><br><span class="line">prcp_stack <span class="operator">&lt;-</span> stack<span class="punctuation">(</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 按顺序读取12个月的数据</span></span><br><span class="line"><span class="keyword">for</span> <span class="punctuation">(</span>month <span class="keyword">in</span> <span class="number">1</span><span class="operator">:</span><span class="number">12</span><span class="punctuation">)</span> <span class="punctuation">&#123;</span></span><br><span class="line">  month_str <span class="operator">&lt;-</span> sprintf<span class="punctuation">(</span><span class="string">&quot;%02d&quot;</span><span class="punctuation">,</span> month<span class="punctuation">)</span></span><br><span class="line">  <span class="comment"># 构建文件路径</span></span><br><span class="line">  max_file <span class="operator">&lt;-</span> file.path<span class="punctuation">(</span>input_dir<span class="punctuation">,</span> paste0<span class="punctuation">(</span><span class="string">&quot;month_&quot;</span><span class="punctuation">,</span> month_str<span class="punctuation">,</span> <span class="string">&quot;_max.tif&quot;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">  min_file <span class="operator">&lt;-</span> file.path<span class="punctuation">(</span>input_dir<span class="punctuation">,</span> paste0<span class="punctuation">(</span><span class="string">&quot;month_&quot;</span><span class="punctuation">,</span> month_str<span class="punctuation">,</span> <span class="string">&quot;_min.tif&quot;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">  prcp_file <span class="operator">&lt;-</span> file.path<span class="punctuation">(</span>input_dir<span class="punctuation">,</span> paste0<span class="punctuation">(</span><span class="string">&quot;month_&quot;</span><span class="punctuation">,</span> month_str<span class="punctuation">,</span> <span class="string">&quot;_prcp.tif&quot;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">  <span class="comment"># 检查文件是否存在并读取栅格</span></span><br><span class="line">  <span class="keyword">if</span> <span class="punctuation">(</span>file.exists<span class="punctuation">(</span>max_file<span class="punctuation">)</span><span class="punctuation">)</span> <span class="punctuation">&#123;</span></span><br><span class="line">    tmax_stack <span class="operator">&lt;-</span> addLayer<span class="punctuation">(</span>tmax_stack<span class="punctuation">,</span> raster<span class="punctuation">(</span>max_file<span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">  <span class="punctuation">&#125;</span> <span class="keyword">else</span> <span class="punctuation">&#123;</span></span><br><span class="line">    stop<span class="punctuation">(</span>paste<span class="punctuation">(</span><span class="string">&quot;文件不存在:&quot;</span><span class="punctuation">,</span> max_file<span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="keyword">if</span> <span class="punctuation">(</span>file.exists<span class="punctuation">(</span>min_file<span class="punctuation">)</span><span class="punctuation">)</span> <span class="punctuation">&#123;</span></span><br><span class="line">    tmin_stack <span class="operator">&lt;-</span> addLayer<span class="punctuation">(</span>tmin_stack<span class="punctuation">,</span> raster<span class="punctuation">(</span>min_file<span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">  <span class="punctuation">&#125;</span> <span class="keyword">else</span> <span class="punctuation">&#123;</span></span><br><span class="line">    stop<span class="punctuation">(</span>paste<span class="punctuation">(</span><span class="string">&quot;文件不存在:&quot;</span><span class="punctuation">,</span> min_file<span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="keyword">if</span> <span class="punctuation">(</span>file.exists<span class="punctuation">(</span>prcp_file<span class="punctuation">)</span><span class="punctuation">)</span> <span class="punctuation">&#123;</span></span><br><span class="line">    prcp_stack <span class="operator">&lt;-</span> addLayer<span class="punctuation">(</span>prcp_stack<span class="punctuation">,</span> raster<span class="punctuation">(</span>prcp_file<span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">  <span class="punctuation">&#125;</span> <span class="keyword">else</span> <span class="punctuation">&#123;</span></span><br><span class="line">    stop<span class="punctuation">(</span>paste<span class="punctuation">(</span><span class="string">&quot;文件不存在:&quot;</span><span class="punctuation">,</span> prcp_file<span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置栅格名称以表示月份</span></span><br><span class="line"><span class="built_in">names</span><span class="punctuation">(</span>tmax_stack<span class="punctuation">)</span> <span class="operator">&lt;-</span> paste0<span class="punctuation">(</span><span class="string">&quot;tmax_&quot;</span><span class="punctuation">,</span> <span class="number">1</span><span class="operator">:</span><span class="number">12</span><span class="punctuation">)</span></span><br><span class="line"><span class="built_in">names</span><span class="punctuation">(</span>tmin_stack<span class="punctuation">)</span> <span class="operator">&lt;-</span> paste0<span class="punctuation">(</span><span class="string">&quot;tmin_&quot;</span><span class="punctuation">,</span> <span class="number">1</span><span class="operator">:</span><span class="number">12</span><span class="punctuation">)</span></span><br><span class="line"><span class="built_in">names</span><span class="punctuation">(</span>prcp_stack<span class="punctuation">)</span> <span class="operator">&lt;-</span> paste0<span class="punctuation">(</span><span class="string">&quot;prcp_&quot;</span><span class="punctuation">,</span> <span class="number">1</span><span class="operator">:</span><span class="number">12</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line">cat<span class="punctuation">(</span><span class="string">&quot;正在计算19个标准生物气候变量...\n&quot;</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用dismo包中的biovars函数计算19个生物气候变量</span></span><br><span class="line">bioclim_vars <span class="operator">&lt;-</span> biovars<span class="punctuation">(</span>prcp_stack<span class="punctuation">,</span> tmin_stack<span class="punctuation">,</span> tmax_stack<span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置生物气候变量的名称</span></span><br><span class="line">bioclim_names <span class="operator">&lt;-</span> <span class="built_in">c</span><span class="punctuation">(</span></span><br><span class="line">  <span class="string">&quot;年平均温度&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;平均昼夜温差&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;等温性&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;温度季节性变化&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;最热月最高温度&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;最冷月最低温度&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;年温度变化范围&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;最湿季平均温度&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;最干季平均温度&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;最热季平均温度&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;最冷季平均温度&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;年降水量&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;最湿月降水量&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;最干月降水量&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;降水季节性变化&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;最湿季降水量&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;最干季降水量&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;最热季降水量&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;最冷季降水量&quot;</span></span><br><span class="line"><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置栅格名称</span></span><br><span class="line"><span class="built_in">names</span><span class="punctuation">(</span>bioclim_vars<span class="punctuation">)</span> <span class="operator">&lt;-</span> paste0<span class="punctuation">(</span><span class="string">&quot;BIO&quot;</span><span class="punctuation">,</span> <span class="number">1</span><span class="operator">:</span><span class="number">19</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 保存各个生物气候变量为单独的GeoTIFF文件</span></span><br><span class="line">cat<span class="punctuation">(</span><span class="string">&quot;正在保存19个生物气候变量栅格...\n&quot;</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> <span class="punctuation">(</span>i <span class="keyword">in</span> <span class="number">1</span><span class="operator">:</span><span class="number">19</span><span class="punctuation">)</span> <span class="punctuation">&#123;</span></span><br><span class="line">  var_name <span class="operator">&lt;-</span> paste0<span class="punctuation">(</span><span class="string">&quot;BIO&quot;</span><span class="punctuation">,</span> i<span class="punctuation">)</span></span><br><span class="line">  file_name <span class="operator">&lt;-</span> file.path<span class="punctuation">(</span>output_dir<span class="punctuation">,</span> paste0<span class="punctuation">(</span>var_name<span class="punctuation">,</span> <span class="string">&quot;.tif&quot;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">  writeRaster<span class="punctuation">(</span>bioclim_vars<span class="punctuation">[[</span>i<span class="punctuation">]</span><span class="punctuation">]</span><span class="punctuation">,</span> file_name<span class="punctuation">,</span> format <span class="operator">=</span> <span class="string">&quot;GTiff&quot;</span><span class="punctuation">,</span> overwrite <span class="operator">=</span> <span class="literal">TRUE</span><span class="punctuation">)</span></span><br><span class="line">  cat<span class="punctuation">(</span>paste<span class="punctuation">(</span><span class="string">&quot; -&quot;</span><span class="punctuation">,</span> var_name<span class="punctuation">,</span> <span class="string">&quot;(&quot;</span><span class="punctuation">,</span> bioclim_names<span class="punctuation">[</span>i<span class="punctuation">]</span><span class="punctuation">,</span> <span class="string">&quot;)&quot;</span><span class="punctuation">,</span> <span class="string">&quot;已保存\n&quot;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line">cat<span class="punctuation">(</span><span class="string">&quot;\n19个标准生物气候变量计算完成！\n&quot;</span><span class="punctuation">)</span></span><br><span class="line">cat<span class="punctuation">(</span>paste0<span class="punctuation">(</span><span class="string">&quot;所有结果已保存到: &quot;</span><span class="punctuation">,</span> output_dir<span class="punctuation">,</span> <span class="string">&quot;\n&quot;</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br></pre></td></tr></table></figure></div><p>到此，我们就得到了2024年的19个<strong>生物气候变量</strong>的数据：</p><div class="code-container" data-rel="Sh"><figure class="iseeu highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">.</span><br><span class="line">├── ...</span><br><span class="line">└── 逐月数据插值结果计算bioclims</span><br><span class="line">    ├── BIO1.tif</span><br><span class="line">    ├── BIO10.tif</span><br><span class="line">    ├── BIO11.tif</span><br><span class="line">    ├── BIO12.tif</span><br><span class="line">    └── ......tif</span><br></pre></td></tr></table></figure></div>]]></content>
    
    
    <summary type="html">从逐日气象站点数据生成生物气候变量(bioclimatic variables)的完整流程。生物气候变量是最大熵模型(MaxEnt)中进行物种分布预测的重要环境变量。主要工作流程包括：数据获取：从NCEI获取2024年全球气象站点的逐日数据，筛选中国区域的站点数据；数据处理：使用Python合并所有站点CSV文件、清洗数据并计算月均值、将数据按月份分割为12个文件、使用R语言的克里金法(Kriging)对点数据进行空间插值、为每个月生成最高最低温度和降水量的栅格数据；生成生物气候变量：使用R语言的dismo包中的biovars函数计算19个标准生物气候变量，输出为GeoTIFF格式栅格文件。</summary>
    
    
    
    <category term="研究生生活" scheme="https://gankun.cn.lu/categories/%E7%A0%94%E7%A9%B6%E7%94%9F%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="python" scheme="https://gankun.cn.lu/tags/python/"/>
    
    <category term="R" scheme="https://gankun.cn.lu/tags/R/"/>
    
    <category term="biovars" scheme="https://gankun.cn.lu/tags/biovars/"/>
    
    <category term="气象数据" scheme="https://gankun.cn.lu/tags/%E6%B0%94%E8%B1%A1%E6%95%B0%E6%8D%AE/"/>
    
    <category term="MaxEnt" scheme="https://gankun.cn.lu/tags/MaxEnt/"/>
    
    <category term="WorldClim" scheme="https://gankun.cn.lu/tags/WorldClim/"/>
    
    <category term="NCEI" scheme="https://gankun.cn.lu/tags/NCEI/"/>
    
  </entry>
  
  <entry>
    <title>从PDF发票中获取商品细则</title>
    <link href="https://gankun.cn.lu/posts/2025-04-09/"/>
    <id>https://gankun.cn.lu/posts/2025-04-09/</id>
    <published>2025-04-08T22:16:51.189Z</published>
    <updated>2026-04-02T11:31:19.018Z</updated>
    
    <content type="html"><![CDATA[<p>在课题组要做报账，那么就免不了根据发票做出入库单，东西少的时候还好，一多起来真的麻烦死人。所以在我还在参与报账工作的时候我就做了一个小工具，可以很畅快地做出入库单，界面如下图：</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="/images/jietuchurukuold.jpeg"                                     ></p><p>虽然减少心智负担了，但是这个时候依旧是需要手动输入发票号码、代码、开票日期等信息。现在没有参与报账工作了，突然想到要是能直接上传文件就获得所有发票信息该多好，说干就干。最初的项目是js&#x2F;ts一把梭，这次改用Python，毕竟人生苦短，我用Python。</p><p>提取发票信息的主体代码实现如下，主要依赖pdfplumber这个库和正则表达式：</p><div class="code-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> pdfplumber</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">from</span> typing <span class="keyword">import</span> <span class="type">List</span>, <span class="type">Dict</span>, <span class="type">Optional</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">InvoiceExtractor</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">_invoice_pdf2txt</span>(<span class="params">self, pdf_path: <span class="built_in">str</span></span>) -&gt; <span class="type">Optional</span>[<span class="built_in">str</span>]:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        使用 pdfplumber 从 PDF 文件中提取文本。</span></span><br><span class="line"><span class="string">        :param pdf_path: PDF 文件的路径。</span></span><br><span class="line"><span class="string">        :return: 提取的文本作为字符串返回，如果提取失败则返回 None。</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="keyword">with</span> pdfplumber.<span class="built_in">open</span>(pdf_path) <span class="keyword">as</span> pdf:</span><br><span class="line">                text = <span class="string">&#x27;\n&#x27;</span>.join(page.extract_text() <span class="keyword">for</span> page <span class="keyword">in</span> pdf.pages <span class="keyword">if</span> page.extract_text())</span><br><span class="line">            <span class="keyword">return</span> text</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            <span class="comment">#print(f&quot;从 &#123;pdf_path&#125; 提取文本时出错: &#123;e&#125;&quot;)</span></span><br><span class="line">            <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">_extract_invoice_product_content</span>(<span class="params">self, content: <span class="built_in">str</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        从发票文本中提取商品相关内容。</span></span><br><span class="line"><span class="string">        :param content: 发票的完整文本。</span></span><br><span class="line"><span class="string">        :return: 提取的商品相关内容作为字符串返回。</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        lines = content.splitlines()</span><br><span class="line">        start_pattern = re.<span class="built_in">compile</span>(<span class="string">r&quot;^(货物或应税劳务|项目名称)&quot;</span>)</span><br><span class="line">        end_pattern = re.<span class="built_in">compile</span>(<span class="string">r&quot;^价税合计&quot;</span>)</span><br><span class="line"></span><br><span class="line">        start_index = <span class="built_in">next</span>((i <span class="keyword">for</span> i, line <span class="keyword">in</span> <span class="built_in">enumerate</span>(lines) <span class="keyword">if</span> start_pattern.<span class="keyword">match</span>(line)), <span class="literal">None</span>)</span><br><span class="line">        end_index = <span class="built_in">next</span>((i <span class="keyword">for</span> i, line <span class="keyword">in</span> <span class="built_in">enumerate</span>(lines) <span class="keyword">if</span> end_pattern.<span class="keyword">match</span>(line)), <span class="literal">None</span>)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> start_index <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">None</span> <span class="keyword">and</span> end_index <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">None</span>:</span><br><span class="line">            extracted_lines = lines[start_index:end_index + <span class="number">1</span>]</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&#x27;\n&#x27;</span>.join(extracted_lines).strip()</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;未找到匹配的内容&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">construct_invoice_product_data</span>(<span class="params">self, raw_text: <span class="built_in">str</span></span>) -&gt; <span class="type">List</span>[<span class="type">Dict</span>[<span class="built_in">str</span>, <span class="built_in">str</span>]]:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        处理提取的文本，构建发票商品数据列表。</span></span><br><span class="line"><span class="string">        :param raw_text: 提取的原始文本。</span></span><br><span class="line"><span class="string">        :return: 商品数据列表，每个商品为一个字典。</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        blocks = re.split(<span class="string">r&#x27;(?=货物或应税劳务|项目名称)&#x27;</span>, raw_text.strip())</span><br><span class="line">        records = []</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> block <span class="keyword">in</span> blocks:</span><br><span class="line">            lines = [line.strip() <span class="keyword">for</span> line <span class="keyword">in</span> block.splitlines() <span class="keyword">if</span> line.strip()]</span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> lines:</span><br><span class="line">                <span class="keyword">continue</span></span><br><span class="line"></span><br><span class="line">            current_record = <span class="string">&quot;&quot;</span></span><br><span class="line">            <span class="keyword">for</span> line <span class="keyword">in</span> lines[<span class="number">1</span>:]:</span><br><span class="line">                <span class="keyword">if</span> line.startswith(<span class="string">&quot;合&quot;</span>) <span class="keyword">or</span> line.startswith(<span class="string">&quot;价税合计&quot;</span>):</span><br><span class="line">                    <span class="keyword">continue</span></span><br><span class="line"></span><br><span class="line">                <span class="keyword">if</span> line.startswith(<span class="string">&quot;*&quot;</span>):</span><br><span class="line">                    <span class="keyword">if</span> current_record:</span><br><span class="line">                        <span class="variable language_">self</span>._process_record(current_record, records)</span><br><span class="line">                    current_record = line</span><br><span class="line">                <span class="keyword">else</span>:</span><br><span class="line">                    <span class="keyword">if</span> <span class="string">&quot; &quot;</span> <span class="keyword">in</span> current_record:</span><br><span class="line">                        first_space_index = current_record.index(<span class="string">&quot; &quot;</span>)</span><br><span class="line">                        current_record = current_record[:first_space_index] + line + current_record[first_space_index:]</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> current_record:</span><br><span class="line">                <span class="variable language_">self</span>._process_record(current_record, records)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> records</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">_process_record</span>(<span class="params">self, record: <span class="built_in">str</span>, records: <span class="type">List</span>[<span class="type">Dict</span>[<span class="built_in">str</span>, <span class="built_in">str</span>]]</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        处理单条记录并添加到记录列表中。</span></span><br><span class="line"><span class="string">        :param record: 单条记录的字符串。</span></span><br><span class="line"><span class="string">        :param records: 记录列表。</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        parts = record.rsplit(maxsplit=<span class="number">7</span>)</span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">len</span>(parts) == <span class="number">8</span>:</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                records.append(&#123;</span><br><span class="line">                    <span class="string">&quot;product_name&quot;</span>: parts[<span class="number">0</span>].strip(),</span><br><span class="line">                    <span class="string">&quot;specification&quot;</span>: parts[<span class="number">1</span>].strip(),</span><br><span class="line">                    <span class="string">&quot;unit&quot;</span>: parts[<span class="number">2</span>].strip(),</span><br><span class="line">                    <span class="string">&quot;quantity&quot;</span>: parts[<span class="number">3</span>].strip(),</span><br><span class="line">                    <span class="string">&quot;unit_price&quot;</span>: <span class="built_in">float</span>(parts[<span class="number">4</span>].strip()),</span><br><span class="line">                    <span class="string">&quot;amount&quot;</span>: <span class="built_in">float</span>(parts[<span class="number">5</span>].strip()),</span><br><span class="line">                    <span class="string">&quot;tax_rate&quot;</span>: parts[<span class="number">6</span>].strip(),</span><br><span class="line">                    <span class="string">&quot;tax_amount&quot;</span>: <span class="built_in">float</span>(parts[<span class="number">7</span>].strip())</span><br><span class="line">                &#125;)</span><br><span class="line">            <span class="keyword">except</span> ValueError <span class="keyword">as</span> e:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">f&quot;记录解析失败: <span class="subst">&#123;record&#125;</span>, 错误: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">pass</span></span><br></pre></td></tr></table></figure></div><p>最终呢会得到一个字典，包含了发票的商品名、规格、单位、数量、单价、总价、税率以及税额。紧接着，基于这段脚本，再结合fastapi和vue3，就搞了一个拖拽就能获取发票信息、导出出入库单的应用啦:</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="/images/screenshot.jpeg"                                     ></p><p>当然，我现在又不负责报账的工作了，做出来也是造福师弟师妹们，管他们用不用，反正我做出来了</p>]]></content>
    
    
    <summary type="html">单纯是为了方便才弄出来的一个东西，果然懒才是进步最大的推动力</summary>
    
    
    
    <category term="研究生生活" scheme="https://gankun.cn.lu/categories/%E7%A0%94%E7%A9%B6%E7%94%9F%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="python" scheme="https://gankun.cn.lu/tags/python/"/>
    
    <category term="PDF" scheme="https://gankun.cn.lu/tags/PDF/"/>
    
    <category term="pdfplumber" scheme="https://gankun.cn.lu/tags/pdfplumber/"/>
    
    <category term="fastapi" scheme="https://gankun.cn.lu/tags/fastapi/"/>
    
    <category term="vue3" scheme="https://gankun.cn.lu/tags/vue3/"/>
    
  </entry>
  
  <entry>
    <title>自用工具集合</title>
    <link href="https://gankun.cn.lu/posts/2024-11-23e/"/>
    <id>https://gankun.cn.lu/posts/2024-11-23e/</id>
    <published>2024-11-23T04:27:41.533Z</published>
    <updated>2026-04-02T11:31:19.018Z</updated>
    
    <content type="html"><![CDATA[<p>前面不是写了两个工具嘛，一个是将SCI文献的PDF转换为Markdown格式的工具，另一个是将Markdown文件翻译成目标语言的工具。但有个问题，这两个工具是命令行工具，工具本身还放在另一台当作服务器的电脑上，每次使用都要ssh过去，也不方便。</p><p>所以我把这两个工具整合到一个Docker容器中，并且用vue.js写了一个简单的前端页面，方便使用。</p><p>当然，不用Docker也可以，只需要安装Python和Node.js，然后clone这个仓库，安装依赖，配置环境变量，就可以使用了。</p><p>项目我已经放到了GitHub上，地址是<a class="link"   href="https://github.com/Riceneeder/sci_tools" >SCI_TOOLS<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>，欢迎star和fork。</p><p>截图：</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="/images/image.png"                      alt="SCI_TOOLS"                ></p>]]></content>
    
    
    <summary type="html">将之前的两个工具整合到一个Docker容器中，方便使用。</summary>
    
    
    
    <category term="研究生生活" scheme="https://gankun.cn.lu/categories/%E7%A0%94%E7%A9%B6%E7%94%9F%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="Markdown" scheme="https://gankun.cn.lu/tags/Markdown/"/>
    
    <category term="SCI" scheme="https://gankun.cn.lu/tags/SCI/"/>
    
    <category term="Python" scheme="https://gankun.cn.lu/tags/Python/"/>
    
    <category term="OpenAI" scheme="https://gankun.cn.lu/tags/OpenAI/"/>
    
    <category term="translater" scheme="https://gankun.cn.lu/tags/translater/"/>
    
    <category term="Docker" scheme="https://gankun.cn.lu/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>利用OpenAI高质量翻译Markdown文件</title>
    <link href="https://gankun.cn.lu/posts/2024-11-23/"/>
    <id>https://gankun.cn.lu/posts/2024-11-23/</id>
    <published>2024-11-23T04:17:46.831Z</published>
    <updated>2026-04-02T11:31:19.018Z</updated>
    
    <content type="html"><![CDATA[<p>前面不是写了一个将SCI文献的PDF转换为Markdown格式的工具，现在这个工具是为了完善工具链写出来的，转换完就可以马上将文献翻译成中文。</p><p>首先安装依赖</p><div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install openai</span><br></pre></td></tr></table></figure></div><p>业务代码如下：</p><div class="code-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> openai</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">import</span> logging</span><br><span class="line"><span class="keyword">from</span> concurrent.futures <span class="keyword">import</span> ThreadPoolExecutor, as_completed</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置日志记录</span></span><br><span class="line">logging.basicConfig(level=logging.INFO, <span class="built_in">format</span>=<span class="string">&#x27;%(asctime)s - %(levelname)s - %(message)s&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MarkdownTranslator</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, config_file</span>):</span><br><span class="line">        <span class="variable language_">self</span>.config = <span class="variable language_">self</span>.load_config(config_file)</span><br><span class="line">        openai.api_key = <span class="variable language_">self</span>.config.get(<span class="string">&#x27;OPENAI_API_KEY&#x27;</span>)</span><br><span class="line">        openai.base_url = <span class="variable language_">self</span>.config.get(<span class="string">&#x27;OPENAI_API_BASE&#x27;</span>)</span><br><span class="line">        openai.default_headers = &#123;<span class="string">&quot;x-foo&quot;</span>: <span class="string">&quot;true&quot;</span>&#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 从配置文件获取OpenAI API密钥和自定义服务器地址</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">load_config</span>(<span class="params">self, config_file</span>):</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="keyword">with</span> <span class="built_in">open</span>(config_file, <span class="string">&#x27;r&#x27;</span>, encoding=<span class="string">&#x27;utf-8&#x27;</span>) <span class="keyword">as</span> file:</span><br><span class="line">                config = json.load(file)</span><br><span class="line">                <span class="keyword">return</span> config</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            logging.error(<span class="string">f&quot;Error reading config file <span class="subst">&#123;config_file&#125;</span>: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">raise</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 读取Markdown文件</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">read_markdown</span>(<span class="params">self, file_path</span>):</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="keyword">with</span> <span class="built_in">open</span>(file_path, <span class="string">&#x27;r&#x27;</span>, encoding=<span class="string">&#x27;utf-8&#x27;</span>) <span class="keyword">as</span> file:</span><br><span class="line">                <span class="keyword">return</span> file.read()</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            logging.error(<span class="string">f&quot;Error reading file <span class="subst">&#123;file_path&#125;</span>: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">raise</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 将翻译后的内容写入新的Markdown文件</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">write_markdown</span>(<span class="params">self, file_path, content</span>):</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="keyword">with</span> <span class="built_in">open</span>(file_path, <span class="string">&#x27;w&#x27;</span>, encoding=<span class="string">&#x27;utf-8&#x27;</span>) <span class="keyword">as</span> file:</span><br><span class="line">                file.write(content)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            logging.error(<span class="string">f&quot;Error writing file <span class="subst">&#123;file_path&#125;</span>: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">raise</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 翻译函数</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">translate_text</span>(<span class="params">self, text, source_lang=<span class="string">&#x27;en&#x27;</span>, target_lang=<span class="string">&#x27;zh&#x27;</span></span>):</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            response = openai.chat.completions.create(</span><br><span class="line">                model=<span class="string">&quot;gpt-4o-mini&quot;</span>,</span><br><span class="line">                messages=[</span><br><span class="line">                    &#123;</span><br><span class="line">                        <span class="string">&quot;role&quot;</span>: <span class="string">&quot;user&quot;</span>,</span><br><span class="line">                        <span class="string">&quot;content&quot;</span>: <span class="string">f&quot;请将以下<span class="subst">&#123;source_lang&#125;</span>文本翻译成<span class="subst">&#123;target_lang&#125;</span>：\n<span class="subst">&#123;text&#125;</span>&quot;</span></span><br><span class="line">                    &#125;</span><br><span class="line">                ]</span><br><span class="line">            )</span><br><span class="line">            <span class="keyword">return</span> response.choices[<span class="number">0</span>].message.content.strip()</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            logging.error(<span class="string">f&quot;Error translating text: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> text  <span class="comment"># 返回原文以防止翻译失败</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 处理Markdown内容</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">process_markdown_content</span>(<span class="params">self, content, source_lang, target_lang</span>):</span><br><span class="line">        lines = content.split(<span class="string">&#x27;\n&#x27;</span>)</span><br><span class="line">        translated_lines = []</span><br><span class="line"></span><br><span class="line">        <span class="keyword">def</span> <span class="title function_">translate_line</span>(<span class="params">index, line</span>):</span><br><span class="line">            <span class="keyword">if</span> line.strip():  <span class="comment"># 忽略空行</span></span><br><span class="line">                translated_line = <span class="variable language_">self</span>.translate_text(line, source_lang, target_lang)</span><br><span class="line">                translated_lines.append((index, translated_line))</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                translated_lines.append((index, <span class="string">&#x27;&#x27;</span>))  <span class="comment"># 保持空行</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">with</span> ThreadPoolExecutor(max_workers=<span class="number">10</span>) <span class="keyword">as</span> executor:</span><br><span class="line">            futures = [executor.submit(translate_line, i, line) <span class="keyword">for</span> i, line <span class="keyword">in</span> <span class="built_in">enumerate</span>(lines)]</span><br><span class="line">            <span class="keyword">for</span> future <span class="keyword">in</span> as_completed(futures):</span><br><span class="line">                future.result()  <span class="comment"># 等待所有线程完成</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 按原始顺序排序</span></span><br><span class="line">        translated_lines.sort(key=<span class="keyword">lambda</span> x: x[<span class="number">0</span>])</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27;\n&#x27;</span>.join(line <span class="keyword">for</span> _, line <span class="keyword">in</span> translated_lines)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 翻译文件</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">translate_file</span>(<span class="params">self, input_file, output_file, source_lang=<span class="string">&#x27;en&#x27;</span>, target_lang=<span class="string">&#x27;zh&#x27;</span></span>):</span><br><span class="line">        <span class="comment"># 打印参数</span></span><br><span class="line">        logging.info(<span class="string">f&quot;Translating file from <span class="subst">&#123;source_lang&#125;</span> to <span class="subst">&#123;target_lang&#125;</span>...&quot;</span>)</span><br><span class="line">        logging.info(<span class="string">f&quot;OpenAi_key: <span class="subst">&#123;openai.api_key&#125;</span>&quot;</span>)</span><br><span class="line">        logging.info(<span class="string">f&quot;OpenAi_base: <span class="subst">&#123;openai.base_url&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 读取原始Markdown文件</span></span><br><span class="line">        markdown_content = <span class="variable language_">self</span>.read_markdown(input_file)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 处理并翻译内容</span></span><br><span class="line">        translated_content = <span class="variable language_">self</span>.process_markdown_content(markdown_content, source_lang, target_lang)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 写入新Markdown文件</span></span><br><span class="line">        <span class="variable language_">self</span>.write_markdown(output_file, translated_content)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    <span class="comment"># 输入和输出文件路径</span></span><br><span class="line">    input_file_path = <span class="string">&#x27;input.md&#x27;</span>   <span class="comment"># 输入的Markdown文件</span></span><br><span class="line">    output_file_path = <span class="string">&#x27;output.md&#x27;</span>  <span class="comment"># 输出的Markdown文件</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 可选的源语言和目标语言</span></span><br><span class="line">    source_language = <span class="string">&#x27;en&#x27;</span>  <span class="comment"># 源语言（默认为英文）</span></span><br><span class="line">    target_language = <span class="string">&#x27;zh&#x27;</span>  <span class="comment"># 目标语言（默认为中文）</span></span><br><span class="line"></span><br><span class="line">    translator = MarkdownTranslator(<span class="string">&#x27;config.json&#x27;</span>)</span><br><span class="line">    translator.translate_file(input_file_path, output_file_path, source_language, target_language)</span><br></pre></td></tr></table></figure></div><p>config.json文件内容如下：</p><div class="code-container" data-rel="Json"><figure class="iseeu highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;OPENAI_API_KEY&quot;</span><span class="punctuation">:</span> <span class="string">&quot;your_openai_api_key&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;OPENAI_API_BASE&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://api.openai.com&quot;</span> # 可以用满足OpenAI API格式的自定义服务器地址</span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure></div><p>这个工具的使用方法也很简单，只需要指定输入的Markdown文件路径和输出的Markdown文件路径，以及可选的源语言和目标语言，就可以将Markdown文件中的英文内容翻译成中文。</p>]]></content>
    
    
    <summary type="html">前面不是写了一个将SCI文献的PDF转换为Markdown格式的工具，现在这个工具是为了完善工具链写出来的，转换完就可以马上将文献翻译成中文。</summary>
    
    
    
    <category term="研究生生活" scheme="https://gankun.cn.lu/categories/%E7%A0%94%E7%A9%B6%E7%94%9F%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="Markdown" scheme="https://gankun.cn.lu/tags/Markdown/"/>
    
    <category term="SCI" scheme="https://gankun.cn.lu/tags/SCI/"/>
    
    <category term="Python" scheme="https://gankun.cn.lu/tags/Python/"/>
    
    <category term="OpenAI" scheme="https://gankun.cn.lu/tags/OpenAI/"/>
    
    <category term="translater" scheme="https://gankun.cn.lu/tags/translater/"/>
    
  </entry>
  
  <entry>
    <title>使用python将SCI文献PDF转Markdown</title>
    <link href="https://gankun.cn.lu/posts/2024-11-03/"/>
    <id>https://gankun.cn.lu/posts/2024-11-03/</id>
    <published>2024-11-02T08:27:55.442Z</published>
    <updated>2026-04-02T11:31:19.018Z</updated>
    
    <content type="html"><![CDATA[<p>这是之前写文献综述的时候，为了方便整理文献，写了一个小工具，可以将SCI文献的PDF转换为Markdown格式。这样就可以直接在Markdown编辑器中编辑文献，方便整理、翻译和写作。</p><p>具体的代码如下：</p><div class="code-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">from</span> concurrent.futures <span class="keyword">import</span> ThreadPoolExecutor, as_completed</span><br><span class="line"><span class="keyword">import</span> scipdf</span><br><span class="line"><span class="keyword">import</span> string</span><br><span class="line"><span class="keyword">from</span> datetime <span class="keyword">import</span> datetime</span><br><span class="line"></span><br><span class="line"><span class="comment"># 自定义异常，用于处理 GROBID 服务的异常情况</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">GROBID_OFFLINE_EXCEPTION</span>(<span class="title class_ inherited__">Exception</span>):</span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">PDFToMarkdown</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, input_path, grobid_urls=<span class="literal">None</span></span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        初始化 PDFToMarkdown 实例。</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">        Args:</span></span><br><span class="line"><span class="string">            input_path (str): 要处理的文件或文件夹路径。</span></span><br><span class="line"><span class="string">            grobid_urls (list): 可选，GROBID 服务器 URLs 列表。默认为预设的 URLs 列表。</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="variable language_">self</span>.input_path = input_path</span><br><span class="line">        <span class="comment"># 使用自定义 GROBID 服务器，如果没有则使用默认服务器</span></span><br><span class="line">        <span class="variable language_">self</span>.grobid_urls = grobid_urls <span class="keyword">if</span> grobid_urls <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">None</span> <span class="keyword">else</span> [</span><br><span class="line">            <span class="string">&quot;https://qingxu98-grobid.hf.space&quot;</span>,</span><br><span class="line">            <span class="string">&quot;https://qingxu98-grobid2.hf.space&quot;</span>,</span><br><span class="line">            <span class="comment"># ... (其他服务器 URL)</span></span><br><span class="line">            <span class="string">&quot;https://qingxu98-grobid8.hf.space&quot;</span>,</span><br><span class="line">        ]</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_avail_grobid_url</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;获取可用的 GROBID 服务器 URL&quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> <span class="variable language_">self</span>.grobid_urls:</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">while</span> <span class="variable language_">self</span>.grobid_urls:</span><br><span class="line">            _grobid_url = random.choice(<span class="variable language_">self</span>.grobid_urls)  <span class="comment"># 随机选择一个 GROBID URL</span></span><br><span class="line">            <span class="keyword">if</span> _grobid_url.endswith(<span class="string">&#x27;/&#x27;</span>):</span><br><span class="line">                _grobid_url = _grobid_url.rstrip(<span class="string">&#x27;/&#x27;</span>)</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                <span class="comment"># 检查服务器是否在线</span></span><br><span class="line">                res = requests.get(<span class="string">f&quot;<span class="subst">&#123;_grobid_url&#125;</span>/api/isalive&quot;</span>, timeout=<span class="number">5</span>)</span><br><span class="line">                <span class="keyword">if</span> res.text == <span class="string">&#x27;true&#x27;</span>:</span><br><span class="line">                    <span class="keyword">return</span> _grobid_url  <span class="comment"># 返回可用的 URL</span></span><br><span class="line">            <span class="keyword">except</span> (requests.ConnectionError, requests.Timeout):</span><br><span class="line">                <span class="comment"># 如果连接错误或超时，从列表中移除此 URL</span></span><br><span class="line">                <span class="variable language_">self</span>.grobid_urls.remove(_grobid_url)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">None</span>  <span class="comment"># 如果没有可用的服务器，返回 None</span></span><br><span class="line"></span><br><span class="line"><span class="meta">    @staticmethod</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">dict_to_markdown</span>(<span class="params">article_json</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;将文章字典转换为 Markdown 格式字符串&quot;&quot;&quot;</span></span><br><span class="line">        markdown_lines = []</span><br><span class="line">        markdown_lines.append(<span class="string">f&quot;# <span class="subst">&#123;article_json.get(<span class="string">&#x27;title&#x27;</span>, <span class="string">&#x27;无标题&#x27;</span>)&#125;</span> \n&quot;</span>)  <span class="comment"># 标题</span></span><br><span class="line">        markdown_lines.append(<span class="string">f&quot;&gt; doi:<span class="subst">&#123;article_json.get(<span class="string">&#x27;doi&#x27;</span>, <span class="string">&#x27;&#x27;</span>)&#125;</span> \n&quot;</span>)  <span class="comment"># DOI</span></span><br><span class="line">        markdown_lines.append(<span class="string">f&quot;+ authors\n<span class="subst">&#123;article_json.get(<span class="string">&#x27;authors&#x27;</span>, [<span class="string">&#x27;无作者&#x27;</span>])&#125;</span>  \n&quot;</span>)  <span class="comment"># 作者</span></span><br><span class="line">        markdown_lines.append(<span class="string">f&quot;+ abstract\n<span class="subst">&#123;article_json.get(<span class="string">&#x27;abstract&#x27;</span>, <span class="string">&#x27;无摘要&#x27;</span>)&#125;</span>  \n&quot;</span>)  <span class="comment"># 摘要</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 处理各章节内容</span></span><br><span class="line">        <span class="keyword">if</span> <span class="string">&#x27;sections&#x27;</span> <span class="keyword">in</span> article_json:</span><br><span class="line">            <span class="keyword">for</span> section <span class="keyword">in</span> article_json[<span class="string">&#x27;sections&#x27;</span>]:</span><br><span class="line">                markdown_lines.append(<span class="string">f&quot;+ <span class="subst">&#123;section[<span class="string">&#x27;heading&#x27;</span>]&#125;</span>\n<span class="subst">&#123;section[<span class="string">&#x27;text&#x27;</span>]&#125;</span>\n&quot;</span>)  <span class="comment"># 章节标题与内容</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;\n&quot;</span>.join(markdown_lines)  <span class="comment"># 返回合并后的 Markdown 字符串</span></span><br><span class="line"></span><br><span class="line"><span class="meta">    @staticmethod</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">save_markdown_file</span>(<span class="params">filename, content</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;将内容写入到 Markdown 文件&quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(filename, <span class="string">&#x27;w&#x27;</span>, encoding=<span class="string">&#x27;utf-8&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">            f.write(content)  <span class="comment"># 写入内容到文件</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">parse_pdf</span>(<span class="params">self, pdf_path, grobid_url</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;解析单个 PDF 文件，返回文章字典&quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> os.path.isfile(pdf_path):</span><br><span class="line">            <span class="keyword">raise</span> FileNotFoundError(<span class="string">f&quot;指定路径下没有找到 PDF 文件: <span class="subst">&#123;pdf_path&#125;</span>&quot;</span>)  <span class="comment"># 检查文件是否存在</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> grobid_url.endswith(<span class="string">&#x27;/&#x27;</span>):</span><br><span class="line">            grobid_url = grobid_url.rstrip(<span class="string">&#x27;/&#x27;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="comment"># 使用 GROBID 解析 PDF</span></span><br><span class="line">            <span class="keyword">return</span> scipdf.parse_pdf_to_dict(pdf_path, grobid_url=grobid_url)</span><br><span class="line">        <span class="keyword">except</span> GROBID_OFFLINE_EXCEPTION:</span><br><span class="line">            <span class="keyword">raise</span> GROBID_OFFLINE_EXCEPTION(<span class="string">&quot;GROBID 服务不可用，检查配置中的 GROBID_URL。&quot;</span>)</span><br><span class="line">        <span class="keyword">except</span> RuntimeError:</span><br><span class="line">            <span class="keyword">raise</span> RuntimeError(<span class="string">&quot;解析 PDF 失败，请检查 PDF 是否损坏。&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">process_pdf_file</span>(<span class="params">self, pdf_path, grobid_url</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;处理单个 PDF 文件，返回 Markdown 内容&quot;&quot;&quot;</span></span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;正在解析: <span class="subst">&#123;pdf_path&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            pdf_article_dict = <span class="variable language_">self</span>.parse_pdf(pdf_path, grobid_url)  <span class="comment"># 解析 PDF 文件</span></span><br><span class="line">            <span class="keyword">return</span> <span class="variable language_">self</span>.dict_to_markdown(pdf_article_dict)  <span class="comment"># 转换为 Markdown</span></span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;处理文件 <span class="subst">&#123;pdf_path&#125;</span> 时发生错误: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">None</span>  <span class="comment"># 出现错误时返回 None</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">process</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;处理输入文件或文件夹，并返回生成的 Markdown 文件路径&quot;&quot;&quot;</span></span><br><span class="line">        markdown_contents = []  <span class="comment"># 存储所有 Markdown 内容</span></span><br><span class="line">        grobid_url = <span class="variable language_">self</span>.get_avail_grobid_url()</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> grobid_url <span class="keyword">is</span> <span class="literal">None</span>:</span><br><span class="line">            <span class="keyword">raise</span> RuntimeError(<span class="string">&quot;没有可用的 GROBID 服务，请检查您的服务器配置。&quot;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 根据输入路径判断是文件还是文件夹</span></span><br><span class="line">        <span class="keyword">if</span> os.path.isfile(<span class="variable language_">self</span>.input_path):</span><br><span class="line">            pdf_files = [<span class="variable language_">self</span>.input_path]  <span class="comment"># 单个文件</span></span><br><span class="line">        <span class="keyword">elif</span> os.path.isdir(<span class="variable language_">self</span>.input_path):</span><br><span class="line">            <span class="comment"># 收集文件夹中的所有 PDF 文件</span></span><br><span class="line">            pdf_files = [os.path.join(dirpath, filename)</span><br><span class="line">                         <span class="keyword">for</span> dirpath, _, filenames <span class="keyword">in</span> os.walk(<span class="variable language_">self</span>.input_path)</span><br><span class="line">                         <span class="keyword">for</span> filename <span class="keyword">in</span> filenames <span class="keyword">if</span> filename.endswith(<span class="string">&#x27;.pdf&#x27;</span>)]</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">raise</span> ValueError(<span class="string">&quot;输入路径既不是文件也不是文件夹。&quot;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 使用线程池并行处理 PDF 文件</span></span><br><span class="line">        <span class="keyword">with</span> ThreadPoolExecutor(max_workers=<span class="number">5</span>) <span class="keyword">as</span> executor:</span><br><span class="line">            future_to_file = &#123;executor.submit(<span class="variable language_">self</span>.process_pdf_file, pdf, grobid_url): pdf <span class="keyword">for</span> pdf <span class="keyword">in</span> pdf_files&#125;</span><br><span class="line"></span><br><span class="line">            <span class="comment"># 收集生成的 Markdown 内容</span></span><br><span class="line">            <span class="keyword">for</span> future <span class="keyword">in</span> as_completed(future_to_file):</span><br><span class="line">                result = future.result()</span><br><span class="line">                <span class="keyword">if</span> result:</span><br><span class="line">                    markdown_contents.append(result)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 如果有有效的 Markdown 内容，将其保存到文件</span></span><br><span class="line">        <span class="keyword">if</span> markdown_contents:</span><br><span class="line">            <span class="comment"># 生成时间戳</span></span><br><span class="line">            timestamp = datetime.now().strftime(<span class="string">&quot;%Y%m%d_%H%M%S&quot;</span>)</span><br><span class="line">            <span class="comment"># 生成两位随机字母</span></span><br><span class="line">            random_suffix = <span class="string">&#x27;&#x27;</span>.join(random.choices(string.ascii_lowercase, k=<span class="number">2</span>))</span><br><span class="line">            output_filename = <span class="string">f&quot;<span class="subst">&#123;timestamp&#125;</span>_<span class="subst">&#123;random_suffix&#125;</span>.md&quot;</span></span><br><span class="line">            <span class="variable language_">self</span>.save_markdown_file(output_filename, <span class="string">&quot;\n\n&quot;</span>.join(markdown_contents))  <span class="comment"># 合并并保存为 Markdown 文件</span></span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;所有 Markdown 文件已合并并保存为 <span class="subst">&#123;output_filename&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> output_filename  <span class="comment"># 返回生成文件路径</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&quot;没有有效的 Markdown 内容生成。&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 如果直接运行此脚本，提供使用示例</span></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    input_path = <span class="string">&#x27;your_file_or_directory_path&#x27;</span>  <span class="comment"># 替换为你的文件或目录路径</span></span><br><span class="line">    custom_grobid_urls = [</span><br><span class="line">        <span class="string">&quot;https://your-custom-grobid-server.com&quot;</span>,</span><br><span class="line">        <span class="string">&quot;https://another-custom-grobid-server.com&quot;</span>,</span><br><span class="line">    ]</span><br><span class="line">    pdf_to_markdown = PDFToMarkdown(input_path, grobid_urls=custom_grobid_urls)</span><br><span class="line">    output_file = pdf_to_markdown.process()  <span class="comment"># 处理 PDF 文件并生成 Markdown 文件</span></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;生成的文件路径:&quot;</span>, output_file)  <span class="comment"># 输出生成的文件路径</span></span><br></pre></td></tr></table></figure></div><p>注意需要指定安装了以下 Python 库：</p><div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install git+https://github.com/titipata/scipdf_parser</span><br></pre></td></tr></table></figure></div><p>使用时，替换 <code>input_path</code> 为你的文件或目录路径，这个脚本是多线程的，可以处理文件夹中的所有 PDF 文件。如果你有自己的 GROBID 服务器，可以将其添加到 <code>custom_grobid_urls</code> 列表中，否则会使用默认的 GROBID 服务器。最终会生成一个 Markdown 文件，其中包含所有 PDF 文件的内容。</p><p>参考：</p><ul><li><a class="link"   href="https://github.com/titipata/scipdf_parser" >scipdf_parser<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></li><li><a class="link"   href="https://github.com/kermitt2/grobid" >GROBID<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></li><li><a class="link"   href="https://github.com/binary-husky/gpt_academic" >gpt_academic<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></li></ul>]]></content>
    
    
    <summary type="html">这是之前写文献综述的时候，为了方便整理文献，写了一个小工具，可以将SCI文献的PDF转换为Markdown格式。</summary>
    
    
    
    <category term="研究生生活" scheme="https://gankun.cn.lu/categories/%E7%A0%94%E7%A9%B6%E7%94%9F%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="GROBID" scheme="https://gankun.cn.lu/tags/GROBID/"/>
    
    <category term="PDF" scheme="https://gankun.cn.lu/tags/PDF/"/>
    
    <category term="Markdown" scheme="https://gankun.cn.lu/tags/Markdown/"/>
    
    <category term="SCI" scheme="https://gankun.cn.lu/tags/SCI/"/>
    
    <category term="Python" scheme="https://gankun.cn.lu/tags/Python/"/>
    
  </entry>
  
  <entry>
    <title>生物适应区预测中，使用ENMTools进行冗余样点剔除</title>
    <link href="https://gankun.cn.lu/posts/2023-08-30/"/>
    <id>https://gankun.cn.lu/posts/2023-08-30/</id>
    <published>2023-08-29T19:53:44.166Z</published>
    <updated>2026-04-02T11:31:19.018Z</updated>
    
    <content type="html"><![CDATA[<p><strong>ENMTools工具筛选数据原理：</strong></p><p>ENMTools工具可以自动匹配分析所用的环境因子栅格大小，可以删除同一栅格内的冗余数据，而不是基于距离法来删除数据。此方法快捷高效，分析结果更合理，英文期刊多用该方法。通过该方法可以删除下图中的A点或B点（同一栅格内），而C点和D点虽然直线距离小于缓冲区范围，但是不会被勿删。</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="/images/20230830-1.png"                                     ></p><blockquote><p>引用CSDN博主「生信小窝」的说法<br>原文链接：<a class="link"   href="https://blog.csdn.net/weixin_40632177/article/details/111502337" >https://blog.csdn.net/weixin_40632177/article/details/111502337<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p></blockquote><p>网上对于ENMTools这个软件或者R程序包的中文教程挺少，大多是英文文章或者原作者的视频，如果直接使用ENMTools这个软件的话，其实要方便很多，教学视频也容易找到。但使用R的教程却少之又少，我刚开始所使用的代码是B站up和谐小农民给出来的，但存在无法安装ENMTools包或运行过程报错的情况。经过GitHub原项目文档查询和debug，最终修改代码如下：</p><div class="code-container" data-rel="R"><figure class="iseeu highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">install.packages<span class="punctuation">(</span><span class="string">&quot;devtools&quot;</span><span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>devtools<span class="punctuation">)</span></span><br><span class="line">install_github<span class="punctuation">(</span><span class="string">&quot;danlwarren/ENMTools&quot;</span><span class="punctuation">,</span>force <span class="operator">=</span> <span class="literal">TRUE</span><span class="punctuation">)</span> <span class="comment">#可能需要翻墙</span></span><br><span class="line">library<span class="punctuation">(</span>ENMTools<span class="punctuation">)</span></span><br><span class="line">library<span class="punctuation">(</span>terra<span class="punctuation">)</span></span><br><span class="line">worldclim <span class="operator">&lt;-</span> raster<span class="punctuation">(</span><span class="string">&#x27;G:/4.其他/现在_bio_tif/bio_1.tif&#x27;</span><span class="punctuation">)</span> <span class="comment">#这里我使用的自己的文件</span></span><br><span class="line"><span class="comment"># worldclim &lt;- raster::getData(&quot;worldclim&quot;, res = 5,var = &quot;bio&quot;) # 如果自己没有可以使用worldclim提供的数据</span></span><br><span class="line">pts <span class="operator">&lt;-</span> read.csv<span class="punctuation">(</span>file <span class="operator">=</span> <span class="string">&quot;BZ.csv&quot;</span><span class="punctuation">)</span></span><br><span class="line">pts.spat <span class="operator">&lt;-</span> vect<span class="punctuation">(</span>pts<span class="punctuation">,</span>geom<span class="operator">=</span><span class="built_in">c</span><span class="punctuation">(</span><span class="string">&quot;X&quot;</span><span class="punctuation">,</span><span class="string">&quot;Y&quot;</span><span class="punctuation">)</span><span class="punctuation">)</span> <span class="comment">#XY替换成你csv中对应的Longitude,Latitude</span></span><br><span class="line">pa <span class="operator">&lt;-</span> rasterize<span class="punctuation">(</span>as.matrix<span class="punctuation">(</span>crds<span class="punctuation">(</span>pts.spat<span class="punctuation">)</span><span class="punctuation">)</span><span class="punctuation">,</span> worldclim<span class="punctuation">[[</span><span class="number">1</span><span class="punctuation">]</span><span class="punctuation">]</span><span class="punctuation">,</span>fun<span class="operator">=</span><span class="built_in">sum</span><span class="punctuation">)</span></span><br><span class="line">new.points <span class="operator">&lt;-</span> rasterToPoints<span class="punctuation">(</span>pa<span class="punctuation">)</span></span><br><span class="line">write.csv<span class="punctuation">(</span>new.points<span class="punctuation">,</span> file <span class="operator">=</span> <span class="string">&quot;BZ.trim.csv&quot;</span><span class="punctuation">)</span></span><br></pre></td></tr></table></figure></div><p>使用此代码，我将1164个点位减少到了324个，并且没有像使用ENMTools软件出现坐标偏移的情况。</p>]]></content>
    
    
    <summary type="html">在生物适应区预测中，样点的选择是非常重要的，而ENMTools工具可以帮助我们剔除冗余样点，提高预测的准确性</summary>
    
    
    
    <category term="研究生生活" scheme="https://gankun.cn.lu/categories/%E7%A0%94%E7%A9%B6%E7%94%9F%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="课题" scheme="https://gankun.cn.lu/tags/%E8%AF%BE%E9%A2%98/"/>
    
    <category term="maxent" scheme="https://gankun.cn.lu/tags/maxent/"/>
    
    <category term="适应性区划" scheme="https://gankun.cn.lu/tags/%E9%80%82%E5%BA%94%E6%80%A7%E5%8C%BA%E5%88%92/"/>
    
    <category term="ENMTools" scheme="https://gankun.cn.lu/tags/ENMTools/"/>
    
  </entry>
  
  <entry>
    <title>用arcgis和maxent适应性区划中的一些点</title>
    <link href="https://gankun.cn.lu/posts/2023-08-17/"/>
    <id>https://gankun.cn.lu/posts/2023-08-17/</id>
    <published>2023-08-16T19:48:31.889Z</published>
    <updated>2026-04-02T11:31:19.018Z</updated>
    
    <content type="html"><![CDATA[<p>最近的课题有用到这两个软件，其中做maxent的时候需要气象因子，而在worldclim下载的未来生物气象因子只有一张包含19个波段的tif文件，需要手动拆分成19个文件。实在是没有找到用arcgis拆分的方法，所以转向了python</p><p>代码如下：</p><div class="code-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> gdal</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"></span><br><span class="line">input_file = <span class="string">&quot;G:/4.其他/wc2.1_30s_bioc_ACCESS-CM2_ssp126_2041-2060.tif&quot;</span><span class="comment">#下载的tif文件</span></span><br><span class="line">output_folder = <span class="string">&quot;G:/4.其他/feature_bio/&quot;</span><span class="comment">#输出文件夹</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(output_folder):</span><br><span class="line">   os.makedirs(output_folder)</span><br><span class="line"></span><br><span class="line">dataset = gdal.Open(input_file)</span><br><span class="line">num_bands = dataset.RasterCount</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(num_bands):</span><br><span class="line">   band = dataset.GetRasterBand(i + <span class="number">1</span>)</span><br><span class="line">   output_file = os.path.join(output_folder, <span class="string">f&quot;bio_<span class="subst">&#123;i + <span class="number">1</span>&#125;</span>.tif&quot;</span>)</span><br><span class="line">   driver = gdal.GetDriverByName(<span class="string">&quot;GTiff&quot;</span>)</span><br><span class="line">   new_dataset = driver.Create(output_file, dataset.RasterXSize, dataset.RasterYSize, <span class="number">1</span>, gdal.GDT_Float32)</span><br><span class="line">   new_dataset.SetProjection(dataset.GetProjection())</span><br><span class="line">   new_dataset.SetGeoTransform(dataset.GetGeoTransform())</span><br><span class="line">   new_dataset.GetRasterBand(<span class="number">1</span>).WriteArray(band.ReadAsArray())</span><br><span class="line">   <span class="built_in">print</span>(<span class="string">f&quot;Creating <span class="subst">&#123;output_file&#125;</span>...&quot;</span>)</span><br><span class="line">   new_dataset.FlushCache()</span><br><span class="line">   new_dataset = <span class="literal">None</span></span><br><span class="line"></span><br><span class="line">dataset = <span class="literal">None</span></span><br></pre></td></tr></table></figure></div><p>但是有个问题，安装gdal的时候大概率会报错，具体原因我也没查到。网上的推荐办法是使用conda：</p><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda install gdal</span><br></pre></td></tr></table></figure></div><p>实际情况可能会出现无法安装或者安装了没法调用，解决办法：</p><ol><li>如果安装失败：<br>到Github仓库下载对应的.whl文件，比如python 3.11就下载GDAL-3.7.1-cp311-cp311-win_amd64.whl<br>，然后手动安装<code>pip install GDAL-3.7.1-cp311-cp311-win_amd64.whl</code></li><li>如果无法调用：<br>在python安装各种环境包的文件夹下，如：<code>D:Path\To\python3.9.12\Lib\site-packages\</code>文件夹下，新建gdal.py文件，将以下代码复制进去：</li></ol><div class="code-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># import osgeo.gdal as a convenience</span></span><br><span class="line"><span class="keyword">from</span> osgeo.gdal <span class="keyword">import</span> deprecation_warn</span><br><span class="line">deprecation_warn(<span class="string">&#x27;gdal&#x27;</span>)</span><br><span class="line"><span class="keyword">from</span> osgeo.gdal <span class="keyword">import</span> *</span><br></pre></td></tr></table></figure></div>]]></content>
    
    
    <summary type="html">最近的课题有用到这两个软件，其中做maxent的时候需要气象因子，而在worldclim下载的未来生物气象因子只有一张包含19个波段的tif文件，需要手动拆分成19个文件。实在是没有找到用arcgis拆分的方法，所以转向了python</summary>
    
    
    
    <category term="研究生生活" scheme="https://gankun.cn.lu/categories/%E7%A0%94%E7%A9%B6%E7%94%9F%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="课题" scheme="https://gankun.cn.lu/tags/%E8%AF%BE%E9%A2%98/"/>
    
    <category term="python" scheme="https://gankun.cn.lu/tags/python/"/>
    
    <category term="arcgis" scheme="https://gankun.cn.lu/tags/arcgis/"/>
    
    <category term="maxent" scheme="https://gankun.cn.lu/tags/maxent/"/>
    
    <category term="适应性区划" scheme="https://gankun.cn.lu/tags/%E9%80%82%E5%BA%94%E6%80%A7%E5%8C%BA%E5%88%92/"/>
    
  </entry>
  
  <entry>
    <title>小工具分享</title>
    <link href="https://gankun.cn.lu/posts/2023-08-11/"/>
    <id>https://gankun.cn.lu/posts/2023-08-11/</id>
    <published>2023-08-10T19:56:18.848Z</published>
    <updated>2026-04-02T11:31:19.018Z</updated>
    
    <content type="html"><![CDATA[<p>使用前需要对标本数据做一定的预处理，使标本数据为以下格式的json文件：</p><div class="code-container" data-rel="Json"><figure class="iseeu highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;NO&quot;</span><span class="punctuation">:</span> <span class="string">&quot;50&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;CNname&quot;</span><span class="punctuation">:</span> <span class="string">&quot;白芷&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;LDname&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Angelica dahurica&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;Province&quot;</span><span class="punctuation">:</span> <span class="string">&quot;北京市&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;Local&quot;</span><span class="punctuation">:</span> <span class="string">&quot;百花山&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;NO&quot;</span><span class="punctuation">:</span> <span class="string">&quot;51&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;CNname&quot;</span><span class="punctuation">:</span> <span class="string">&quot;白芷&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;LDname&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Angelica dahurica&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;Province&quot;</span><span class="punctuation">:</span> <span class="string">&quot;北京市&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;Local&quot;</span><span class="punctuation">:</span> <span class="string">&quot;百花山&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;NO&quot;</span><span class="punctuation">:</span> <span class="string">&quot;52&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;CNname&quot;</span><span class="punctuation">:</span> <span class="string">&quot;白芷&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;LDname&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Angelica dahurica&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;Province&quot;</span><span class="punctuation">:</span> <span class="string">&quot;北京市&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;Local&quot;</span><span class="punctuation">:</span> <span class="string">&quot;百花山&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    ……</span><br><span class="line"><span class="punctuation">]</span></span><br></pre></td></tr></table></figure></div><p>工具是用typescript编写的，所以需要nodejs环境并安装typescript，相关知识网上查询，具体代码如下：</p><div class="code-container" data-rel="Typescript"><figure class="iseeu highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> axios <span class="keyword">from</span> <span class="string">&#x27;axios&#x27;</span></span><br><span class="line"><span class="keyword">import</span> fs <span class="keyword">from</span> <span class="string">&#x27;fs&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">interface</span> eachData &#123;</span><br><span class="line">  <span class="attr">NO</span>: <span class="built_in">string</span></span><br><span class="line">  <span class="title class_">CNname</span>: <span class="built_in">string</span></span><br><span class="line">  <span class="title class_">LDname</span>: <span class="built_in">string</span></span><br><span class="line">  <span class="title class_">Province</span>: <span class="built_in">string</span></span><br><span class="line">  <span class="title class_">Local</span>: <span class="built_in">string</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">type</span> <span class="title class_">AllJsonData</span> = eachData[]</span><br><span class="line"><span class="keyword">interface</span> <span class="title class_">BaiduResult</span> &#123;</span><br><span class="line">  <span class="attr">status</span>: <span class="built_in">number</span></span><br><span class="line">  <span class="attr">result</span>: &#123;</span><br><span class="line">    <span class="attr">location</span>: &#123;</span><br><span class="line">      <span class="attr">lng</span>: <span class="built_in">number</span></span><br><span class="line">      <span class="attr">lat</span>: <span class="built_in">number</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="attr">precise</span>: <span class="built_in">number</span></span><br><span class="line">    <span class="attr">confidence</span>: <span class="built_in">number</span></span><br><span class="line">    <span class="attr">comprehension</span>: <span class="built_in">number</span></span><br><span class="line">    <span class="attr">level</span>: <span class="built_in">string</span></span><br><span class="line">    <span class="attr">analys_level</span>: <span class="built_in">string</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">interface</span> <span class="title class_">AllResult</span> &#123;</span><br><span class="line">  <span class="attr">NO</span>: <span class="built_in">string</span></span><br><span class="line">  <span class="attr">lng</span>: <span class="built_in">number</span></span><br><span class="line">  <span class="attr">lat</span>: <span class="built_in">number</span></span><br><span class="line">  <span class="attr">comprehension</span>: <span class="built_in">number</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">Sleep</span> = (<span class="params"><span class="attr">ms</span>: <span class="built_in">number</span></span>) =&gt; &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Promise</span>(<span class="function">(<span class="params">resolve</span>) =&gt;</span> <span class="built_in">setTimeout</span>(resolve, ms))</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="attr">jsonData</span>: <span class="title class_">AllJsonData</span> = <span class="built_in">require</span>(<span class="string">&#x27;./白芷样点数据-NSII.json&#x27;</span>) <span class="comment">//这里填写你的数据json路径</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">LocationRequest</span> &#123;</span><br><span class="line">  <span class="title function_">constructor</span>(<span class="params"><span class="title class_">AllJsonData</span>: <span class="title class_">AllJsonData</span></span>) &#123;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">DataSet</span> = <span class="title class_">AllJsonData</span></span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">private</span> <span class="keyword">static</span> <span class="title class_">BaiduAPIKey</span> = <span class="string">&#x27;baiduapikey&#x27;</span> <span class="comment">//这里填写自己申请的百度地图apikey，申请方法可网上查询</span></span><br><span class="line">  <span class="keyword">private</span> <span class="keyword">static</span> <span class="title class_">Url</span> = <span class="string">&#x27;https://api.map.baidu.com/geocoding/v3/&#x27;</span></span><br><span class="line">  <span class="title class_">DataSet</span>: <span class="title class_">AllJsonData</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">async</span> <span class="title class_">GetLocationOnce</span>(<span class="title class_">Local</span>: <span class="built_in">string</span>, <span class="title class_">Province</span>: <span class="built_in">string</span>): <span class="title class_">Promise</span>&lt;<span class="title class_">BaiduResult</span>&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> &#123; data &#125; = <span class="keyword">await</span> axios.<span class="title function_">get</span>(</span><br><span class="line">      <span class="title class_">LocationRequest</span>.<span class="property">Url</span> +</span><br><span class="line">        <span class="string">&#x27;?output=json&amp;ak=&#x27;</span> +</span><br><span class="line">        <span class="title class_">LocationRequest</span>.<span class="property">BaiduAPIKey</span> +</span><br><span class="line">        <span class="string">&#x27;&amp;address=&#x27;</span> +</span><br><span class="line">        <span class="title class_">Local</span> +</span><br><span class="line">        <span class="string">&#x27;&amp;city=&#x27;</span> +</span><br><span class="line">        <span class="title class_">Province</span> +</span><br><span class="line">        <span class="string">&#x27;&amp;extension_analys_level=1&#x27;</span>,</span><br><span class="line">    )</span><br><span class="line">    <span class="keyword">return</span> data <span class="keyword">as</span> <span class="title class_">BaiduResult</span></span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">async</span> <span class="title class_">GetAllLocation</span>(): <span class="title class_">Promise</span>&lt;<span class="title class_">AllResult</span>[]&gt; &#123;</span><br><span class="line">    <span class="keyword">let</span> <span class="attr">allResult</span>: <span class="title class_">AllResult</span>[] = []</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; <span class="variable language_">this</span>.<span class="property">DataSet</span>.<span class="property">length</span>; i++) &#123;</span><br><span class="line">      <span class="keyword">if</span> (<span class="variable language_">this</span>.<span class="property">DataSet</span>[i].<span class="property">Province</span> != <span class="string">&#x27;0未记录&#x27;</span> &amp;&amp; <span class="variable language_">this</span>.<span class="property">DataSet</span>[i].<span class="property">Local</span> != <span class="string">&#x27;0未记录&#x27;</span>) &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">          <span class="keyword">const</span> data = <span class="keyword">await</span> <span class="variable language_">this</span>.<span class="title class_">GetLocationOnce</span>(<span class="variable language_">this</span>.<span class="property">DataSet</span>[i].<span class="property">Local</span>, <span class="variable language_">this</span>.<span class="property">DataSet</span>[i].<span class="property">Province</span>)</span><br><span class="line">          <span class="variable language_">console</span>.<span class="title function_">log</span>(</span><br><span class="line">            <span class="string">`<span class="subst">$&#123;<span class="variable language_">this</span>.DataSet[i].NO&#125;</span>：经纬度为:<span class="subst">$&#123;data.result.location.lat&#125;</span>,<span class="subst">$&#123;data.result.location.lng&#125;</span>,可解析度为:<span class="subst">$&#123;data.result.comprehension&#125;</span>`</span>,</span><br><span class="line">          )</span><br><span class="line">          allResult.<span class="title function_">push</span>(&#123;</span><br><span class="line">            <span class="attr">NO</span>: <span class="variable language_">this</span>.<span class="property">DataSet</span>[i].<span class="property">NO</span>,</span><br><span class="line">            <span class="attr">lng</span>: data.<span class="property">result</span>.<span class="property">location</span>.<span class="property">lng</span>,</span><br><span class="line">            <span class="attr">lat</span>: data.<span class="property">result</span>.<span class="property">location</span>.<span class="property">lat</span>,</span><br><span class="line">            <span class="attr">comprehension</span>: data.<span class="property">result</span>.<span class="property">comprehension</span>,</span><br><span class="line">          &#125;)</span><br><span class="line">        &#125; <span class="keyword">catch</span> (error) &#123;</span><br><span class="line">          <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`<span class="subst">$&#123;<span class="variable language_">this</span>.DataSet[i].NO&#125;</span>的经纬度获取失败!\n<span class="subst">$&#123;error&#125;</span>`</span>)</span><br><span class="line">          allResult.<span class="title function_">push</span>(&#123;</span><br><span class="line">            <span class="attr">NO</span>: <span class="variable language_">this</span>.<span class="property">DataSet</span>[i].<span class="property">NO</span>,</span><br><span class="line">            <span class="attr">lng</span>: <span class="number">0</span>,</span><br><span class="line">            <span class="attr">lat</span>: <span class="number">0</span>,</span><br><span class="line">            <span class="attr">comprehension</span>: <span class="number">0</span>,</span><br><span class="line">          &#125;)</span><br><span class="line">        &#125;</span><br><span class="line">      &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`<span class="subst">$&#123;<span class="variable language_">this</span>.DataSet[i].NO&#125;</span>未记录省市或区!`</span>)</span><br><span class="line">        allResult.<span class="title function_">push</span>(&#123;</span><br><span class="line">          <span class="attr">NO</span>: <span class="variable language_">this</span>.<span class="property">DataSet</span>[i].<span class="property">NO</span>,</span><br><span class="line">          <span class="attr">lng</span>: <span class="number">0</span>,</span><br><span class="line">          <span class="attr">lat</span>: <span class="number">0</span>,</span><br><span class="line">          <span class="attr">comprehension</span>: <span class="number">0</span>,</span><br><span class="line">        &#125;)</span><br><span class="line">      &#125;</span><br><span class="line">      <span class="keyword">await</span> <span class="title class_">Sleep</span>(<span class="number">2000</span>)</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> allResult</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">main</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> data = <span class="keyword">await</span> <span class="keyword">new</span> <span class="title class_">LocationRequest</span>(jsonData).<span class="title class_">GetAllLocation</span>()</span><br><span class="line">  <span class="keyword">try</span> &#123;</span><br><span class="line">    fs.<span class="title function_">writeFileSync</span>(<span class="string">&#x27;./白芷样点经纬度.json&#x27;</span>, <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(data)) <span class="comment">//这里填写你想结果输出的位置的路径</span></span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;写入成功!&#x27;</span>)</span><br><span class="line">  &#125; <span class="keyword">catch</span> (error) &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(error)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="title function_">main</span>()</span><br></pre></td></tr></table></figure></div><p>成功运行后会输出一个json文件，内容格式如下：</p><div class="code-container" data-rel="Json"><figure class="iseeu highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;NO&quot;</span><span class="punctuation">:</span> <span class="string">&quot;29&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;lng&quot;</span><span class="punctuation">:</span> <span class="number">115.7844632112745</span><span class="punctuation">,</span>   <span class="comment">//经度</span></span><br><span class="line">        <span class="attr">&quot;lat&quot;</span><span class="punctuation">:</span> <span class="number">33.850642695788835</span><span class="punctuation">,</span>  <span class="comment">//纬度</span></span><br><span class="line">        <span class="attr">&quot;comprehension&quot;</span><span class="punctuation">:</span> <span class="number">100</span>          <span class="comment">//可信度</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;NO&quot;</span><span class="punctuation">:</span> <span class="string">&quot;30&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;lng&quot;</span><span class="punctuation">:</span> <span class="number">115.7844632112745</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;lat&quot;</span><span class="punctuation">:</span> <span class="number">33.850642695788835</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;comprehension&quot;</span><span class="punctuation">:</span> <span class="number">100</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;NO&quot;</span><span class="punctuation">:</span> <span class="string">&quot;31&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;lng&quot;</span><span class="punctuation">:</span> <span class="number">115.7844632112745</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;lat&quot;</span><span class="punctuation">:</span> <span class="number">33.850642695788835</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;comprehension&quot;</span><span class="punctuation">:</span> <span class="number">100</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    ……</span><br><span class="line"><span class="punctuation">]</span></span><br></pre></td></tr></table></figure></div><p>这个课题结束后可能会把这个工具用python重构并整合到我自己的工具脚本里吧</p>]]></content>
    
    
    <summary type="html">这个小工具是在做数据处理期间，为了减少自己的工作量临时编写的。主要利用百度地图api对从NSII网站上获取的标本数据批量查询经纬度</summary>
    
    
    
    <category term="研究生生活" scheme="https://gankun.cn.lu/categories/%E7%A0%94%E7%A9%B6%E7%94%9F%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="typescript" scheme="https://gankun.cn.lu/tags/typescript/"/>
    
    <category term="javascript" scheme="https://gankun.cn.lu/tags/javascript/"/>
    
    <category term="工具" scheme="https://gankun.cn.lu/tags/%E5%B7%A5%E5%85%B7/"/>
    
    <category term="课题" scheme="https://gankun.cn.lu/tags/%E8%AF%BE%E9%A2%98/"/>
    
  </entry>
  
  <entry>
    <title>成都中医药大学“千种本草基因组计划”发布会成功举办</title>
    <link href="https://gankun.cn.lu/posts/2022-07-02/"/>
    <id>https://gankun.cn.lu/posts/2022-07-02/</id>
    <published>2022-07-02T13:30:20.000Z</published>
    <updated>2026-04-02T11:31:19.018Z</updated>
    
    <content type="html"><![CDATA[<p>7月2日上午，成都中医药大学“千种本草基因组计划”发布会暨研究联盟成立仪式在学校博物馆举行。中国中医科学院名誉院长、中国工程院院士、医药卫生学部主任张伯礼，四川省人大常务委员会副主任何延政，成都中医药大学校长余曙光出席会议并致辞，国家药品监督管理局副局长赵军宁向大会致贺信。来自全国 60余家单位领导和专家出席发布会，线上参会人数达9000人。会议由成都中医药大学副校长彭成主持。</p><!--more--><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://www.cdutcm.edu.cn/Upload/main/ContentManage/Article/image/2022/07/02/549dd36554d84ee3ad3383d2c1dd65d9.jpg"                                     ></p><blockquote><p>本计划的意义</p></blockquote><p>本草基因组学通过解读传统药物的生物学机制，提出在获取基因组和基因进传信息的基础上，通过对基因功能的研究和开发来解决中药研究中面临的一系列难题，其中包括建立用于次生代谢产物生物合成及其调控研究的药用模式生物体系，通过合成生物学生产重要的天然药物或新药原料，利用基因组辅助有种培有中草药优良品种，开发用于鉴别中药材混伤品的分子标记，揭示药材道地性的生物学本质，建立本草数据库保护珍贵的药用植物基因资源，以及研究人类基因组遗传多态性和肠道微生物的多样性对中药体内代谢和药效影响等方面产生深远的影响。<br><img                       lazyload                     src="/images/loading.svg"                     data-src="https://www.cdutcm.edu.cn/Upload/main/ContentManage/Article/image/2022/07/02/0b1dd1b9d23e4e79bd67ee2f3e11b31e.jpg"                      alt="张伯礼院士"                ></p><h2 id="1-本草基因组学将开展多种药用植物遗传密码的解析，是濒危本草保育及物种多样性延续的基础"><a href="#1-本草基因组学将开展多种药用植物遗传密码的解析，是濒危本草保育及物种多样性延续的基础" class="headerlink" title="1.本草基因组学将开展多种药用植物遗传密码的解析，是濒危本草保育及物种多样性延续的基础"></a>1.本草基因组学将开展多种药用植物遗传密码的解析，是濒危本草保育及物种多样性延续的基础</h2><p>近年来，随着中药产业的快速发展，国内外对中药资源的需求量急剧增加，不合理的采挖野生资源现象屡见不鲜，加速了药用植物遗传资源多样性的消失，资源灭绝的风险越来越大。同时，大多数栽培的药用植物多采用无性繁殖手段就行繁衍，长期无性繁殖伴随的种质资源退化也对中药的品质及适应性造成了严重的影响。</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://www.cdutcm.edu.cn/Upload/main/ContentManage/Article/image/2022/07/02/c26368bb45b445f08399c944e80a3c6d.jpg"                      alt="余曙光校长"                ></p><p>通过开展本草基因组研究，结合药用植物重要次生代谢产物含量、抗病、抗逆等优良性状的研究，从遗传机制上解析优良性状的成因，为“优质、优形”新品种选育提供了基础。同时，结合广泛种质资源收集，结合药用植物遗传多样性研究，制定濒危药用植物就地及迁地保护体系，提供科学的濒危本草保育及物种多样性策略。</p><h2 id="2-通过药用植物有效成分的合成及其调控研究，建立药用模式植物库"><a href="#2-通过药用植物有效成分的合成及其调控研究，建立药用模式植物库" class="headerlink" title="2.通过药用植物有效成分的合成及其调控研究，建立药用模式植物库"></a>2.通过药用植物有效成分的合成及其调控研究，建立药用模式植物库</h2><p>模式生物在当今生命科学和医学研究中发挥着重要作用，而缺少成熟的模式生物研究体系是药用生物研究与其他生物学领域相比还相对落后的一个重要原因。建立药用模式植物能极大地推动药用植物的生长发育、生理生化、抗病抗逆和分子有种等领域的发展。在本草基因组学研究的推动下，灵芝、丹参和长春花等一批药用模式生物研究体系正在建立之中。将科研力量集中于少数药用模式生物，优先阐明次生代谢产物合成的普遍规律，并在其他药用生物中进行推广和验证，可以有效提升药用生物基础研究水平。模式药用植物突变体库的建立和基因功能研究。模式药用植物全基因组序列的测定和大规模突变体库的建立，将为药用植物研究提供丰富的资源和材料，并极大地推动药用植物功能基因，尤其是次生代谢相关基因的发掘进程。</p><p>本草基因组计划将会推动转录组学、蛋白组学和代谢组学等“组学”方法，在药用植物次生代谢途径和次生代谢调控研究中的应用，为次生代谢相关基因的“批量化”发掘奠定基础。研究成果将会对次生代谢产物的生物合成及代谢工程、高药效成分种质资源的选育等应用领域产生直接影响。</p><h2 id="3-破译中药的遗传信息，揭示中药作用机理及其道地性形成机制"><a href="#3-破译中药的遗传信息，揭示中药作用机理及其道地性形成机制" class="headerlink" title="3.破译中药的遗传信息，揭示中药作用机理及其道地性形成机制"></a>3.破译中药的遗传信息，揭示中药作用机理及其道地性形成机制</h2><p>近年，学者对中药道地性的研究越来越深入，分子及基因组学层次的研究也逐渐成为了一个热点。药材不同基原植物和种质资源遗传多样性的差异，以及生长发育依据不同的环境及气候条件，产生差异化的成分积累，进而对中药道地性的形成、变迁产生重要影响。</p><p>通过基因组或转录组的序列信息，开发出海量的简单重复序列(SSR)和单核甘酸多态性(SNP)等分子标记，找出药材不同基原植物和差异化种质资源的特定基因或DNA序列后，即可将特异性基因或DNA序列作为标志物用于其鉴定。本草基因组研究团队陈士林教授在国际上创建了基于ITS2的中草药DNA条形码鉴定方法体系，完成专著《中国药典中药材DNA条形码标准序列》，从基因层面解决中草药物种真伪鉴定的难题。</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://www.cdutcm.edu.cn/Upload/main/ContentManage/Article/image/2022/07/02/bded6a48553e4b0b910ee35470743703.jpg"                      alt="“千种本草基因组计划”学术交流会"                ></p><p>本草基因组学研究产生的序列信息库为开发药材分子标记提供了丰富基因资源，为揭示中药药效的物质基础和可能道地性形成机制提供了有效支撑。</p><h2 id="4-本草基因组的实施，是中医药现代化的必由之路"><a href="#4-本草基因组的实施，是中医药现代化的必由之路" class="headerlink" title="4.本草基因组的实施，是中医药现代化的必由之路"></a>4.本草基因组的实施，是中医药现代化的必由之路</h2><p>过去四五十年的时间里，中药的诸多研究成果得益于通过化学方式研究其毒理及药理。其中，标志性成果即中国中医科学院中药研究所屠呦呦研究员团队从青蒿中分离纯化出具有良好抗疟疾活性的青蒿素。</p><p>现阶段，“本草基因组计划”为中草药的研究打开了另一扇窗。该计划的研究成果将为阐明药用植物有效成分的合成和调控奠定基础，进而促进植物类药物的筛选和生物合成研究，同时该计划还将加速药用植物优良品种的选育并促进绿色中药农业的科学化和规模化发展。随着测序技术的逐步成熟和新的测序技术的出现，相信将有更多的药用植物物种被纳入到本草基因组计划中。</p><hr><p>总之，中医药的现代化，急需引进当代最先进的技术和方法，而中药基因组学应是其中重要的一种。习近平总书记强调“把科技的命脉牢牢掌握在自己手中”。我们应该抓住机遇，积极行动，扎扎实实地促进中医药的现代化。“千种本草基因组计划”这一计划及研究联盟的成功建立，将增强我国中药基础研究实力、提高我国中药研究的自主创新能力，促进中草药基因资源的保护和利用，对加速中草药现代化进程具有重大的战略性科学意义，将使中草药生物学研究从分子理化研究水平，全面推进到更高的基因组学时代！</p>]]></content>
    
    
    <summary type="html">7月2日上午，成都中医药大学“千种本草基因组计划”发布会暨研究联盟成立仪式在学校博物馆举行。中国中医科学院名誉院长、中国工程院院士、医药卫生学部主任张伯礼，四川省人大常务委员会副主任何延政，成都中医药大学校长余曙光出席会议并致辞，国家药品监督管理局副局长赵军宁向大会致贺信。来自全国 60余家单位领导和专家出席发布会，线上参会人数达9000人。会议由成都中医药大学副校长彭成主持。</summary>
    
    
    
    <category term="科研助理" scheme="https://gankun.cn.lu/categories/%E7%A7%91%E7%A0%94%E5%8A%A9%E7%90%86/"/>
    
    
    <category term="中医药" scheme="https://gankun.cn.lu/tags/%E4%B8%AD%E5%8C%BB%E8%8D%AF/"/>
    
    <category term="中药" scheme="https://gankun.cn.lu/tags/%E4%B8%AD%E8%8D%AF/"/>
    
    <category term="成都中医药大学" scheme="https://gankun.cn.lu/tags/%E6%88%90%E9%83%BD%E4%B8%AD%E5%8C%BB%E8%8D%AF%E5%A4%A7%E5%AD%A6/"/>
    
    <category term="千种本草基因组计划" scheme="https://gankun.cn.lu/tags/%E5%8D%83%E7%A7%8D%E6%9C%AC%E8%8D%89%E5%9F%BA%E5%9B%A0%E7%BB%84%E8%AE%A1%E5%88%92/"/>
    
  </entry>
  
  <entry>
    <title>对中药“毒”的理解</title>
    <link href="https://gankun.cn.lu/posts/2021-09-26/"/>
    <id>https://gankun.cn.lu/posts/2021-09-26/</id>
    <published>2021-09-26T07:51:23.000Z</published>
    <updated>2026-04-02T11:31:19.018Z</updated>
    
    <content type="html"><![CDATA[<h3 id="1-中药的“毒”是否真的毒"><a href="#1-中药的“毒”是否真的毒" class="headerlink" title="1.中药的“毒”是否真的毒"></a>1.<strong>中药的“毒”是否真的毒</strong></h3><p>在中医理论中，中药都具有偏性，寒热温凉均为中药的偏性，中医讲究”热病寒治，寒病热治，堵则泻，散则固“等，对什么症就应当用对应的药物，如果对于热症使用温热的药，那在大部分情况下这和服用毒药是没有区别的，不能指望一加一等于零。</p><p>中药毒的含义应当分为三种：1.传统意义上的毒：指的应当是药物药性的峻猛程度，所以也有分”大毒“，”有毒“，”小毒“，”无毒“；2.中医理论上的毒：指的应当是药物治疗疾病的能力，所有的具有治疗意义的药物都能称为毒，《景岳全书》曰：”凡可辟邪安正者，均可称为毒药“，明代名医张景岳认为：“药以治病，因毒为能”；3.在现代研究下的毒：指的是安全剂量小，用药稍微超过常量，就会对人体造成危害，甚至致死的药物或提取物。中医历来推崇“以毒攻毒”理论，第一个“毒”应当是指强力的药物，而不是指的狭义的对机体有危害的药物。</p><p>中药的许多毒性成分反而是治疗疾病的有效成分，已故全国名老中医李可善用附子，有毒的附子成了救命药。他认为，“附子为强心主将，其毒性正是起死回生药救之所在。”一名65岁男性患者，心肌扩大，不能平卧，呼吸难以接续，面色灰暗，手冷过肘，足冷过膝，汗出如油，舌红光无苔，脉浮虚大而数（260次&#x2F;分），血压已测不出，气息奄奄，危在旦夕。李可连开三剂药：第一剂药中附子200克，病势未转；二剂时附子加至400克，稍稳定；第三剂附子加至500克，病势开始趋缓，四肢转温，脉亦变缓（90次&#x2F;分），血压160&#x2F;70毫米汞柱，调理1周后出院。</p><h3 id="2-抛开剂量谈毒性都是“耍流氓”"><a href="#2-抛开剂量谈毒性都是“耍流氓”" class="headerlink" title="2.抛开剂量谈毒性都是“耍流氓”"></a>2.<strong>抛开剂量谈毒性都是“耍流氓”</strong></h3><p>无论现代医学化药还是传统中药亦或是现代中药，在临床用药均有用药指导和药物剂量管控，例如我国由国家编撰的药品规范法典《中国药典》，上面详细地记载了各种药物的用药标准。并且，毒性的中药不会单独使用，而是与其他味药配伍，保证复方药在发挥总体疗效的同时，将其中单味药可能产生的毒性降到最低。在用药时，合理久煎、减毒存效，是诸多医家应用有毒中药的可靠经验。经较长时间煎煮，有毒成分被挥发或水解而减低，有效成分仍可保留发挥治疗效用。比如乌头附子在浸泡或煎煮后，其含有的有效且有毒的成分双酯型生物碱水解为毒性小的单酯型生物碱或者水解为几乎无毒的醇胺型生物碱，从而保留药效并消减毒性。不仅是煎煮，中药经过炮制、配伍等都可以达到减小或消去毒性，增加疗效的效果</p><p>重要的是，无论是有毒还是无毒的中药应用要从小剂量开始，逐渐加大剂量，并且中病即止，不可过服。大部分的因服用中药造成机体损伤的事件都是因为过量服用中药造成的。</p><h3 id="3-正视中药的“毒”"><a href="#3-正视中药的“毒”" class="headerlink" title="3.正视中药的“毒”"></a>3.<strong>正视中药的“毒”</strong></h3><p>随着现代医学的兴起，药理逐渐被重视起来，而中药更多是的凭经验用药，药理研究是短板，这也使中医药饱受诟病，并成为反中医人士的主要攻击点。中药的毒有时是无效成分，有时却是恰好起作用的成分，例如剧毒的砒霜，哈尔滨医科大学的张亭栋教授正是通过研究和利用砒霜（三氧化二砷）的“毒性”，成为了我国利用砒霜治疗白血病的奠基人，并因此荣获多项大奖。对于中药应当建立一种毒的观念，安全用药的态度，不能因为中药有大毒而追求安全将用药剂量降至有效量以下，导致病情恶化。重视并大力中药毒理学的研究，是中医药走向安全、国际化的不可缺少的道路之一。</p><blockquote><p>参考文献：</p><ol><li>赵军宁 and 叶祖光. “传统中药毒性分级理论的科学内涵与《中国药典》（一部）标注修订建议.” (2012).</li><li>张帅男, 李煦照, 卢芳, &amp; 刘树民 (2015). 中药毒性研究的新方向“：无毒”药物潜在毒性的发现.</li><li>陈士奎 (2017). 我国开创的中西医结合科研及其启示（九）——张亭栋教授等与中药砒霜治疗急性早幼粒细胞白血病的中西医结合研究.</li></ol></blockquote>]]></content>
    
    
    <summary type="html">随着时代的发展，人们已经进入了快速的碎片化信息浏览时代，伴着比利时中药减肥事件、马兜铃酸事件，网上逐渐出现了“中医黑”等一批对中医药抱有偏见的人群，使中药的安全性备受质疑。这是不可避免的，相比较现代医学的化学药品，中药的毒理机理并不完全清晰，在部分未系统学习中医中药的人群中存在认为“中医是骗子，中药吃了就会出问题“的现象是正常的。所以解释中药的“毒”含义是解开社会舆论路途之一</summary>
    
    
    
    <category term="文章" scheme="https://gankun.cn.lu/categories/%E6%96%87%E7%AB%A0/"/>
    
    
    <category term="中药学" scheme="https://gankun.cn.lu/tags/%E4%B8%AD%E8%8D%AF%E5%AD%A6/"/>
    
  </entry>
  
  <entry>
    <title>中医药抗呼吸道感染的应用认识</title>
    <link href="https://gankun.cn.lu/posts/2020-03-03/"/>
    <id>https://gankun.cn.lu/posts/2020-03-03/</id>
    <published>2020-03-03T13:34:02.000Z</published>
    <updated>2026-04-02T11:31:19.018Z</updated>
    
    <content type="html"><![CDATA[<p>呼吸道病毒感染分病毒性上呼吸道感染和病毒性下呼吸道感染，前者表现为急性鼻炎、咽炎和喉炎，后者表现为急性气管炎、支气管炎和肺炎。以冬春季发病较多。感染后患者主要有以下表现：急性病毒性上呼吸道感染：即普通感冒。表现为鼻堵、流鼻涕、打喷嚏、咽干、咽痛、低热、头痛和全身不适等；急性喉－气管炎：表现声音嘶哑、咳嗽等；支气管炎和细支气管炎：表现发热、咳嗽、咯痰、气喘；肺炎：表现发热、咳嗽、气促、鼻扇，重者可出现口唇及指甲青紫，胸透可见肺部阴影，主要由流感病毒、副流感病毒、腺病毒和呼吸道合胞病毒等引起。属于中医的“瘟疫”范畴。流感病毒蔓延迅速,感染力强,严重时能够影响整个国家乃至全球，如同新型冠状病毒(COVID-19)全球性感染，所以尽快控制流感病情尤为重要 。</p><p>为从医学免疫学和病原生物学的角度深入认识中医药在抗呼吸道病毒感染方面的应用，本研究以新型冠状病毒(COVID-19)感染以及连花清瘟胶囊对于呼吸道病毒的抑制作用进行综述，并归纳部分对病毒有抑制作用的单味中药。</p><h3 id="1-新型冠状病毒-COVID-19"><a href="#1-新型冠状病毒-COVID-19" class="headerlink" title="1 新型冠状病毒(COVID-19)"></a>1 新型冠状病毒(COVID-19)</h3><p><strong>1.1 COVID-19感染后引起的急性肺损伤的原因</strong></p><p>当病毒进入人体后，通过上呼吸道进入支气管和肺泡，机体在早期感染时会激发自身免疫应答，巨噬细胞会产生细胞因子( cytokines )和炎症趋化因子(chemokines)到病毒入侵部位，诱导淋巴细胞、中性粒细胞等活化，从而隔离、吞噬并杀灭病毒，这是一种积极的控制病毒感染的途径。但是过度的、失调的免疫反应，即免疫激化，会引起患者体内炎症因子含量过高而表现出“细胞因子风暴”[1-2]。细胞因子风暴可以对机体造成严重的损害，如透明膜形成、弥漫性肺泡损伤、纤维蛋白溢出等，进而加速肺部损伤，而严重的肺损伤以及循环系统中的细胞因子风暴会进一步地引起全身多器官功能障碍以及损伤[3]。目前认为，产生重症肺炎的原因往往并不是病毒本身，病毒只是作为诱导因素，使机体产生了过度的免疫应答，体内失衡的细胞因子系统是造成肺炎以及急性肺损伤的一个重要原因[3-4]。</p><p><strong>1.2 细胞因子风暴的产生机制</strong></p><p>冠状病毒的感染所应起的免疫激化的原因仍具有争议性，有研究者通过对同为冠状病毒感染引起的疾病SARS及MERS（中东呼吸综合征）患者养蚌以及动物模型的研究，发现了一些可能导致细胞因子风暴的关键因素[5]。</p><p><strong>1.2.1 病毒快速复制</strong> 研究发现，冠状病毒在感染后能够快速进行复制，并其能在短期内达到高滴度水平。人体样本和动物模型均证实，高病毒滴度与重症肺炎之间有密切的相关性[5]。</p><p><strong>1.2.2 干扰素(IFN)响应延迟</strong> SARS冠状病毒和MERS冠状病毒编码了一些结构性蛋白或非结构性蛋白(nsps)以对抗机体免疫响应,如IFN的响应。IFN的响应受到抑制后，病毒大量繁殖，从而进一步激发炎性单核细胞源性巨噬细胞响应并活化T细胞诱导凋亡，最终导致炎性反应失控[5]。</p><p><strong>1.2.3 单核巨噬细胞和噬中性粒细胞的聚体</strong> 人体模型和动物模型均证实，冠状病毒感染后，肺部单核巨噬细胞和噬中性粒细胞的大量聚集导致细胞因子和炎性趋化因子的大量释放，从而引起细胞因子风暴[5]。</p><p><strong>1.3 中药对新冠病毒肺炎引起的免疫过激“细胞因子风暴”的调节作用</strong></p><p>在临床上常用的抑制免疫的药物如激素，对于人体的毒副作用较大，并且具有发生二次感染和延长病程的风险[6]。而临床时间证明，中药疗效显著，毒副作用较小，多成分多靶点，并且中医强调整体，针对COVID-19患者体内的失调导致的重症甚至死亡的问题，中医药的免疫调控作用有着明显优势。中药能够通过调节细胞因子释放、调控单核巨噬细胞及噬中性粒细胞功能、调节肺血管通透性、调节T细胞活性等方面，从细胞因子风暴的起因，过程等多方面发挥调节作用（图一）[5]。</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="data:image/png;base64,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QfIj7uhAcpmy2NUDR9wPKW8w60YYgKffaiYztZ1RWTfLxuc7buZgUoI/jrKqbyeLZM10xt4VynH8za+UCI7dowEomgZF6TPOedoezaIPMU2DEnAAYTfXIhMRERFRS2KQ3LJEiBXLnXUg0GcOtVUEJ8wBoF6Qy9iH15y2mwjMigloLVORy1jznPUUgb7SZnETbdaXTStlFD9T9fTqChVNc4X049Pfbj0fbgyIJI/7SG9aFkBm9XDRF4MWDaBnpgeWiIiIiKgBCZqmaXY3grJN7/ik8XXb1odsbAk1LdkLYaADis1rjfm73vg+9+0wpl47CgB4/J7XbW4NEfC5by/F1Gv6PMDj9/TZ3BqixrFhwwbs2rUL69evt7spRLaabXcDiMgmrhC0+qhgRkRERERUN5huTURERERERJTAIJmIiIiIiIgogUEyERERERERUQKDZCIiIiIiIqIEBslERERERERECQySiYiIiIiIiBK4BVQDMO8jS0RERERERNXDmeR6ddpcu1vQsn68+2VMHn7L7mYQEREREZENGCTXqdmXfsXuJrSsnzBItsXsCz5ldxOIiIiIiJhuXa9mb74OszdfZ3czWtKs4Ssx99rb0HbFFXY3hYiIiIiIaowzyUREREREREQJDJKJiIiIiIiIEhgkExERERERESUwSCYiIiIiIiJKYJBMRERERERElMAgmYiIiIiIiCiBQTIRERERERFRAoNkIiIiIiIiogQGyUREREREREQJDJKJiIiIiIiIEhgkExERERERESUwSCYiIiIiIiJKYJBMRERERERElMAgmYiIiIiIiCiBQTIRERERERFRAoNkIiIiIiIiogQGyUREREREREQJDJKJiIiIiIiIEhgkExERERERESUwSCYiIiIiIiJKYJBMRERERERElMAgmYiIiIiIiCiBQTIRERERERFRAoNkIiIiIiIiogQGyUREREREREQJDJKJiIiIiIiIEhgkExERERERESUwSCYiIiIiIiJKYJBMRERERERElMAgmYiIiIiIiCiBQTJRhoMHD2L16tV2N4OIiIiIiGzAIJkow/T0NNra2uxuBhERERER2YBBMhEREREREVFCXQfJatAJQRDgDKp2N4WIiIioIbD/REQ0MzUKklUEnQIEwYlyrtdxvwSvXM7ryvAKAgRBKPPniYiIiOzC/hMRkR1qFCSL8MWi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kYOkAXp3u6xO1e8CBDPrXskBqwSh0Aqe4y9HwwKsy6bFx5HkhdFZzzLhW4aTU+apRnb78HWlQr2pQq3YPf7wE7dfLRJKIzpVOagCWawNWUtUMBPWHZUwtF8yX57q+z9g3OnWroHt9m7M++M/ZzAZJiIiWgSMgdIdjRios27ZH23vS4RFFU1HhwwbmjRq+yvAdm+mnLy1OZd12bRcmCRTRkU0MlUMzKPct96ku/4mvAZnlDUpCceN/LTcOyk3Mm5n6F8YU36nmKnJszD05K3sxvSgujD2gUrs++O/d7E/Uhqx39+sDFk3TUREdGQwBpoKpYFyvlfYtFb00uu2BJ0Cji77I+qZK1n7nTCd5zG+oSwEz/O88De+/+f2u/fv1m+YeYNWybmPGt37J971qTm2hGi+zt1xa/f+iZ8ctpUGzcP3a3/fvX/3h3ZGeu7b32Pi1GNPBc99fKLtIhrH29/zYpx6zB8HGPXvORwH/eEH3jLRdh0133nXL3XvMw6ioywcB33zZ399ji2hJD/9b/+ye//uD+1wJJmIiIiIiIiog0kyERERERERUYBJMhEREREREVGASTIRERERERFRgEkyERERERERUYBJMhEREREREVGASTIRERERERFR4Pi8G3BUhPdHIyIiIjpKGAcR0TLhSPI0XcY+CCIiIjqavGOMg4hoOTFJnqLjN9w87yYQLZTj4uvn3QQiIpqRMzf+yLybQLRQnpOYGywLdvFN0fH1N+L4+hvn3QwiIiKimTt7wy04e8Mt824GEdHIOJJMREREREREFGCSTERERERERBRgkkxEREREREQUYJJMREREREREFGCSTERERERERBRgkkxEREREREQUYJJMREREREREFGCSTERERERERBRgkkxEREREREQUYJJMREREREREFGCSTERERERERBRgkkxEREREREQUYJJMREREREREFGCSTERERERERBRgkkxEREREREQUYJJMREREREREFGCSTERERERERBRgkkxEREREREQUYJJMREREREREFGCSTERERERERBRgkkxEREREREQUYJJMREREREREFGCSTERERERERBRgkkxEREREREQUOD7vBszC86cexMUv/SW8s0/PuylEtECEq1+E4zfcjGOvWZ93U4iIpuaKhw9w8gsfx7GzT8y7KUS0QJ6/+iU4c+Nb8Nz33jTvpiyc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"                                     ></p><center>图 1 COVID-19 引起的病理性和生理性免疫应答和中医药免疫调节机制[5]</center><h3 id="2-连花清瘟胶囊"><a href="#2-连花清瘟胶囊" class="headerlink" title="2.连花清瘟胶囊"></a>2.连花清瘟胶囊</h3><p><strong>2.1处方分析</strong></p><center>表1连花清瘟胶囊</center><table><thead><tr><th>药品名称</th><th>处方</th></tr></thead><tbody><tr><td>连花清瘟胶囊</td><td>连翘255g，金银花255g，炙麻黄85g，炒苦杏仁85g，石膏255g，板蓝根255g，绵马贯众255g，鱼腥草255g，广藿香85g，大黄51g，红景天85g，薄荷脑7.5g，甘草85g</td></tr></tbody></table><p>方中连翘苦微寒而清解，金银花甘寒质轻，二药均善清热解毒、疏散风热。相须为用，功力更强，恰中病的，故共为君药。</p><p>炙麻黄辛温发散，微苦略降，善开宣肺气而平咳喘；石膏辛甘大寒，善清解肺热，与麻黄配伍宣肺而不助热，清肺而不留邪；炒苦杏仁苦微温润降兼解肌，既善降气止咳平喘，又略兼宣肺之功。三药合用，既助君药清泄肺火，又能宣肺平喘，故为臣药。</p><p>板蓝根苦寒清解，善清热解毒、凉血利咽；绵马贯众苦寒清泄，善清热解毒；鱼腥草辛寒清解透达，善清热解毒、排脓消痈；薄荷脑辛凉清散，善疏散头面风热、清利头目与咽喉；广藿香芳香辛散微温，外散肌表风寒而发表解暑，内化湿浊而理气和中；大黄苦寒泄降，通里泄热，导热邪从大便而出；红景天甘苦微寒，善清热润肺止咳。七药合用，既助君臣药清肺解毒、宣肺泄热，又化湿浊而理气和中，故为佐药。</p><p>甘草甘平，既清热解毒，又调和诸药，故为使药。</p><p>全方配伍，辛凉宣泄，苦寒清泄，共奏清温解毒、宣肺泄热之功，故善治流行感冒属热毒滞肺证而见上述症状者。</p><p>连花清瘟胶囊在中医治疗中用于清瘟解毒、宣肺泄热，属于清热解毒的药物，能够对应呼吸道病毒感染带来的咳嗽、肺热等“瘟疫”症状，并根据病情诊断，与西药的抗病毒药物奥司他韦一起使用治疗热毒袭肺引起的流行性感冒，疗效确切。</p><p><strong>2.2连花清瘟胶囊对流行性感冒的作用</strong></p><p>有研究指出，在相同情况下，服用连花清瘟胶囊的患者发热、咳嗽、气促等临床症状、体征消失的时间相较与未服用连花清瘟胶囊的患者明显缩短，并且两者对于药物的不良反应并无明显差异，这主要是由于连花清瘟胶囊与作为对照的抗病毒西药相比，能够在整体上多靶点同时调节治疗。相关研究表明连花清瘟胶囊中多种药物的药理作用正向叠加能够是连花清瘟胶囊同时拥有较好的抗病毒和抗菌消炎、解热止痛、化痰止咳、提高人体免疫功能的作用[7]。与单一抗病毒药物作比较，在退热和减轻上呼吸道症状更具优势[8]。在现代药理实验中，连花清瘟胶囊被证实了具有抗菌、退热消炎、提高免疫功能等作用[9-10]。</p><h3 id="3-抗呼吸道感染病毒的中药"><a href="#3-抗呼吸道感染病毒的中药" class="headerlink" title="3.抗呼吸道感染病毒的中药"></a>3.抗呼吸道感染病毒的中药</h3><p>呼吸道病毒主要包括正黏病毒科的流感 病毒, 副黏病毒科的麻疹病毒, 冠状 病毒科的冠状病毒及其他病毒科的病毒,如腺病毒、风疹病毒等。研究表明,许多中草药对流感病毒和呼吸道合胞病毒有一定的抑制作用，例如金银花、鱼腥草、板蓝根、甘草等。</p><p><strong>3.1金银花</strong> 金银花含有绿原酸、异绿原酸、木犀草酸、金丝桃苷、芳香醇等，可以抑制多种呼吸道病毒复制，延缓病毒所致的细胞病变的发生[11]。</p><p><strong>3.2鱼腥草</strong> 鱼腥草鱼腥草含有槲皮苷等有效成分, 具有抗病毒和抑制细菌生长的双重作用。有研究证明，应用鱼腥草注射液治疗病毒感染合并轻微细菌感染的急性上呼吸到感染引起的高热，具有良好的退热作用[12]。</p><p><strong>3.3板蓝根</strong> 板蓝根抗病毒作用比较显著, 体内体外均可抑制流感病毒的增殖, 延缓流感病毒对人肾原代单层上皮细胞的损伤作用,靛蓝、靛玉红可能是起作用的主要物质[13]。</p><p><strong>3.4甘草</strong> 有研究证明甘草活性成分在体外对呼吸道合胞病毒的复制有明显的抑制作用,且初步验证甘草活性成分不是甘草酸和甘草多糖,可能是一种新的抗病毒物质,有待于进一步研究[14]。</p><p>在治疗由外感病毒所应起的呼吸道感染进而引起的肺炎等症状，除了从病源入手，使用定向标靶药物对病毒直接消灭的途径外，应当把预防和治疗细胞分子风暴纳入必须的考虑的范围内。抗病毒西药虽然大多数比中医药见效快，但其中激素类药物对人体的损伤也是极其大的，严重者甚至会发生二次感染。而中药在抗病毒的过程中不仅可以抑制病毒复制，防止细胞因子风暴的发生，还能在一定程度上延缓病毒所致的细胞病变。在已有的研究中表明，不同的中药抗病毒免疫机制不完全相同，有的是改善非特异性免疫，有的是改善免疫球蛋白水平，有的则作用于T淋巴细胞亚群、调节细胞因子的合成和释放（可预防和治疗细胞因子风暴）。</p><p>综上所述，中医药在治疗呼吸道病毒感染时，不只是抗病毒，而是注重整体，注重病毒-机体-药物三者的关系，不以清除机体内的病毒为唯一目标，而是通过改善机体状态，利用机体本身的抗病力量。中医药的治疗虽然是以非特异性为主，利用自身免疫性，但是中医讲究因时、因地、因人制宜，强调辨证，所以比起西药在治疗呼吸道感染，中医药具有更广泛的适应性。笔者认为，通过此次全球性新冠病毒的爆发及治疗，中医药必定会受到高度重视，中医药抗病毒也将成为重点的研究方向，中医药的推广必不可少，人民群众的基本中医药知识应当进行普及，这对于全国防病防疫是一个重要的防线。</p><blockquote><p><strong>【参考文献】</strong></p><ol><li>尹明星,曹 艳,施春阳,等.中药防治细胞因子风暴的研究进展[J].中草药,2020,10.16250&#x2F;j.32.1374.2020012.</li><li>刘闰平, 葛俊德, 钟 颖, 等. 基于干预细胞因子风暴文献挖掘的中医药治疗重症新型冠状病毒病毒肺炎探讨[J]. 中草药,2020,10.16250&#x2F;j.32.1374.2020036.</li><li>Hawlisch H, Belkaid Y, Baelder R, et al. C5a negatively regulates toll-like receptor 4-induced immune responses[J]. Immunity, 2005, 22(4): 415-426.</li><li>Kohl J.Anaphylatoxins and infectious and non-infectious inflammatory diseases[J].Mol Immunol,2001,38(2-3):175-187.</li><li>何黎黎,龚普阳,封 玥,邹 薇,王恩龙,顾 健.中药在抗新型冠状病毒肺炎(COVID-19)引起的细胞因子风暴中的应用分析.中草药.<a class="link"   href="http://kns.cnki.net/kcms/detail/12.1108.R.20200302.0944.004.html" >http://kns.cnki.net/kcms/detail/12.1108.R.20200302.0944.004.html<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></li><li>张欣悦, 高永翔. 中药的免疫抑制作用研究进展 [J].中药与临床, 2016, 7(1): 59- 61.</li><li>叶春娟, 张 帆, 朱育银. 莲花清瘟胶囊对流行性感冒合并支气管肺炎的作用[J]. 中国实验方剂学杂志, 2013, 019(024):329-331.</li><li>庞学智,马启林,郑红霞,等. 莲花清瘟胶囊等综合治疗甲型H1N1流感疗效观察[J] .中国现代医生,2010,48(10):44.</li><li>辛海宾. 莲花清瘟胶囊治疗流行性上呼吸道感染的临床疗效观察[J].实用心脑肺血管病杂志,2013,021(004):70-71.</li><li>张 君, 付同胜, 杨悠兰,等. 干扰素加莲花清瘟胶囊治疗病毒性结膜炎临床观察[J]. 海南医学, 2010(23):41+50.</li><li>李 莹. 中药抗呼吸道病毒感染药理作用研究进展[J]. 山西中医, 2007, 023(004):71-72.</li><li>李京鹤, 李志成, 陈 雯. 鱼腥草注射液治疗急性上呼吸道感染196例疗效观察[J]. 时珍国医国药, 2006, 017(003):404-404.</li><li>陈莉莉, 张洪泉. 中药抗病毒性呼吸道感染的研究进展[J]. 中国野生植物资源, 2006(06):20-22.</li><li>张建军, 李洪源, 王吉锡,等. 甘草活性成分抗呼吸道合胞病毒作用[J]. 中国公共卫生, 2007, 23(6).</li></ol></blockquote>]]></content>
    
    
    <summary type="html">从《医学免疫学与病原生物学》的角度以及所学习的知识，综合分析并浅谈中医药抗呼吸道病毒感染的应用认识</summary>
    
    
    
    <category term="文章" scheme="https://gankun.cn.lu/categories/%E6%96%87%E7%AB%A0/"/>
    
    
    <category term="中药学" scheme="https://gankun.cn.lu/tags/%E4%B8%AD%E8%8D%AF%E5%AD%A6/"/>
    
    <category term="论文" scheme="https://gankun.cn.lu/tags/%E8%AE%BA%E6%96%87/"/>
    
    <category term="新冠" scheme="https://gankun.cn.lu/tags/%E6%96%B0%E5%86%A0/"/>
    
    <category term="呼吸道感染" scheme="https://gankun.cn.lu/tags/%E5%91%BC%E5%90%B8%E9%81%93%E6%84%9F%E6%9F%93/"/>
    
  </entry>
  
</feed>
