Python 與 ATAK 的通訊實戰:如何用 TCP 發送動態 CoT 標點

在開發 AI Field Scout (AI 偵查員) 系統的過程中,我們的一個核心需求是:讓 AI Agent 能即時把發現的資訊(例如:附近的便利商店、危險地形、或是沿著路徑移動的隊友)投放到使用者的 ATAK 地圖上。 ATAK (Android Team Awareness Kit) 是一個非常強大的戰術地圖軟體,它使用 CoT (Cursor on Target) 這種 XML 格式來交換訊息。網路上大部分的教學都推薦使用 UDP Multicast,但在實際的開發環境(特別是 Mac 電腦連接 iPhone 熱點,或是複雜的內網環境)中,UDP 經常因為路由、防火牆或廣播限制而撞牆。 經過了一番「通訊地獄」的除錯後,我們總結出了一套最穩定的解決方案:使用 TCP 直連。 這篇筆記將分享如何用 Python 建立一個穩定的 CoT 發送器,讓你的程式碼能直接控制 ATAK 地圖上的標記。 為什麼選擇 TCP 而不是 UDP? 雖然 CoT 的原生設計大量依賴 UDP Multicast 來達到「即插即用」的群組廣播效果,但在點對點(Point-to-Point)的開發測試中,UDP 有幾個痛點: 網路不可靠:在手機熱點或某些 Wi-Fi 設定下,Multicast 封包常被丟棄或過濾。 除錯困難:UDP 是「射後不理 (Fire and Forget)」,程式碼送出去了,你完全不知道對方收到了沒。 路由黑洞:作業系統(特別是 macOS)在多重網路介面下,UDP 出站路由容易走錯路(No route to host)。 相對的,TCP (Transmission Control Protocol) 提供了一個非常明確的機制: ...

2026-01-10 · 3 min · 456 words · Wuulong

WalkGIS 實戰:ATAK 碎裂軌跡合併與 Google My Maps 輕量化指南

在進行長距離的河川探索(如大甲溪、濁水溪)時,我們依賴 ATAK (Android Team Awareness Kit) 作為主要的軌跡記錄工具。然而,在實際作業中遇到了一個痛點: ATAK 為了效能或訊號不穩,常會將一整天的行程自動切分成多個軌跡檔案 (GPX/KML)。 這造成兩個後續應用的問題: 管理困難:一天產生 3-4 個檔案,Day 4 就有三個 GPX (01:31, 04:47, 06:12)。 Data Package 限制:ATAK 的 Data Package 雖然好用,但主要針對靜態圖層 (Points, Shapes),對於「動態軌跡」的打包支援較弱,往往需要手動匯出 GPX。 Google My Maps 拒收:當我們想把這些高精度的原始軌跡整合到 Google My Maps 分享時,會因為點數過多 (Over 2000 points) 而導致上傳失敗或顯示不全。 🛠️ 解決方案:Python 自動化合併與抽稀 為了不僅將檔案「接起來」,還要能「瘦身」給 Google 吃,我開發了一個 Python 腳本來處理這個標準作業程序。 步驟一:處理 Namespace 陷阱 ATAK 輸出的 GPX 檔案,其 XML Namespace 有時會帶有尾端斜線(.../GPX/1/1/),這會導致標準的 Python xml.etree.ElementTree 解析失敗。 解法:寫一個 Helper Function strip_ns(),不管 Namespace 長怎樣,只認標籤名稱(如 trkpt),這樣最穩健。 ...

2026-01-09 · 1 min · 184 words · Wuulong

WalkGIS 實戰:如何製作「有廁所的便利商店」地圖 (Google My Maps + ATAK)

