呂凱崴kaiweilu.tw

衛星影像月曆與土地使用分區對照網站

把「非都市土地使用分區」與「國土功能分區」兩套土地管制制度放在同一個三維地球上,以一條可拖曳的分割線左右對照;本站同時是內政部國土管理署與太遙中心合作編印之 2027 年桌曆的線上互動版,桌曆上的 QR code 即導向本站。2026 年 6 月起於太遙中心實習,依中心需求主責完成並交付,約四週由資料整理做到公開上線。

期間
2026-08-18 至 09-14(約四週);已公開上線
角色
依中心需求主責完成並交付:資料合併、圖磚服務、前台、管理後台、部署與文件;衛星影像與月份圖說由中心與合作單位提供;交付後持續參與中心的後續開發
技術
CesiumJS、Vue 3、TypeScript、Vite;GeoServer、GeoWebCache;GDAL、Python;Node.js;Docker Compose、nginx、TLS
規模
約 90.6 萬筆向量圖徵(1.3 GB);國土功能分區由 22 縣市、28 份來源檔合併;12 個月份開發案;271 項端對端檢查

書審對應:附件 E-2

左側非都市土地使用分區、右側國土功能分區(22 縣市 22,329 筆),拖曳中央分割線即可對照;下緣為 2027 年十二個月的開發案索引
左側非都市土地使用分區、右側國土功能分區(22 縣市 22,329 筆),拖曳中央分割線即可對照;下緣為 2027 年十二個月的開發案索引
本頁目錄
  1. 背景:同一塊地,兩套制度
  2. 資料:22 縣市、28 份來源,檔案的自我宣告不可信
  3. 來源錯誤:保留原貌,以警示色標示
  4. 圖磚服務:GeoServer 出圖、GeoWebCache 快取
  5. 描邊門檻:以「深色像素佔比」量測
  6. 前台:分割對照、屬性查詢與十二個月索引
  7. 管理後台:讓不寫程式的同仁更換資料
  8. 部署與驗證
  9. 時程與版本演進
  10. 上線與存取紀錄

背景:同一塊地,兩套制度

臺灣的國土規劃正由區域計畫走向國土計畫。舊制下,非都市土地以「使用分區」(特定農業區、森林區、山坡地保育區等 11 類)與地籍層級的「使用編定」(甲至丁種建築用地、農牧、交通等 17 類)管制;新制依環境資源、土地現況與發展需求劃設四大國土功能分區(國土保育、海洋資源、農業發展、城鄉發展地區,細分後圖例共 20 項)。同一宗土地在兩套制度下各被劃成什麼,過去沒有可以並排查看的工具。本站把兩套制度放在同一個三維地球、同一個相機下:左側為使用分區(可一鍵切換為使用編定),右側為國土功能分區。

本站也是內政部國土管理署與太遙中心合作編印之 2027 年桌曆《島嶼藍圖》的線上互動版。桌曆以十二個月份對應十二個國土計畫相關的開發案:臺北港、桃園航空城、客雅溪口與三姓溪口、尖石鄉鎮西堡及斯馬庫斯部落、芳苑外海離岸風力發電廠、嘉義縣布袋鎮沿海、國立故宮博物院南部分院、鹿野高台、臺南將軍溪畔、臺南龍崎牛埔惡地、農業生物科技園區、大坵與小坵。桌曆上的 QR code「看見土地的轉變:12 個月份 × 土地分區互動對照」導向本站,掃碼後直接飛抵當月開發案並翻開衛星影像圖版。使用者因此分成兩群、介面分開設計:一般民眾(多數以手機掃碼進站)使用前台,負責更換資料但不寫程式的中心同仁使用管理後台。

開場封面:2027 CSRSR 月曆,十二個環形標記即十二個開發案的位置
開場封面:2027 CSRSR 月曆,十二個環形標記即十二個開發案的位置
2 月桃園航空城:左側使用分區、右側國土功能分區,上方為當月衛星影像圖版與圖說
2 月桃園航空城:左側使用分區、右側國土功能分區,上方為當月衛星影像圖版與圖說

資料:22 縣市、28 份來源,檔案的自我宣告不可信

資料集圖徵數圖例項數來源形式
非都市土地使用分區(2026 年 1 月版)66,96311全國一份
非都市土地使用編定(2026 年 1 月版)816,74517全國一份
國土功能分區22,3292022 縣市、28 份檔案,自行合併

