Home
Softono

Immich Geodata Zh Tw

Open source Rust
79
Stars
6
Forks
0
Issues
0
Watchers
2 months
Last Commit

 About Immich Geodata Zh Tw

Immich 反向地理編碼 - 臺灣特化,提供更精確的地理資訊與中文化優化,改善行政區顯示與翻譯準確度。

Platforms

Web Self-hosted Docker

Languages

Rust

Need Help Installing Immich Geodata Zh Tw?

We provide expert installation service for this software. Our team will install, configure, and secure Immich Geodata Zh Tw on your server. plans start at just $30.

Immich Geodata Zh Tw

View on GitHub

Immich 反向地理編碼 - 臺灣特化

[!IMPORTANT]

  • 升級提醒:v3.1.0 整合國教院官方譯名優化全球地名翻譯,並新增印尼圖資(繁體中文在地化);v3.0.0 新增泰國圖資。若您已部署本專案,請在更新後執行「重新擷取照片中繼資料」,以套用最新資料。

繁體中文 | English

本專案為 Immich 提供專為臺灣使用者設計的反向地理編碼優化,根據使用者習慣提供自然且準確的地理資訊顯示。

目前支援:🇹🇼 臺灣 | 🇯🇵 日本 | 🇰🇷 南韓 | 🇹🇭 泰國 | 🇮🇩 印尼 | 🌏 其他地區中文化

設計理念

本專案以「臺灣使用者體驗」為核心,針對不同地區採用最適合的語言策略:

  • 臺灣地區:使用 NLSC 圖資,解決國家與行政區名稱顯示問題
  • 日本地區:使用国土数値情報ダウンロードサイト資料,保留日文原名(漢字+假名),符合臺灣使用者閱讀習慣
  • 南韓地區:使用 admdongkor 專案資料,提供繁體中文翻譯,符合臺灣使用者閱讀習慣
  • 泰國地區:使用 COD-AB 官方邊界資料,提供 Admin1/Admin2 繁中翻譯,並以官方英文與泰文作為 fallback
  • 印尼地區:使用 BIG(印尼地理空間資訊局)官方村級圖資,提供 Admin1/Admin2 繁中翻譯,缺中文標籤時回退 BIG 官方印尼文
  • 其他地區:優先採用國家教育研究院《外國地名譯名》的官方臺灣譯名補洞與升級,其次使用 GeoNames 翻譯,確保資訊可讀性(無對照譯名則回退至英文)

使用前後對比

使用前後對比

目錄

支援地區與語言策略

本專案根據臺灣使用者的閱讀習慣,對不同地區採用最合適的語言處理策略:

地區 語言策略 資料來源 說明
🇹🇼 臺灣 繁體中文(官方名稱) NLSC 國土測繪中心 優化地理資料;解決國家與行政區顯示名稱錯誤的問題
🇯🇵 日本 日文原名(漢字+假名) 国土数値情報ダウンロードサイト 優化地理資料;以日文原名顯示
🇰🇷 南韓 繁體中文翻譯 admdongkor(官方行政區邊界) 優化地理資料;提供繁體中文翻譯
🇹🇭 泰國 繁體中文翻譯(官方英文 / 泰文 fallback) COD-AB Thailand 優化地理資料;以官方行政區邊界計算行政區中心點
🇮🇩 印尼 繁體中文翻譯(BIG 官方印尼文 fallback) BIG(Badan Informasi Geospasial) 優化地理資料;以村級邊界計算行政區中心點,涵蓋 38 省
🌏 其他 繁體中文翻譯 國教院官方譯名 → GeoNames 翻譯 → GeoNames 英文 優先使用國教院官方臺灣譯名,若無則使用 GeoNames 資料

為什麼日本保留日文? 臺灣使用者普遍熟悉日文漢字與假名的組合,「横浜市」與「橫濱市」相比不容易造成辨識困難,「うるま市」亦不會影響普遍臺灣用戶的理解。

資料來源

