Linux, 工作, 生活, 家人

Programming, Software, 社會環保

用 Sentinel-2 衛星影像算全台光電砍樹:2019–2025 僅 94 公頃

default

網站:https://richliu.github.io/treecrowns/
簡報:https://richliu.github.io/treecrowns/slides/treecrowns.pptx
原始碼:https://github.com/richliu/treecrowns

人類寫的前題

現在文章大部分都由 AI 產生,但重要的事情還是要人類完成。原本主要的發想來源是 【路樹悲歌】中研院研究員揭北市樹冠2年暴減1.3萬棵 市府駁斥:反增1.3萬棵樹,內文提到「根據歐洲太空總署(ESA)的 Sentinel-2 衛星影像計算」,這就給了我靈感:我們長期關注台灣能源議題,能不能拿來計算台灣到底砍了多少樹呢?

這一代的 Opus 5.5 表現很亮眼,很快的就能做出類似的效果,若再給予引導,也知道可以輔佐以其他政府數據證明這個結果是合理的。

至於結果大出意外,其實相對砍樹造光電並不多,2019–2025 年台灣新增約 3,866 公頃的地面型太陽光電(約 149 座大安森林公園),原本是樹林的只有約 94 公頃(2.4%)。定義放到最寬也只有約 220 公頃(不到 6%)。 新增光電大多蓋在農地或低植生(49.5%)和水體(魚塭、鹽田、埤塘,31.1%)上。
但是砍樹種光電這件事因為比較有話題性,所以就很多人會關注,而忽略了農地和水體光電的問題。

ARK SOLAR 誠新綠能在將軍的案場,看起來已經變爛尾案場(誠新漁電爛尾案》從詐貸47億到資產轉移疑雲,關係企業忙切割,地主恐揹巨額爛帳),這是之前去台南的特殊人文觀光景點之一呢。

以下是 AI 文,但是我加上了自已的想法,不想看的可以跳過

為什麼想做這件事

「光電砍樹」是這幾年常常吵的話題。新聞上看得到幾個怵目驚心的案例,但到底全台加起來砍了多少,一直沒有一個可以重現的數字。

我的想法很單純:

  • 衛星每隔幾天就拍一次台灣,影像是公開的。
  • 樹冠在衛星影像上很好認(植生指數高)。太陽能板也有自己的光譜特徵。
  • 那就逐年把「哪裡是樹」「哪裡是太陽能板」畫出來,再看每塊太陽能板蓋之前是什麼。

方法參考農業部農村發展及水土保持署 BigGIS 的〈Sentinel-2 影像變異分析〉:它用 NDVI、陰影、綠度的決策樹找山坡地的地表變異。我拿同一套思路,加上太陽能板的辨識規則,把範圍擴大到全台,時間拉到 2017–2025。

先講單位:「公頃」是多大?

做完第一版之後才發現,報表上寫「ha」一般人根本看不懂。所以全文都用公頃,也附上比較:

1 公頃等於
面積10,000 平方公尺(100 m × 100 m)
坪約 3,025 坪
甲約 1.03 甲
足球場約 1.4 個標準足球場
大安森林公園約 26 公頃一座

Sentinel-2 一個像素是 10 m × 10 m,也就是 100 個像素 = 1 公頃。


資料來源

資料用途
Copernicus Sentinel-2 L2A(ESA),透過 AWS Open Data / Element84 Earth Search STAC主要影像,10 m 解析度,2017–2025
農村發展及水土保持署 BigGIS分類方法參考;115 年度山坡地範圍圖
林業及自然保育署 國有林事業區圖看光電有沒有蓋進國有林
經濟部能源署 太陽光電案場地號、同意備案、再生能源裝置容量驗證
Copernicus DEM GLO-30推估坡度(六都山坡地圖沒有開放下載)
國土測繪中心 正射影像 / 電子地圖網站底圖
taiwan-atlas縣市、鄉鎮界

全部都是公開資料。


怎麼做的

1. 下載與年度去雲合成

台灣上空雲很多,單張影像幾乎沒辦法用。所以每個 MGRS 圖幅(100 km × 100 km)每年取雲量最低的 15 景,用 L2A 內附的場景分類圖(SCL)把雲和雲影遮掉,再逐像素取中位數,得到一張「這一年的典型樣子」。

細節:

  • 全台加離島要 22 個圖幅(51Q/51R 主體,加上 50Q/50R 澎湖、金門、馬祖)。
  • 2022 年起 ESA 的處理基準(baseline 04.00)多了反射率偏移,要先扣掉,不然前後年份會對不上。
  • 只用 SCL 遮雲不夠乾淨,所以又加一條「藍光反射率 > 0.15 視為霧霾」的規則。但這條規則會把很亮的屋頂也當成雲遮掉,在地圖上變成一個個洞。所以改成:該像素整年都沒有乾淨觀測時,退回只用 SCL。
  • 合成時每 2048 × 2048 像素切一塊,和 COG 的 1024 區塊對齊,避免同一塊資料被讀兩次。

