開發日誌 #1 - 核心功能開發與圖片品質優化
這次做了什麼?
最近遇到一個很實際的需求:想要根據經緯度和地面範圍,自動抓取高品質的衛星地圖圖片。聽起來簡單對吧?但魔鬼藏在細節裡。
我想要的是「純淨」的衛星影像——就是那種什麼標記、控制按鈕、版權標籤都沒有的純圖片。而且要能精確控制範圍,比如說我要台北 101 周圍 300 公尺的區域,就是 300 公尺,不多也不少。
更關鍵的是,我希望圖片的像素和實際地面距離能夠對應:300 公尺的範圍就輸出 300 像素的圖片。這樣的話,1 公尺在現實世界就等於圖片裡的 1 像素,之後要做任何測量或分析都超方便。
最後做出來的是一個命令行工具,用法超簡單:
只要輸入經緯度和想要的範圍邊長,工具就會自動幫你生成高品質的衛星地圖圖片。整個過程只要 3 到 10 秒,視範圍大小而定。目前支援從 100 公尺到 2000 公尺的範圍,基本上涵蓋了大部分的使用場景。
用了哪些技術?
一開始在技術選型上其實糾結了一陣子。Google Maps API?要錢而且有使用限制。做個網頁應用?感覺太重了,我只是想抓個圖而已。桌面應用?又要考慮跨平台問題…
最後選擇了「命令行工具 + 開源免費方案」這條路,主要是因為:
- 簡單直接,不用架設伺服器
- 完全免費,沒有 API 使用限制
- 可以快速迭代,想改就改
技術棧的核心是 Folium 這個 Python 地圖庫。它可以生成互動式地圖的 HTML,而且支援各種衛星圖層。我選用的是 Esri World Imagery,品質相當不錯,重點是免費開放使用。
但 Folium 只能生成網頁地圖啊,怎麼變成圖片呢?這就要靠 Selenium 了。它原本是用來做網頁自動化測試的,但我拿來開無頭瀏覽器 (headless browser),把 Folium 生成的地圖載入後截圖。配合 webdriver-manager,連 ChromeDriver 都不用手動下載,全自動處理。
圖片處理的部分用的是 Pillow,主要負責裁切圖片。因為瀏覽器截圖會抓到整個視窗,但我只要中間那塊精確範圍的區域,所以需要算出座標然後精確裁切。
最後還用到 geopy 來處理地理座標計算。比如說我要知道某個點往北 150 公尺的座標是多少,geopy 的 geodesic 就派上用場了。
整個技術選擇的原則就是:能用現成的就不自己寫,能免費的就不花錢,能簡單的就不搞複雜。
遇到什麼挑戰?
說實話,這個專案踩的坑比預期多不少。
第一個大坑是圖片品質問題。 一開始用預設設定跑出來的圖片,小範圍 (300 公尺) 還可以,但只要範圍一大到 1000 公尺,整張圖就糊成一團。我的第一反應是:難道免費的衛星圖就這品質?
後來才發現問題出在「縮放層級」(zoom level)。地圖的 zoom level 決定了你看地圖的高度,數字越大代表越接近地面,細節就越清楚。但是,當你要看的範圍越大,Folium 預設會降低 zoom level 來把整個區域塞進畫面。
解決方法是手動提高 zoom level 2 到 3 級,然後把瀏覽器視窗開得比目標圖片大 (開兩倍大),最後再用高品質演算法 (LANCZOS) 縮小回目標尺寸。這樣一來,即使是 2000 公尺的大範圍,細節也很清晰。
第二個坑是座標轉換。 你可能會想:知道中心點經緯度和範圍,不就能算出四個角的座標嗎?但實際上,經緯度是球面座標,而圖片是平面的。要把地圖上的某個點轉換成圖片上的像素位置,需要用 Web Mercator 投影公式。
我花了不少時間研究這個投影轉換,最後寫了一組函數來處理經緯度轉像素的計算。這樣才能精確裁切出我要的區域,不多也不少。
第三個坑其實很小但很煩人: Windows 的中文編碼問題。 因為工具會在終端輸出一些中文訊息,結果在某些環境下會亂碼。解決方法是在程式開頭設定 UTF-8 編碼輸出,雖然是小問題但花了一些時間 debug。
還有一個有趣的設計決策:一開始我設計的參數是輸入「面積」,但後來發現這樣很不直覺。如果我說我要 90000 平方公尺的區域,你第一時間會知道這是多大嗎?所以後來改成直接輸入「邊長」,300 公尺就是 300 公尺,直覺多了。
下一步
目前這個工具已經可以穩定運作了,基本功能都完整。但如果要說還能做什麼改進的話:
- 加入批次處理功能: 一次輸入多組座標,自動生成多張圖片
- 支援不同的衛星圖層: 讓使用者可以選擇不同的衛星影像來源
- 加入快取機制: 相同座標和範圍不用重複下載
- 輸出格式選項: 目前只支援 PNG,也許可以加入 JPEG、GeoTIFF 等格式
不過老實說,目前這個版本已經滿足我的需求了。有時候「夠用就好」比「追求完美」更重要,對吧?
整個開發過程大概花了一個下午的時間,從討論方案到最後優化品質。雖然遇到不少技術挑戰,但每次解決一個問題都很有成就感。特別是看到那張清晰的台北 101 衛星圖片跑出來的時候,覺得一切都值得了。
返回 專案首頁