本專案使用的地理數據主要來自以下來源:

  1. GeoNames (geonames.org)
    • 授權: Creative Commons Attribution 4.0 International (CC-BY 4.0)
    • 用途: 作為全球地理位置的基礎數據庫
  2. OpenStreetMap (透過 LocationIQ)
    • 授權: Open Database License (ODbL) 1.0
    • 用途: 透過 LocationIQ API 取得臺灣、日本、南韓、泰國、印尼以外地區的反向地理編碼資料
    • 聲明: Data © OpenStreetMap contributors, ODbL 1.0
  3. 中華民國國土測繪中心 (NLSC)
    • 來源: 國土測繪中心開放資料平台
    • 資料集: 村(里)界 (TWD97經緯度), 版本 1140620
    • 授權: 政府資料開放授權條款-第1版
    • 用途: 作為臺灣地區村里界線及行政區名稱的主要數據源,確保資料的準確性與權威性
  4. 国土数値情報ダウンロードサイト
  5. admdongkor
    • 來源: admdongkor
    • 資料集: 南韓官方行政區邊界資料(GeoJSON 格式)
    • 授權: 無額外限制(作者建議標示出處,詳見 NOTICE.md
    • 用途: 作為南韓地區行政區邊界與名稱的主要數據源
  6. Thailand COD-AB
    • 來源: HDX Thailand Subnational Administrative Boundaries
    • 資料集: Thailand administrative level 0-3 boundaries (COD-AB)
    • 授權: Creative Commons Attribution for Intergovernmental Organisations (CC BY-IGO)
    • 用途: 作為泰國地區行政區邊界與名稱的主要數據源
  7. 印尼地理空間資訊局(BIG,Badan Informasi Geospasial)
    • 來源: BIG 官方 ArcGIS REST FeatureServer(desa 村級圖徵服務)
    • 資料集: 印尼行政區 desa(村級)邊界,版本 TASWIL20230928,含 38 省全量資料
    • 授權: 印尼官方公開地理資料(本專案僅作衍生加工輸入,不散布原始向量圖資)
    • 用途: 作為印尼地區行政區邊界與名稱的主要數據源
  8. 國家教育研究院《外國地名譯名》
  9. 其他參考資料
    • 中華民國經濟部國際貿易署 & 中華民國外交部: 作為部分國家/地區中文譯名的參考來源

[!NOTE] 完整的資料來源聲明與授權資訊請參閱 NOTICE.md

[!NOTE] 由於 Immich 的反向地理解析功能基於其載入的資料庫,並採用最近距離原則匹配地名,部分結果可能無法完全精確,或與預期不同。例如:

  • 邊界附近的座標可能被判定為鄰近的行政區
  • 某些小型島嶼或特殊地理位置可能無法精確對應

使用方式

本專案支援以下兩種部署方式:

  1. 整合式部署(適用於 Immich 的 docker-compose 部署,可確保容器啟動時自動載入最新的臺灣特化資料)。

  2. 手動部署(適用於自訂部署環境,可手動下載並配置特化資料)。

整合式部署(推薦,方便後續更新)

  1. 修改 docker-compose.yml 配置
    immich_server 服務內新增 entrypoint 設定,使容器啟動時自動下載最新地理資料:

    services:
      immich_server:
       container_name: immich_server
    
       # 其他配置省略
    
       entrypoint: [ "tini", "--", "/bin/bash", "-c", "bash <(curl -sSL https://github.com/RxChi1d/immich-geodata-zh-tw/releases/latest/download/update_data.sh) --install && exec start.sh" ]
    

    [!NOTE]

    • entrypoint 會在容器啟動時先執行本專案的 update_data.sh 腳本,自動下載並配置臺灣特化資料,隨後執行 Immich 伺服器的 start.sh 啟動服務。
    • 整合式部署也支援指定特定版本下載,詳情請參考 指定特定版本 章節。
  2. 重啟 Immich
    執行以下命令以重啟 Immich:

    # 如果使用 docker-compose 部署
    docker compose down && docker compose up
    
    • 啟動後,檢查日誌中是否顯示 10000 geodata records imported 等類似訊息,確認 geodata 已成功更新。
    • 若未更新,請修改 geodata/geodata-date.txt 為一個更新的時間戳,確保其晚於 Immich 上次加載的時間。
  3. 重新提取照片元數據
    登錄 Immich 管理後台,前往 系統管理 > 任務,點擊 提取元數據 > 全部,以觸發照片元數據的重新提取。完成後,所有照片的地理資訊將顯示為中文。
    新上傳的照片無需額外操作,即可直接支援中文搜尋。

手動部署

  1. 修改 docker-compose.yml 配置
    volumes 內新增以下映射(請依據實際環境調整路徑):

    volumes:
      - /mnt/user/appdata/immich/geodata:/build/geodata:ro
      - /mnt/user/appdata/immich/i18n-iso-countries/langs:/usr/src/app/server/node_modules/i18n-iso-countries/langs:ro
    

    [!NOTE] 若使用 Immich < 1.136.0 版本,請將第二行改為:
    /mnt/user/appdata/immich/i18n-iso-countries/langs:/usr/src/app/node_modules/i18n-iso-countries/langs:ro

  2. 下載臺灣特化資料
    提供以下兩種下載方式:

    (1) 自動下載
    參考本專案中的 update_data.sh 腳本,修改 DOWNLOAD_DIR 為存放 geodata 和 i18n-iso-countries 的資料夾路徑,並執行腳本:

    bash update_data.sh
    

    [!NOTE]

    • 手動部署也支援指定特定版本下載,詳情請參考 指定特定版本 章節。
    • UnRAID 使用者可以通過 User Scripts 插件執行腳本。

    (2) 手動下載
    前往 Release 頁面 查找所需的版本,下載對應的 release.tar.gzrelease.zip,並將其解壓縮至指定位置。

  3. 重啟 Immich 和重新提取照片元數據
    整合式部署的步驟 2、3 相同。

指定特定版本

在某些情況下(例如最新的 release 出現問題),你可能需要下載或回滾到特定的 release 版本。本專案的更新腳本支援透過 --tag 參數來指定要下載的 release tag。

如何找到可用的 Tag? 請前往本專案的 Releases 頁面 查看所有可用的 release tag 名稱(例如 v2.2.4, nightly 等)。

使用範例:

  1. 整合式部署 (docker-compose.yml 中的 entrypoint)entrypoint 的指令後面加上 --tag <tag_name>

    entrypoint: [ "tini", "--", "/bin/bash", "-c", "bash <(curl -sSL https://github.com/RxChi1d/immich-geodata-zh-tw/releases/download/<tag_name>/update_data.sh) --install --tag <tag_name> && exec start.sh" ] 
    

    <tag_name> 分別替換為你想要下載的具體 tag 名稱。如果省略 --tag,則預設下載最新的 release (latest)。

  2. 手動部署 (update_data.sh) 執行腳本時加上 --tag <tag_name>

    bash update_data.sh --tag <tag_name>
    

    <tag_name> 替換為你想要下載的具體 tag 名稱。如果省略 --tag,則預設下載最新的 release (latest)。

[!NOTE] 腳本會先驗證指定的 tag 是否存在於 GitHub Releases,如果 tag 無效則會提示錯誤並終止執行,因此請在執行前確保 tag 有效。

行政區優化策略

🇹🇼 臺灣地區優化

  • 官方圖資為核心:使用 NLSC 村(里)界圖資,確保資料權威性
  • 優化國家與行政區名稱:解決 Immich 原生資料中「臺灣」顯示為「中國臺灣省」且缺失多數縣市名稱的問題
  • 行政區層級優化:優化 Admin1(直轄市/省轄縣市)與 cities500(地名資料)

📖 詳細的臺灣資料處理邏輯請參閱 臺灣行政區處理文檔

🇯🇵 日本地區優化

  • 保留日文原名:維持漢字+假名組合(如「静岡県」而非「靜岡縣」)
  • 行政區細分處理:普通市、特別區、政令指定都市、東京都特別區部等均有適當處理
  • 郡轄町村智慧處理:自動判斷是否需要郡名前綴,避免同名衝突

📖 詳細的日本行政區處理邏輯請參閱 日本行政區處理文檔

🇰🇷 南韓地區優化

  • 繁體中文翻譯:從 admdongkor 專案提取官方行政區邊界並自動翻譯為繁體中文
  • 行政區命名優化:廣域市統一加「市」字(首爾市、釜山市、大邱市等)
  • 特殊行政區處理:濟州道與濟州市區分、世宗市採用業界通用譯名
  • 行政層級處理:自動拆分「市+區/郡」結構,支援特殊行政結構

📖 詳細的南韓行政區處理邏輯請參閱 南韓行政區處理文檔

🇹🇭 泰國地區優化

  • 官方邊界資料:使用 COD-AB tha_admin3 sub-district / tambon 邊界資料
  • 繁體中文翻譯:Admin1/Admin2 使用 Wikidata translator,缺少中文結果時回退 COD-AB 官方英文與官方泰文
  • 最近距離最佳化:使用 Thailand Albers 投影計算幾何中心點,提升 Immich 最近點反向地理解析命中率
  • 座標策略驗證:不使用 COD-AB 內建 center_lat / center_lon 作為預設,因其較接近官方代表點而非最近點模型下的最佳單點

📖 詳細的泰國行政區處理邏輯請參閱 泰國行政區處理文檔

🇮🇩 印尼地區優化

  • 官方村級圖資:使用 BIG(Badan Informasi Geospasial,印尼地理空間資訊局)官方 ArcGIS REST 服務發布的 desa(村級)邊界資料(版本 TASWIL20230928,含 38 省全量 83,461 筆可用 feature)
  • 繁體中文翻譯:Admin1(省)與 Admin2(縣/市)使用 Wikidata translator 並以 P131 行政隸屬逐級驗證;缺少可靠中文標籤時回退 BIG 官方印尼文原文,Admin3(郡)/ Admin4(村)則保留印尼文原文
  • 三時區解析:依 38 省 per-province 對照表解析印尼三時區(WIB Asia/Jakarta、WITA Asia/Makassar、WIT Asia/Jayapura
  • 最近距離最佳化:使用印尼 Albers 等積投影(+lat_1=1 +lat_2=-8 +lon_0=118)計算幾何中心點;multipart polygon 每個 part 各出一列,提升群島地形的最近鄰命中率(admin2 命中率 96.99%)

📖 詳細的印尼行政區處理邏輯請參閱 印尼行政區處理文檔

🌏 其他地區優化

  • 國教院官方譯名:整合國家教育研究院《外國地名譯名》(64,000+ 筆官方臺灣譯名),以名稱正規化匹配搭配座標驗證,為全球地名補洞並升級為官方譯名
  • 信心分級保護:高信心(國碼一致+距離合格+無歧義)才覆寫既有譯名;具弱化訊號(地物標記、近距歧義等)僅補洞;無法消歧時保守放棄,杜絕同名錯配
  • GeoNames 後備:無官方譯名時使用 GeoNames 中文資料(經 OpenCC 轉換為臺灣正體),再無則回退英文

📖 詳細的全球翻譯處理邏輯請參閱 全球翻譯處理文檔

更新地理資料

整合式部署

只需重新啟動 Immich 容器,即可自動更新地理資料。

手動部署

  1. 下載最新 release.zip,並解壓至指定位置。

  2. 重新提取照片元數據(與「使用方式-手動部署」相同)。

開發者:本地資料處理

1. 安裝依賴

本機 production 資料處理預設使用 Rust CLI。請先安裝 Rust toolchain,並確認系統可使用 unzippkg-config 與 PROJ development library(例如 Ubuntu 的 libproj-dev)。

官方預編譯 Binary

GitHub Releases 目前只提供 Linux x86_64 的預編譯 Rust CLI binary,主要供 GitHub Actions、Linux server 與 Immich container 類環境使用。macOS 與 Windows 目前請使用本地編譯方式。

本地編譯 Rust CLI

如需在非 Linux 環境或自訂 Linux 環境執行資料處理,請先安裝 Rust toolchain 與 PROJ development library,再執行:

cargo build --release

編譯完成後,binary 會位於:

target/release/immich-geodata

也可以直接用 cargo run 執行:

cargo run --release -- help

2. 提取原始地理資料

如果你需要處理新的國家或更新現有的地理資料來源,可以使用 extract 命令從 Shapefile 或 GeoJSON 提取資料。此步驟是選用的,僅在需要更新資料來源時執行。

臺灣資料提取

資料來源:國土測繪中心(NLSC)

# 1. 下載「村(里)界(TWD97經緯度)」資料並解壓縮
# 2. 執行提取命令
cargo run --release -- extract --country TW \
  --shapefile geoname_data/VILLAGE_NLSC_1140825/VILLAGE_NLSC_1140825.shp \
  --output meta_data/tw_geodata.csv

日本資料提取

資料來源:国土数値情報

# 1. 下載「行政区域データ(世界測地系)」並解壓縮
# 2. 執行提取命令
cargo run --release -- extract --country JP \
  --shapefile geoname_data/N03-20250101_GML/N03-20250101.shp \
  --output meta_data/jp_geodata.csv

南韓資料提取

資料來源:admdongkor

# 1. 從 admdongkor 專案下載官方行政區邊界資料並解壓縮
# 2. 執行提取命令
cargo run --release -- extract --country KR \
  --shapefile geoname_data/HangJeongDong_verYYYYMMDD.geojson \
  --output meta_data/kr_geodata.csv

泰國資料提取

資料來源:Thailand COD-AB

# 1. 下載 tha_admin_boundaries.shp.zip 並解壓縮
# 2. 使用 tha_admin3.shp 提取 Admin 3 / Tambon 邊界資料
cargo run --release -- extract --country TH \
  --shapefile geoname_data/tha_admin_boundaries/tha_admin3.shp \
  --output meta_data/th_geodata.csv

泰國提取會讀取或建立 geoname_data/TH_wikidata_cache.json,用於 Admin1/Admin2 繁中翻譯;Admin3 目前保留 COD-AB 官方英文。

提取完成後,執行 Rust release 時會自動整合這些資料。

印尼資料提取

資料來源:BIG(Badan Informasi Geospasial)官方 ArcGIS REST FeatureServer

# 1. 從 BIG 官方 REST 服務以分頁方式下載 desa 村級圖資(geometryPrecision=6,版本 TASWIL20230928)
#    下載方式與固定參數請參閱 docs/research/indonesia-handler.md
# 2. 執行提取命令
cargo run --release -- extract --country ID \
  --shapefile <path_to_BIG_desa_geojson> \
  --output meta_data/id_geodata.csv

印尼提取會讀取或建立 geoname_data/ID_wikidata_cache.json,用於 Admin1(省)/ Admin2(縣市)繁中翻譯;Admin3(郡)/ Admin4(村)保留 BIG 官方印尼文。詳細下載流程與固定參數請參閱 印尼 handler 研究文件

提取完成後,執行 Rust release 時會自動整合這些資料。

3. 完整資料處理流程

完成資料提取(或使用現有的資料)後,可以執行完整的資料處理流程來生成 release。

註冊 LocationIQ API

LocationIQ 註冊帳號,並取得 API Key。

執行資料處理

cargo run --release -- release \
  --locationiq-api-key "YOUR_API_KEY" \
  --country-code "US"

[!NOTE]

  • 可以通過 cargo run -- help 查看更多選項。
  • --country-code 參數可指定需要處理的國家代碼,多個代碼之間使用空格分隔。
  • 臺、日、韓、泰、印(TW/JP/KR/TH/ID)已改由官方圖資 handler 產生,無需也不應以 LocationIQ 處理;此流程僅用於為其他國家產生 metadata。

[!WARNING]

  • 由於 LocationIQ 的 API 有請求次數限制 (可登入後於後台查看),因此請注意要處理的國家的地名數量,以免超出限制。
  • 本專案允許 LocationIQ 反向地理編碼查詢的進度恢復,若超過當日請求限制,可於更換 api 金鑰或次日繼續執行。
    • 需加上 --pass-cleanup 參數,以取消重設資料夾功能: cargo run --release -- release --locationiq-api-key "YOUR_API_KEY" --country-code "US" --pass-cleanup

4. Rust 驗證

Rust CLI 提供 dry-run contract,可在不呼叫外部 API 或下載網路的情況下驗證 release orchestration:

cargo run -- release \
  --dry-run \
  --locationiq-api-key "fixture" \
  --country-code "KR" "TH" \
  --batch-size 100 \
  --locationiq-qps 2

需要驗證 release archive 與 update_data.sh 所需目錄結構時,可使用 fixture mode 產生本地 smoke artifact:

cargo run -- release \
  --fixture-mode \
  --pass-locationiq \
  --output-folder /tmp/rust-release-smoke

目前 release 與 nightly production workflow 已切換為 Rust production path,並保留 Rust fixture release smoke 作為前置檢查。真實 GeoNames/Natural Earth 下載與 LocationIQ quota path 的自動測試仍需使用 fixture、stub 或明確 dry-run gate。

致謝

本專案基於 immich-geodata-cn 修改,特別感謝原作者 ZingLix 的貢獻。

授權條款

本專案採用 GPL 授權。