在規劃「2026 台灣河流探索」的過程中,除了路線本身的挑戰,最實際的問題往往是:「哪裡可以補給?」以及更重要的——「哪裡有廁所?」。 雖然 Google Maps 很強大,但要一眼在地圖上看出「哪一家超商有廁所」並不容易。於是,我決定自己動手做一張專屬的地圖,並將其整合到我的主力導航工具 Google My Maps 與 ATAK 中。 🚀 任務目標 取得全台灣便利商店的資料。 篩選出標記為「有廁所」的店家。 製作成 Google My Maps 可以吃的 KML 檔。 打包成 ATAK 可以用的 Data Package。 🛠️ Step 1: 資料來源 - OpenStreetMap (OSM) 相較於政府資料只有地址,OpenStreetMap (OSM) 社群維護的資料包含了更多屬性(如廁所、ATM、品牌)。我使用 Overpass API 來抓取資料。 Python 抓取腳本 (核心邏輯) 我們不需要下載整個台灣的圖資,只需針對 shop=convenience 進行查詢: overpass_query = """ [out:json][timeout:60]; area["name:en"="Taiwan"]->.searchArea; ( node["shop"="convenience"](area.searchArea); way["shop"="convenience"](area.searchArea); ); out center; """ 這段腳本會抓下全台約 13,000+ 筆超商資料。 🧹 Step 2: 現實的殘酷 - 資料篩選 抓下來後,我原本期待能有滿滿的廁所清單,結果進行統計後發現: Total Stores: 13,000+ Toilets = Yes: ~550 Toilets = No: ~150 Toilets = Unknown: 12,000+ 顯然 OSM 上關於廁所的標記還很不普及(填寫率不到 5%)。但換個角度想,這 550 間 是經過熱心網友確認「一定有」廁所的精華名單,對於急需的人來說,這就是最可靠的綠洲。 ...

2026-01-09 · 2 min · 221 words · Wuulong

WalkGIS 實戰:為 ATAK 打造專屬的「河川探索」戰術圖示包

在 上一篇 我們搞定了「有廁所的便利商店」地圖資料。然而,當我們真正走入濁水溪或曾文溪的荒野時,地圖上需要的資訊遠不止這些。 我們需要知道哪裡有攔沙壩 (Weir) 可以觀察水流,哪裡有 吊橋 (Suspension Bridge) 可以跨越峽谷,哪裡有 土地公廟 (Earth God Temple) 可以補給休息。 ATAK 內建的軍規符號太過複雜且抽象,網路上抓的圖示又風格不一。於是,我決定自己動手做一套**「WalkGIS 河川探索專用圖示包」**。 🎯 設計理念:直覺至上 在地圖上(尤其是戶外強光下的手機螢幕),辨識度是第一要務。經過幾次嘗試(從下載 icon 到失敗的 fallback),我發現最有效的方法竟然最簡單: 「直接把字寫在圓圈裡。」 看圖示猜半天這是廟還是房子?不如直接寫個**「廟」**。 這是水壩還是水管?直接寫個**「壩」**。 我將需求分為四大類色系,建立了一套視覺語言: 💚 生存 (Survival) - 綠色:廁、店 (雜貨)、水 (水源)、車 (車宿點) 💙 水利 (Hydro) - 藍色:壩、橋、閘 (水門)、生 (生態點)、景 (觀景) 🧡 人文 (Culture) - 橙/棕:廟 (土地公)、跡 (遺跡)、訊 (解說牌)、村 (部落) ❤️ 危險 (Danger) - 紅色:危 🛠️ 技術實作:Python Pillow 自動繪圖 我寫了一個 Python 腳本 (generate_chinese_icons.py),完全不依賴外部圖片素材,直接用程式碼「畫」出這些圖示。 核心邏輯 定義設定檔:用一個 List 管理所有圖示的名稱、顯示文字與顏色。 字體偵測:自動抓取 macOS 系統內的 PingFang.ttc 或 STHeiti 中文字體。 畫布生成: 建立 64x64 的透明底圖。 畫一個實心圓圈(帶白邊),顏色由設定檔決定。 將中文字置中寫在圓圈上。 ATAK 打包:生成 iconset.xml 並將所有 PNG 壓成 ZIP 檔。 程式碼與成果 # 部分程式碼片段 def create_text_icon(item): # ... 畫圓與寫字 ... draw.ellipse([4, 4, 60, 60], fill=item['color'], outline='white', width=3) draw.text((x, y), item['label'], font=font, fill='white') # ... 存檔 ... 執行後,我得到了一個 River_Exploration_Icons_Text.zip。 ...