下載有多慢? 9 年 × 22 圖幅、每年 15 景、每景好幾個波段,合成結果大約 28 GB(原始讀取量是好幾倍)。一開始以為是被限制單一 IP,實測後發現瓶頸是延遲:主機到 AWS us-west-2 的 RTT 約 166 ms,單一連線很慢。開到 128 條並行連線可以跑到約 121 MB/s;最後用 32 執行緒、兩個年份同時跑,大約 85 MB/s。結論是多開執行緒就好,不需要多個 IP。

2. 分類

每一年、每個像素分成六類:

類別規則(簡化)
樹冠全年 NDVI 中位數 > 0.70,且第 25 百分位數 > 0.60(一整年都綠,才不會把作物算進來)
太陽能板NDVI < 0.2、(B11−B8)/(B11+B8) > 0.3、藍光比紅光亮、近紅外暗、短波紅外 > 0.12;做形態學閉運算,面積 ≥ 20 像素(0.2 公頃)
水體MNDWI > 0.1 且 NDVI < 0.1
陰影很暗的像素(山的背光面)
低植生 / 農地有植生但不到樹冠門檻
裸露地 / 建物其餘

調整的過程:

  • BigGIS 原本的陰影指數(SI)在年度合成影像上很不穩,最後改成簡單的暗像素規則。
  • 樹冠門檻一開始設 0.6,會把很多水稻、甘蔗田算成樹,後來提高到 0.70 / 0.60。
  • 太陽能板的規則用台南七股、彰濱的已知案場校正。早期版本把水庫的深色水面誤判成浮動式光電,加了「短波紅外 > 0.12」才排除。

3. 逐像素時間序列

以 2018 年為基準年(2017 只有 Sentinel-2A 一顆衛星,觀測太少、樹冠低估,所以只當參考),對每個像素看 2018–2025 的類別序列:

  • 完工年:第一次被判為太陽能板,而且隔一年還是(避免單年誤判)。
  • 前身:看完工前各年的類別:
    • 過半年份是樹冠 → 樹林
    • 至少 1/3 年份是水體 → 水體
    • 其他的看農地 / 低植生和裸露地哪個多(平手算農地)

4. 外部資料套疊與驗證

  • 能源署公布的案場只有地號沒有座標,國土測繪中心的定位服務只能查門牌、查不了地號,所以沒辦法做逐案場比對,只能以鄉鎮為單位比對。
  • 山坡地:非六都用官方範圍圖。六都沒有開放下載,就用 DEM 算坡度推估(和官方圖比對的精確率 0.60、召回率 0.85)。
  • 國有林事業區:直接套疊。

5. 發佈

  • Python(rasterio、numpy、geopandas)做分析,Jinja2 產生靜態網站。
  • 前端全用現成套件:Bootstrap 5、Leaflet(地圖)、Chart.js(圖表)、simple-datatables(表格)。
  • 地圖圖磚預先切成 XYZ PNG(z7–13),整個網站是靜態檔案,放在 GitHub Pages。
  • 簡報用 pptxgenjs 從同一份統計數字產生,數字更新後重跑就好。

結果

新增太陽能板,蓋之前是什麼?

蓋之前是面積佔新增約幾座大安森林公園
農地 / 低植生1,912 公頃49.5%74
水體(魚塭 / 鹽田 / 埤塘)1,201 公頃31.1%46
裸露地 / 建物659 公頃17.0%25
樹林(砍樹光電)94 公頃2.4%3.6
合計3,866 公頃149

另外,2018 年時就已經有約 180 公頃的光電。

每年新增

年份2019202020212022202320242025
新增光電(公頃)272218652584706720714
其中原為樹林0.41.17.244.610.18.022.8

2021 年後明顯加速,和全國累計裝置容量的成長同步。砍樹光電的高峰在 2022 年。

縣市

新增光電最多的是台南(1,237 公頃)、彰化(754)、嘉義縣(478)、雲林(380)、高雄(315)、屏東(271),大多是西南沿海的農地和魚塭。彰化的新增光電有三分之二蓋在水體上(漁電共生)。

砍樹光電則非常集中:花蓮約 38 公頃、屏東約 35 公頃,兩縣合計佔了 3/4。花蓮主要在鳳林、光復一帶的平地造林地,不是山坡地。

衛星前後對照

花蓮:平地造林 → 光電

20182025
花蓮 2018花蓮 2025

彰濱:水體 → 光電

20182025
彰濱 2018彰濱 2025

台南七股:農地 / 鹽田 → 光電

20182025
七股 2018七股 2025

山坡地與國有林

  • 新增光電中,落在山坡地的有 394 處、約 225 公頃,其中原為樹林的約 18 公頃。
  • 原為樹林的 94 公頃裡,約 76 公頃在平地。
  • 落在國有林事業區內的有 20 處、約 30 公頃,原為樹林的只有 1.5 公頃,大部分原本是草生地或農地。

