---
tags: wikidata, address, OpenStreetMap
---
# 臺中市門牌資料匯入作業
## 引子
目前政府資料開放平台(data.gov.tw)中,臺中市和臺南市等兩個地方政府已率先公開戶政系統的門牌座標資料集。
三月上旬,經臺中市政府資訊中心的趙先生與社群接洽後,決定先行匯入臺中市的門牌資料集到OSM中。本筆記旨在紀錄作業過程,並提供討論和回饋的空間。
## 資料集
- 在目前時間點,最新資料為110年二月份。
- 政府資料開放平台上的資料集連結為: https://data.gov.tw/dataset/137998
- 資料筆數為1,191,053,也就是119萬個門牌點位。
- 使用資料集提供的[CSV格式檔案](https://datacenter.taichung.gov.tw/swagger/OpenData/46e642ac-6829-473b-ae8a-486515dc6544)進行處理,檔案大小為130MB
原始資料格式如下:
省市縣市代碼|鄉鎮市區代碼|村里|鄰|街_路段|地區|巷|弄|號|TWD97橫坐標|TWD97縱坐標|WGS84經度|WGS84緯度
| -------- | -------- | -------- |-------- | -------- | -------- |-------- | -------- | -------- |-------- | -------- | -------- | -------- |
66|6601800|員林里|007||大林|322巷||35號|214924.1924|2682213.1004|120.654590162|24.2451180475
66|6601400|文化里|011|中興路||67巷|28弄|21號四樓之5|202758.3428|2683046.3807|120.534761999|24.2523226275
## 作業流程
- 使用`curl`, `perl`和其它GNU基本工具,搭配Makefile撰寫腳本。
適用於**Linux**、**Mac OS**,以及 **Windows**中的 `git-bash` 或 `WSL`,不需特別安裝額外套件或程式。
- 腳本內容包含:
1. 下載資料集
2. 過濾資料
3. 轉換為OSM物件(node)格式
4. 依序上傳所有物件(包含changeset創建、上傳osc格式檔案、關閉changeset)
- 腳本撰寫於**Github gist**,連結為:
https://gist.github.com/typebrook/c03326c77541733045331183c46032c3#file-makefile
- 使用者能以`make [FILE]`形式輸入指令,依序產生相關檔案。
## 資料處理方式
- 有關各筆門牌資料的匯入,標記方式參照Rex、李昕迪等人2015年於hackpad上的討論,連結可見:https://hackmd.io/@osm-tw/address
- 含有特殊字元`■`,`?`,`∮`的資料,一律過濾掉。這可能是戶政人員在登記或轉換上的筆誤
### 座標
|TWD97橫坐標|TWD97縱坐標|WGS84經度|WGS84緯度
| -------- | -------- | -------- |-------- |
|214924.1924|2682213.1004|120.654590162|24.2451180475
|202758.3428|2683046.3807|120.534761999|24.2523226275
第十二、十三欄的經緯度用作node物件的座標,第十、十一欄的TWD97座標捨去不用。
### 省市縣市代碼
省市縣市代碼|
| --- |
66|
第一欄的`省市縣市代碼`,其值皆為`66`。
全部標記為`addr:city`=`臺中市`
### 鄉鎮市區代碼
鄉鎮市區代碼|
| -------- |
6601800|
6601400|
第二欄的`鄉鎮市區代碼`,與實際行政區的對應關係記載於檔案[`district.list`](https://gist.github.com/typebrook/c03326c77541733045331183c46032c3#file-district-list)。
標記範例如:`addr:district`=`中區`。
所有代碼與直轄市區的對照如下:
```
6600100,中區
6600200,東區
6600300,南區
6600400,西區
6600500,北區
6600600,西屯區
6600700,南屯區
6600800,北屯區
6600900,豐原區
6601000,東勢區
6601100,大甲區
6601200,清水區
6601300,沙鹿區
6601400,梧棲區
6601500,后里區
6601600,神岡區
6601700,潭子區
6601800,大雅區
6601900,新社區
6602000,石岡區
6602100,外埔區
6602200,大安區
6602300,烏日區
6602400,大肚區
6602500,龍井區
6602600,霧峰區
6602700,太平區
6602800,大里區
6602900,和平區
```
### 村里
| 村里 |
| ------ |
| 員林里 |
| 文化里 |
第三欄的`村里`,直接使用原始文字。
標記範例如:`addr:hamlet`=`大城里`。
### 鄰
|鄰|
| --- |
|007|
|011|
第四欄的`鄰`,使用原始數字並刪去開頭的`0`,例如:
- 015 -> 15鄰
標記範例如:`addr:neighbourhood`=`15鄰`。
### 街_路段、巷、弄
| 街_路段 | 巷 | 弄 |
|:----------:| -------- | ------ |
| 中興路 | 67巷 | 28弄 |
| 成功路 | 306巷 | |
| 崇德十一路 | | |
| | 322巷 | |
第五、七、八欄的`街_路段`、`巷`和`弄`使用`addr:street`標記。處理規則如下:
- `街_路段`大致使用原始文字,保留中文數字,將全型數字改為半型數字。例如:
- 工業區十七路 -> 工業區十七路
- 豐原大道四段三0三街 -> 豐原大道四段三0三街
- `巷`大致使用原始文字,將全型數字改為半型數字。例如:
- 39巷 -> 39巷
- `弄`大致使用原始文字,將全型數字改為半型數字。例如:
- 5弄 -> 5弄
- 接著再將上述三者按順序結合
標記範例如:`addr:street`=`黎明路一段1086巷37之1弄`。
### 地區
|地區|
| --- |
|大林|
|豐西|
|貿易北一巷|
|龍興三莊|
第六欄的`地區`,直接使用原始文字並套用`addr:place`標籤。
標記範例如:`addr:place`=`春社東巷`
### 號
將第九欄的值切開,分別套用至`addr:hournumber`、`addr:floor`和`addr:unit`,原則上會將中文小寫數字和全型數字轉換為半型數字,並保留其它原始文字。可能有以下型式:
- 402號十一樓之1 -> `addr:houenumber`=`402號 `, `addr:floor`=`11樓`,`addr:unit`=`之1`
- 66之1號 -> `addr:houenumber`=`66之1號`
- 33號之2三樓 -> `addr:houenumber`=`33號之2`, `addr:floor`=`3樓`
- 190 -> `addr:houenumber`=`190`
- 758號地下一層之1 -> `addr:houenumber`=`758號`, `addr:floor`=`地下1層`, `addr:unit`=`之1`
其它資料集所包含的格式,可以使用指令`make number.format`, `make floor.format` 和 `make details.format`查看去掉數字後的結果,其輸出如下:
```bash=
> make number.format
⋮
X
XA
XA號
XB
XB號
X之
X之X
X之XA號
X之XB號
X之X之X之X號
X之X之X號
X之X號
X之X號X號
X之號
X心市場X之X號
X心市場X號
⋮
> make details.format
⋮
之X
之XA
之X,之X
之X之X
之X之X之X
之X室
A室
B
之X附X
⋮
```
## 上傳方式
考慮到資料數量,採用多個changeset進行上傳,每個changeset約含1000~5000個物件,並以行政區來分組。可以直接使用以下指令進行:
`make [行政區].commit`
舉例來說,要上傳大肚區的地址資料,可以使用以下指令:
`make 大肚區.commit`
若想要省略OSM帳號密碼的輸入,可以改為輸入:
`OSM_USER_PASSWD=[YOUR ACCOUNT]:[YOUR PASSWD] make 大肚區.commit`
考量到人為失誤,上傳目標預設為測試伺服器(master.apis.dev.openstreetmap.org)。若需要上傳到真正的伺服器(openstreetmap.org),則需要加上額外變數:
`EXTRA='--serious' make 大肚區.commit`
## 討論事項
1. 資料集中含有一些奇怪格式,我將注意到的例子放在檔案[`notice`](https://gist.github.com/typebrook/c03326c77541733045331183c46032c3#file-notice)中。
2. 可能是因為在同一棟大樓,不同門牌會有相同的座標,是否該將它們全部匯入?或者僅保留一個較大的單位即可?