2026-01-09 · 1 min · 146 words · Wuulong

2026 大甲溪河流探索 Day 3:從后里到谷關,那些地圖上找不到的隱藏細節

今天的行程很長,從后里平原一路往上游挺進,穿過東勢客家山城,最後抵達群山環繞的谷關。這不僅是海拔的爬升,也是一場對於「地圖準確度」的實戰測試。 同時,我也進行了一場關於 ATAK (Android Team Awareness Kit) 軟體的實戰實驗:到底把資料「打成一包 (Data Package)」對於旅行紀錄有什麼幫助? 旅程就看影片: 🎥 2026 大甲溪河流探索 Day 3 Relive 🗺️ 行程流水帳 (AI 軌跡還原版) 這份行程是透過我從 ATAK 匯出的 GPX 軌跡檔,再請 AI Agent 進行時間與空間分析後還原的結果。有趣的是,因為我只匯出了其中一段軌跡,所以 AI 很誠實地告訴我:「其他行程並沒有在軌跡裡」。 主要步行與活動時段: 09:38 | 📍 老祖早餐灌蛋餅:這蛋餅形狀真的特別,是用灌的,做為本日的起點。「應該是 9:01-9:27(以前)」 09:48 | 📍 東勢客家文化園區:舊車站改建,適合散步。 10:46 | 📍 龍神橋 (東勢區):跨越深邃溪谷的重要橋樑,新舊並存。 10:54 | 📍 東勢林業文化園區:見證大雪山林業的伐木歲月,腹地廣大。 11:40 | 📍 東勢本圳:尋找水利源頭,位置稍微偏離一點,可能是在水圳旁移動。「走去月恆門」 11:48 | 📍 月恆門:非常精確的經過此點,也在此遇見了在地的洗衣文化。 12:43 | 📍 白冷圳紀念公園:向工程師磯田謙雄致敬,偉大的倒虹吸管水利工程。 未在軌跡中的行程(包含開車): 后里環保公園:一早醒來的地方,有點冷,幾無花海。 馬鞍壩、天輪壩:大甲溪中游的兩大壩體。 谷關:本日終點,在此挑戰捎來步道並在路邊車宿。 🧪 技術筆記:ATAK Data Package 實驗 這次旅程我也嘗試了 ATAK 的「Data Package」功能,想說能不能像打包行李一樣,把這次旅行的所有照片、標記點、軌跡通通包成一個檔案分享或備份。結果遇到了一些有趣的技術細節: ...

2026-01-08 · 1 min · 200 words · Wuulong

使用 AI 復活舊版 ATAK 台灣圖資包 (ATAK-Maps-LASS)

