2017年11月16日 星期四

用 TGOS 全國門牌地址定位服務繪製全家便利商店全國門市地圖

想要繪製某大規模連鎖店的全國門市地圖。 全家門市查詢 有簡單的靜態網頁, 最容易處理, 那就決定用全家當範例了。 用 wget 把所有網頁抓下來, 如 FamilyMart.tgz (打包壓縮檔)。

再從所有網頁當中撈出每個門市的店名、 電話、 地址:

for f in familymart*-*.html ; do extract.php -s 'blockquote div div tr td' < $f | perl -pe 's/<td.*?>/<td>/g; s/\n//g' | perl -pe 's#(服務代號.*?</td>)#\n#g' | perl -pe 's#</td><td>#,#g; s#^<td>##; s#,$##' | grep -v '<img' ; done > tmp.csv
sort -t ',' -k 2 tmp.csv | uniq | todos | iconv -f utf8 -t big5 > FamilyMart-addr.csv

想要了解第一句, 建議先把迴圈剝掉, 只拿一個檔案來測試。 它首先用到 extract.php 把各門市的基本資訊抓出來, 再來那句 perl 先把所有資料擠成一列、 又在每個 「服務代號」 的尾巴重新斷列, 最後把多餘的標籤刪掉。 第二句先去除重複的門市, 再轉成 dos 格式 (需要安裝 tofrodos 套件), 又轉成 big5 編碼。 再手工小整理一下, 例如因為下面要用到的定位服務規定: 第一欄可任填但第二欄必須是地址, 所以把每列的第一個逗點改成別的標點符號, 最後得到 FamilyMart-addr.csv (已放入上述打包壓縮檔內)。

再到 地理資訊圖資雲服務平台 註冊一個帳號。 在 「全國門牌地址定位服務」 功能裡, 每次可以查詢一筆資料。 但我們需要用到 (查詢按鈕下面的) 第三個分頁的 「批次門牌地址比對服務」 功能。 這必須要另外申請才能用。 從 「資料申請」 => 「服務申請」 進去, 在 「關鍵字」 欄填 「地址」, 搜尋到 內政部資訊中心所提供的 「批次地址比對服務」, 給他申請下去。 隔幾天通過後就會收到通知。

使用批次地址比對服務 再回到 「批次地址比對服務」, 照著右邊紫色底的 「要如何取得 API Key」 把申請到的 API Key 剪貼進去。 根據 這一篇, OSM 採用 WGS84 (EPSG 4326) 座標系統。 然後上傳 FamilyMart-addr.csv 試算表。 又把底下的比對參數調到最寬鬆。 最後按下 「進行批次比對」。

如果失敗, 出現錯誤訊息, 修正後要記得再調整一次下方幾個比對參數, 不然它會變得很嚴格。 我遇過的錯誤包含: 重複的列、 utf8 編碼、 unix 文字檔格式、 欄位錯誤等等。 所以上面有做 uniq、 todos、 iconv、 刪除第一個逗點等等處理。

經過幾小時之後, 就會從 e-mail 收到下載的網址。 取回的檔案如打包壓縮檔當中的 FamilyMart-coords.csv。 其中有些列一欄當中有許多組地址及座標用分號分開, 大概就是因為 「允許模糊比對」 所以抓到好幾個近似的點。 我用 fromdos < FamilyMart-coords.csv | grep -Pv ';|找不到|Incorrect syntax' | sed 's/#/,/' > FM-coords.csv 過濾掉有問題的列。 有了這個 csv, 就可以進一步把 csv 轉 geojson 然後匯入你的私房地圖了。 因為還想做更多後續處理, 這篇就暫時先不展示壯觀的 「全家超商全國門市地圖」 :-)

沒有留言:

張貼留言