三份資料合計約 90.6 萬筆、1.3 GB。國土功能分區以縣市為單位發布,共出現三種座標系統(TWD97 二度分帶的 EPSG:3826、3825 與 WGS84 經緯度 EPSG:4326)與三種字元編碼(UTF-8、Big5、GB18030),而且檔案附帶的宣告常與內容不符。合併程式在 GDAL 容器內執行,每一項判讀都以實測為準、不採信宣告,並逐縣市印出判讀表:

檔案宣告實測到的情況判讀方式
編碼(.cpg)臺中兩份宣告 UTF-8,內容實為 Big5;高雄、金門沒有 .cpg,內容為 GB18030直接讀 DBF 的位元組,依 UTF-8、Big5、GB18030 的順序嚴格解碼,取第一個完全成功者。順序不可調換:GB18030 幾乎能解開任何位元組序列,排在前面會吞掉真正的 Big5 檔
座標系統(.prj)雲林海域宣告 WGS84 經緯度,座標值卻是 TM2 公尺以座標數值範圍核對宣告,並逐縣市以質心逆投影確認落在該縣市範圍
代碼欄位同一欄出現 zonid、zinid、ZONID 三種寫法;臺北市的檔案沒有代碼欄以候選清單不分大小寫比對;沒有代碼欄時由分類名稱反查代碼
分類名稱欄寬不足造成名稱截斷,另有單筆錯值同一代碼的名稱以筆數多者優先,只有兩者為前綴關係(即截斷)時取較長者

名稱採筆數優先而非長度優先,依據是實測反例:高雄市 1 筆 12 字的錯誤名稱(代碼 U30 被標為「農業發展地區第四類(原)」)若以長度決定,會蓋過 15 個縣市 82 筆的正確名稱。寫出端的三個工具層問題(Alpine 版 GDAL 無法寫出 Big5、DBF 欄位名稱的 10 位元組上限以 UTF-8 計算、SHAPE_ENCODING 讀寫共用)也都寫進合併腳本與技術紀錄。

來源錯誤:保留原貌,以警示色標示

合併時確認了兩筆來源本身的錯誤:高雄市一筆代碼 A41 與名稱不符;代碼 U21 的一個多邊形有一個環落在巴拉望西方的公海上。兩筆都刻意不修,理由是修改就等於竄改來源,改為讓錯誤在圖上自行現形:樣式的最後一條規則(ElseFilter)把圖例沒有定義的代碼畫成警示色(國土功能分區為純黑),A41 因此以純黑顯示;寧可一眼看出分類有問題,也不讓圖徵靜靜地不顯示。

圖磚服務:GeoServer 出圖、GeoWebCache 快取

CesiumJS 的左右分割(SplitDirection)只作用於影像圖層與 3D Tiles,不作用於 GeoJSON 圖徵;81.7 萬個多邊形也不可能送進瀏覽器。架構因此定為:GeoServer 直接讀取 shapefile,以 WMS 輸出 PNG 圖磚,前端只拿圖片,shapefile 不做轉檔。GeoWebCache 快取後,單一圖磚由未快取的 2.5 至 3.8 秒降為命中快取的 0.01 至 0.04 秒;發布圖層後即預熱快取。

圖例篩選與快取的互動

兩側圖例每一列都有勾選框,取消勾選就把該分類從地圖上拿掉,實作上是在 WMS 請求加上 CQL_FILTER。實測發現 GeoWebCache 會靜默忽略這個條件:回應仍是 HTTP 200、快取命中,內容是與未篩選時完全相同的 29,758 位元組圖磚,沒有錯誤也沒有警告。設計因此改為:

  • 全部勾選時走快取端點;
  • 只要有一項取消勾選,就改打未經快取的 WMS 端點、只畫勾選的分類(實測每張圖磚使用分區約 0.41 秒、使用編定約 1.47 秒),面板同時提示「篩選中:只畫勾選的分類,載入會慢一些」;
  • 同一張圖磚由兩個端點各畫一次、逐像素比對:實心色塊完全相同,只差邊界上 alpha 小於 33 的抗鋸齒像素,因此切換時看不到顏色跳動。

只放行取圖與查詢屬性

實測 GeoServer 的 WFS GetFeature 請求會回傳完整的 GML,等於把原始資料開放整批下載。正式環境的 nginx 以 map 比對請求參數,只放行 GetMap(取圖)與 GetFeatureInfo(查詢屬性),GeoServer 的管理介面與 REST 端點一律封鎖。GeoServer 與後台服務都不對外開埠,由 nginx 以同源反向代理提供;全站走 HTTPS,80 埠只回 301 轉址。

