網站: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%)上。
但是砍樹種光電這件事因為比較有話題性,所以就很多人會關注,而忽略了農地和水體光電的問題。

以下是 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 公頃的光電。
每年新增
| 年份 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 |
|---|---|---|---|---|---|---|---|
| 新增光電(公頃) | 272 | 218 | 652 | 584 | 706 | 720 | 714 |
| 其中原為樹林 | 0.4 | 1.1 | 7.2 | 44.6 | 10.1 | 8.0 | 22.8 |
2021 年後明顯加速,和全國累計裝置容量的成長同步。砍樹光電的高峰在 2022 年。
縣市
新增光電最多的是台南(1,237 公頃)、彰化(754)、嘉義縣(478)、雲林(380)、高雄(315)、屏東(271),大多是西南沿海的農地和魚塭。彰化的新增光電有三分之二蓋在水體上(漁電共生)。
砍樹光電則非常集中:花蓮約 38 公頃、屏東約 35 公頃,兩縣合計佔了 3/4。花蓮主要在鳳林、光復一帶的平地造林地,不是山坡地。
衛星前後對照
花蓮:平地造林 → 光電
| 2018 | 2025 |
|---|---|
![]() | ![]() |
彰濱:水體 → 光電
| 2018 | 2025 |
|---|---|
![]() | ![]() |
台南七股:農地 / 鹽田 → 光電
| 2018 | 2025 |
|---|---|
![]() | ![]() |
山坡地與國有林
- 新增光電中,落在山坡地的有 394 處、約 225 公頃,其中原為樹林的約 18 公頃。
- 原為樹林的 94 公頃裡,約 76 公頃在平地。
- 落在國有林事業區內的有 20 處、約 30 公頃,原為樹林的只有 1.5 公頃,大部分原本是草生地或農地。
追問:會不會「先砍樹、放幾年、再蓋光電」?
很合理的質疑。上面的「砍樹光電」規則是「完工前過半年份是樹」。如果有人 2019 年砍樹,讓地空著到 2024 年才蓋光電,完工前的 6 年裡只有 1 年是樹,就不會被算進去。
所以我又把每個新增光電像素完工前的完整序列拿出來,分成幾層:
| 類型 | 說明 | 面積 | 累計 | 佔新增 |
|---|---|---|---|---|
| 完工前多數年份是樹 | 原本的定義 | 94 公頃 | 94 | 2.4% |
| 先砍樹、空窗多年再蓋 | ≥ 2 年是樹,之後到完工都不是樹 | 33 公頃 | 127 | 3.3% |
| 2018 年以前就已砍除 | 分析期間從沒是樹,但 2017 參考年是樹 | 17 公頃 | 144 | 3.7% |
| 只有 1 年被判為樹 | 證據薄弱,可能是分類雜訊 | 77 公頃 | 220 | 5.7% |
一些觀察:
- 「先砍樹再蓋」的空窗大多是 3–6 年。
- 空窗期間地面多半是低植生(59%),也就是長草,不是一直光禿禿的;其次是裸露地 / 建物(24%)。
- 不是每一塊都是「為了光電砍樹」。例如桃園這塊: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 解析度看不到小案場。
研究限制
說清楚這份分析做不到什麼:
- 只看得到地面型、0.2 公頃以上的案場。 10 m 解析度看不到屋頂型和小型案場,所以光電面積是下限。
- 「樹」怎麼定義會影響結果。 所以另外提供寬鬆定義和路徑分析的範圍(94–220 公頃)。
- 「農地 / 低植生」是很大的一類,可能包含草生地、海埔地、長藻的魚塭,不一定是正在耕作的農地。
- 2017 年資料品質較差(只有一顆衛星),只當參考。2025 年的新案場要等 2026 年才能確認,目前可能低估。
- 衛星看不到砍樹的原因。 是為了光電、為了蓋工廠、還是林木本來就到了採伐期,影像上分不出來。
- 官方案場沒有座標,只能做鄉鎮層級的驗證,沒辦法逐案場核對。六都的山坡地用 DEM 推估。
結論
- 2019–2025 年新增約 3,866 公頃地面型光電(約 149 座大安森林公園),2021 年後明顯加速。
- 主要蓋在農地 / 低植生(約一半)和水體(約三成)上,漁電共生的比例很高,特別是彰化、台南、嘉義。
- 原為樹林的約 94 公頃(2.4%);把「先砍樹、放幾年再蓋」和證據較弱的情況都算進去,最多約 220 公頃,不到 6%。
- 砍樹光電集中在花蓮和屏東的平地造林地,不是普遍發生在山坡地。
- 光電砍樹的案例確實存在,值得個別檢討。但從全台的尺度來看,光電用地的主要議題是農地和漁塭,不是森林。
工具與開源
- 衛星影像: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。歡迎挑錯。
本文為實驗性分析,數據僅供參考。











發佈留言