追問:會不會「先砍樹、放幾年、再蓋光電」?

很合理的質疑。上面的「砍樹光電」規則是「完工前過半年份是樹」。如果有人 2019 年砍樹,讓地空著到 2024 年才蓋光電,完工前的 6 年裡只有 1 年是樹,就不會被算進去。

所以我又把每個新增光電像素完工前的完整序列拿出來,分成幾層:

類型說明面積累計佔新增
完工前多數年份是樹原本的定義94 公頃942.4%
先砍樹、空窗多年再蓋≥ 2 年是樹,之後到完工都不是樹33 公頃1273.3%
2018 年以前就已砍除分析期間從沒是樹,但 2017 參考年是樹17 公頃1443.7%
只有 1 年被判為樹證據薄弱,可能是分類雜訊77 公頃2205.7%

一些觀察:

  • 「先砍樹再蓋」的空窗大多是 3–6 年。
  • 空窗期間地面多半是低植生(59%),也就是長草,不是一直光禿禿的;其次是裸露地 / 建物(24%)。
  • 不是每一塊都是「為了光電砍樹」。例如桃園這塊:2018 年是樹林,2020 年清除,2022 年蓋了工廠,2024 年工廠屋頂裝上光電。樹是因為蓋工廠被砍的,光電只是後來加上的。
2018 樹林2020 清除2022 工廠2024 屋頂光電
桃園 2018 樹林桃園 2020 清除桃園 2022 工廠桃園 2024 屋頂光電

所以就算用最寬鬆的算法,砍樹光電也不到新增光電的 6%。

「樹」的定義也會影響數字

「樹」的定義新增光電中原為此類
嚴格樹冠(本研究主要定義)約 88 公頃
寬鬆木本(含果園、檳榔、竹林)約 180 公頃
任何植被(含農作物)約 405 公頃

如果把果園、檳榔、竹林都算成「樹」,數字大約翻倍,但仍然只佔新增光電的 5% 左右。


可信度:和官方資料對得起來嗎?

  • 能源署 419 個電業級案場(土地面積 6,685 公頃、3,987 MW),以鄉鎮為單位和衛星偵測面積比較,相關係數 r = 0.79。
  • 衛星偵測到的新增光電,88% 落在有官方案場的鄉鎮。
  • 每年偵測到的光電面積成長,和全國累計裝置容量的成長趨勢一致。
  • 偵測面積約為官方案場土地面積的 46%。一部分是官方面積含整筆地號(周邊道路、空地),一部分是 10 m 解析度看不到小案場。

研究限制

說清楚這份分析做不到什麼:

  1. 只看得到地面型、0.2 公頃以上的案場。 10 m 解析度看不到屋頂型和小型案場,所以光電面積是下限。
  2. 「樹」怎麼定義會影響結果。 所以另外提供寬鬆定義和路徑分析的範圍(94–220 公頃)。
  3. 「農地 / 低植生」是很大的一類,可能包含草生地、海埔地、長藻的魚塭,不一定是正在耕作的農地。
  4. 2017 年資料品質較差(只有一顆衛星),只當參考。2025 年的新案場要等 2026 年才能確認,目前可能低估。
  5. 衛星看不到砍樹的原因。 是為了光電、為了蓋工廠、還是林木本來就到了採伐期,影像上分不出來。
  6. 官方案場沒有座標,只能做鄉鎮層級的驗證,沒辦法逐案場核對。六都的山坡地用 DEM 推估。

結論

  1. 2019–2025 年新增約 3,866 公頃地面型光電(約 149 座大安森林公園),2021 年後明顯加速。
  2. 主要蓋在農地 / 低植生(約一半)和水體(約三成)上,漁電共生的比例很高,特別是彰化、台南、嘉義。
  3. 原為樹林的約 94 公頃(2.4%);把「先砍樹、放幾年再蓋」和證據較弱的情況都算進去,最多約 220 公頃,不到 6%。
  4. 砍樹光電集中在花蓮和屏東的平地造林地,不是普遍發生在山坡地。
  5. 光電砍樹的案例確實存在,值得個別檢討。但從全台的尺度來看,光電用地的主要議題是農地和漁塭,不是森林。

工具與開源

  • 衛星影像:Sentinel-2 L2A(AWS Open Data、Element84 Earth Search STAC)
  • 分析:Python、rasterio、GDAL、numpy、scipy、geopandas、pystac-client
  • 網站:Jinja2、Bootstrap 5、Leaflet、Chart.js、simple-datatables,部署在 GitHub Pages
  • 簡報:pptxgenjs
  • 開發過程用 Claude Code 協助撰寫與除錯程式

所有程式、統計數字(JSON)和重現步驟都在 GitHub。歡迎挑錯。

本文為實驗性分析,數據僅供參考。

發佈留言