圖例逐項勾選:取消「特定農業區」後改走未快取的端點,面板提示載入較慢
圖例逐項勾選:取消「特定農業區」後改走未快取的端點,面板提示載入較慢
左側一鍵切換為使用編定(816,745 筆),右側維持國土功能分區
左側一鍵切換為使用編定(816,745 筆),右側維持國土功能分區

描邊門檻:以「深色像素佔比」量測

使用編定有 816,745 筆地號,縮到全臺視角時每筆不到一個像素;若每個層級都畫描邊,60.8% 的非透明像素會變成黑線,整張圖看不出任何分類,而網站的初始鏡頭正是全臺視角。處理方式是把描邊拆成獨立的第二個繪製階段(第二個 FeatureTypeStyle),填色全部畫完才畫描邊,再對整組描邊設定比例尺門檻(MaxScaleDenominator)。

門檻以量測決定。指標定義為「深色像素(RGB 三色皆小於 90)佔非透明像素的比例」,超過約 25% 即明顯難以判讀;以 512×512 圖磚逐視角實測後,使用分區與國土功能分區取 1:1,000,000(全臺視角不畫、縣市以下才畫),使用編定取 1:150,000(接近鄉鎮才畫),兩者差近 7 倍,對應圖徵密度差 12 倍。國土功能分區只有 2.2 萬筆,但圖形細緻到地籍等級,不能只看筆數就沿用門檻,因此 9 月 9 日加入時重新實測(南投、雲林一帶):

視角經度跨距比例尺分母深色像素佔比
全臺2.8°1:1,953,0000.00%(門檻外)
剛進門檻1.35°1:1,045,0000.00%(門檻外)
門檻內側1.25°1:968,00014.45%
單一縣市0.6°1:419,00011.46%
單一鄉鎮0.14°1:98,0005.11%

最吃緊的是描邊剛開始畫、圖徵又還小的「門檻內側」,14.45% 離 25% 的上限仍有餘裕,所以沿用 1:1,000,000。

前台:分割對照、屬性查詢與十二個月索引

  • 左右分割:兩側共用同一個相機,拖曳分割線即可對照同一位置。使用分區與使用編定是同一制度的粗細兩層,放在同一側切換,比分放左右好讀。
  • 屬性查詢:點選地圖任一處,以 GetFeatureInfo 取得該處的縣市、分區代碼、分類名稱與面積。開發案範圍本身點下去同樣是查詢土地使用屬性而不是翻開圖版,否則被範圍蓋住的那塊地就成了唯一查不到分區的地方。
  • 十二個月索引:下緣十二格月份列,地圖上以環形標記標出十二個開發案。點月份即飛抵該開發案(約 1.1 秒)並翻開當月圖版:衛星影像加上圖說。
  • QR code 深層連結:網址帶月份參數(/?m=月份),開站即飛抵並翻開該月圖版,不必再點任何東西。QR code 在後台產生,可單張下載或一次列印十二格的 A4 表;送印前以 300 dpi 算繪、再用 zbar 解碼器讀回,確認實際掃得到。
  • 手機版面:直式 390 px 寬時,兩側面板收成邊緣標籤,圖版置於上方。
點選任一地塊,回傳縣市、分區代碼、功能分區與面積
點選任一地塊,回傳縣市、分區代碼、功能分區與面積
手機直式版面:兩側面板收成邊緣標籤,圖版置於上方
手機直式版面:兩側面板收成邊緣標籤,圖版置於上方

管理後台:讓不寫程式的同仁更換資料