最近在整理舊檔案時,翻出了一個好幾年前製作的 ATAK 地圖擴充包 (ATAK-Maps-LASS.zip)。這個懶人包當年整合了 Google、Bing、以及最重要的台灣通用電子地圖與魯地圖,為了讓團隊能快速在 ATAK 建立共同的圖資環境。 沒想到興沖沖地匯入新版 ATAK 後,卻發現無法讀取,甚至連最關鍵的魯地圖都無法顯示。 於是我請了 AI 助手協助除錯,沒想到短短幾分鐘內就找出了結構性問題與連結失效的原因,並協助重新打包修復。這篇文章簡單紀錄一下這次的協作修復過程,並分享這個「復活版」的地圖包給大家。 修復過程:AI 如何解決問題? 1. 修正 ZIP 結構問題 一開始匯入失敗的原因,是資料夾結構多了一層。 原本結構:ATAK-Maps-LASS.zip -> ATAK-Maps-Map/ -> Taiwan_map/ … 正確結構:ATAK 要求資料包的內容(XML 設定檔)必須直接位於壓縮檔的根目錄。 解決:AI 自動協助將目錄攤平並重新打包。 2. 魯地圖 (Rudy Map) 網址失效 這是最棘手的部分。原本的設定檔使用的是 http://rudy.tile.basecamp.tw,但發現: HTTPS 限制:現代 Android 系統與新版 ATAK 預設阻擋明文 HTTP 連線。 DNS 解析失敗:該網址目前似乎無法穩定連線。 解決:經過 AI 搜尋與測試,找到了由 Happyman 維護的穩定鏡像站,並支援 HTTPS 加密連線。我們將設定檔更新為: <url>https://tile.happyman.idv.tw/map/moi_osm/{$z}/{$x}/{$y}.png</url> 地圖包內容與特色 這個修復後的 Data Package 包含了多種實用的線上圖資來源,適合登山、搜救或戶外活動使用: 🇹🇼 台灣在地圖資 (Taiwan_map) 這是此包的精華,針對台灣使用者最佳化: TW_RUDY (魯地圖):登山界必備神圖,包含詳盡的等高線、地形渲染與登山路徑(已更新為 Happyman Mirror)。 TW_EMAP (臺灣通用電子地圖):內政部國土測繪中心官方圖資,準確度最高,林道與地標資訊豐富。 TW_PHOTO (正射影像):高解析度的台灣航照圖。 TW_B5000 (1/5000 基本地形圖):適合需要精密地形判讀的場景。 🌍 全球主流圖資 Google Maps: Hybrid / Satellite:衛星影像與混合圖(含路名)。 Terrain:帶有陰影的地形圖。 Roadmap:標準街道圖。 Bing Maps:微軟的衛星與街道圖,有時在山區的雲層遮蔽狀況比 Google 好。 ESRI: World Topo:ArcGIS 的地形圖,風格精美。 Nat Geo:國家地理雜誌風格地圖。 OSM (OpenStreetMap): Standard:標準開源地圖。 CycleOSM:強調自行車路徑的版本。 OpenTopoMap:基於 OSM 的等高線地形圖。 下載 下載 ATAK-Maps-LASS_Fixed.zip 註:本資料包僅包含 XML 連線設定檔,需在有網路的環境下瀏覽(ATAK 會自動快取瀏覽過的圖磚供離線使用)。 ...

2026-01-04 · 1 min · 127 words · Wuulong

Agentic 實戰:讓 AI 幫我開發 WalkGIS 到 ATAK 的地圖打包功能

這兩天在整理「大安大甲溪聯通管工程」的 WalkGIS 專案資料時,我思考了一個問題:網頁版的 GIS 雖然方便瀏覽,但如果我要去現場勘查,或者需要跟團隊進行離線協作,最專業的工具其實是 ATAK (Android Team Awareness Kit)。 但是,要將 WalkGIS (基於 Markdown 和 KML) 的資料轉移到 ATAK,並不是單純把 KML 丟進去就好。為了最好的使用者體驗,我們需要製作成 Data Package (Mission Package),這樣才能包含版本資訊、圖示設定,甚至自動載入地圖。 如果是以前,我可能需要花幾個小時去翻 ATAK 的技術文件,搞懂 MANIFEST.xml spec,這是最枯燥的部分。 但這次,我嘗試了 Agentic Workflow,讓 AI 來擔任我的「技術研究員」兼「資深工程師」。 1. 任務指派:從模糊到清晰 我一開始甚至不確定 ATAK 的具體格式細節,所以我只問了 Agent: 「你知道 ATAK data package 的格式嗎?」 Agent 不僅幫我搜尋了格式規範,還直接總結出重點: 它是個 Zip 檔。 核心是 MANIFEST/manifest.xml。 需要 UUID 來管理版本。 支援 KML/KMZ 和影像。 2. 實作:一句話生成工具腳本 知道原理後,我並沒有自己寫程式碼,而是直接把專案路徑和需求丟給 Agent: 「我想要將 大安大甲溪聯通管工程計畫 中的所有點位,打包成 data package」 Agent 做了以下幾件事: 掃描我的專案結構:自動找到 static/walkgis_prj/features 下的所有 .md 檔案。 理解資料欄位:解析 Frontmatter 中的 coordinate、title、color。 撰寫 Script:生成了一個 create_2026_daan_dajia_pipeline_atak_pkg.py,完整處理了 KML 生成、XML Manifest 建立、UUID 產生,最後壓縮成 Zip。 整個過程不用 3 分鐘,我就得到了一個可以動的 Python 腳本。 ...

2026-01-02 · 1 min · 148 words · Wuulong