目標是:更換底圖、月份範圍、月份影像與其他任何設定,都在瀏覽器裡完成,存檔後前台重新整理即生效,不必改程式、不必重建映像檔、不必停機。

  • 兩種模式:一般模式只有三個畫面(狀態、底圖與顏色、每月的影像),對應日常的三件事,也只列出真正需要處理的錯誤;進階模式再加上地圖與後端、檔案、原始 JSON,以及完整的診斷、欄位對應與描邊設定。
  • 更換資料集:shapefile 一格一個副檔名(四個必要、.cpg 選填),缺哪一個一眼看得到,主檔名不一致時擋下;欄位從 DBF 實際的欄位下拉選擇。以 8 MB 分塊上傳,可暫停、斷點續傳;實測 181.8 MB 的真實檔案分 23 塊、3.6 秒傳完,寫入後位元組數與原檔完全相同。
  • 圖例與配色:一鍵補齊資料中有、圖例卻沒有的代碼,中文名稱自動從資料帶出;旁邊即時顯示 GeoServer 依「已發布」與「草稿配色」各畫一張的縮圖,不必先發布就能預覽。
  • 資料檢查:列出 shapefile 缺件、編碼設錯、座標系統不像 TM2、欄位名稱打錯、圖例未涵蓋的代碼、影像未轉檔與需要重跑的流程。分類代碼一律對 DBF 全表掃描:資料依縣市排序,抽樣 2 萬筆在使用編定上只會看到 17 類中的 11 類,而全表掃描 81.7 萬筆只需 612 毫秒。
  • 流程不必記:選了檔案就開始上傳,GeoTIFF 傳完自動轉成 JPEG(長邊 2,400 像素),存檔後自動重產開發案範圍;只有「產生樣式並發布」由人決定時機,因為它會讓 GeoServer 重算整份資料的範圍。發布、產生範圍、預熱快取可一鍵執行,日誌以 SSE 即時串流回瀏覽器。
  • 設定與安全:手寫的設定驗證器把錯誤連同欄位路徑標在輸入格旁;存檔前先備份、再以原子方式寫入,保留最近十份備份。密碼以 scrypt 雜湊、工作階段以 HMAC 簽章,登入失敗遞增鎖定並限制速率;正式環境未設定密碼雜湊時,後台服務拒絕啟動。

一般模式只留三個畫面、上傳與轉檔改為自動觸發,都來自與使用者的往返,並寫成文件中的兩條原則:「看不懂的訊息不會讓人更小心,只會讓人不敢動任何東西」「需要人記得按一下的步驟,就是會被漏掉的步驟」。

後台「底圖:土地使用資料集」:資料檔屬性、逐副檔名上傳、已發布與草稿配色的即時縮圖
後台「底圖:土地使用資料集」:資料檔屬性、逐副檔名上傳、已發布與草稿配色的即時縮圖
後台「檔案」:三份土地使用資料與十二組開發案範圍,逐檔標明被哪一側或哪個月份使用
後台「檔案」:三份土地使用資料與十二組開發案範圍,逐檔標明被哪一側或哪個月份使用

部署與驗證

  • 部署:Docker Compose 三個服務,web(正式環境為 nginx,提供靜態檔並同源代理 WMS 與後台 API)、admin(Node 內建 node:http,零第三方相依)、geoserver;GDAL 與影像轉檔都在容器內執行,主機只需要 docker 與 sh。
  • 端對端檢查共 271 項,在含瀏覽器的容器中執行:前台 126 項(兩側圖磚、分割線、屬性查詢、月曆、圖版)、後台 105 項(登入、存檔後前台真的看到、上傳續傳、診斷、流程與日誌)、登入畫面 25 項、後台版面 15 項(2560 至 360 px 共七個寬度)。當下環境無法驗證的檢查標為「未驗證」,不算通過。
  • 文件:README、專案規範文件(含 43 條「症狀、實測、規則」格式的技術紀錄與完成的定義)、描邊門檻的量測筆記,以及含實測驗證表的工作清單。

時程與版本演進

日期進度
8 月 18 日第一版:非都市土地使用分區與使用編定的左右分割對照
8 月 20 日前後管理後台完成第一輪並實測(含 181.8 MB 大檔分塊上傳)
9 月 9 日右側加入國土功能分區,重新實測描邊門檻
9 月 10 日補入嘉義市,22 縣市 22,329 筆到齊;對正式站台執行端對端測試
9 月 14 日現行版本建置並對外服務
9 月 16 日伺服器紀錄首次出現帶月份參數的 QR code 存取

版本上,初版左右兩側為使用分區與使用編定,月曆名為「2026 衛星影像月曆」,先備妥五個月份、其餘標示「待補」;加入國土功能分區後,右側改為新制,使用分區與使用編定併到左側切換;現行版為「2027 CSRSR 月曆」,十二個月份的範圍與影像全數備齊。

上線與存取紀錄

站台沒有安裝分析工具,以下數字取自 nginx 存取紀錄,觀測區間為 2026 年 9 月 14 日至 22 日(8.5 天);統計只保留彙總數字,不記錄個別 IP。

指標數值
總請求數37,555
不重複來源 IP31 個
頁面載入93 次,來自 26 個來源;行動裝置 67 次、桌機 26 次
其中來自中央大學網段以外47 次
QR code 深層連結(/?m=月份)48 次、10 個來源,全部來自行動裝置;1 至 12 月皆有
圖磚請求(GetMap)36,307 次
屬性查詢(GetFeatureInfo)123 次
衛星影像(JPEG)取用193 次
HTTP 4xx 與 5xx 回應0 次
爬蟲與自動化工具0 次