適当のごった煮

Pythonと境界標とQGISを中心にいろいろと

QGISでGeocodingの結果を表示する

スポンサードリンク

QGISとPythonとGeocodingを利用して、住所を緯度経度のCSVファイルに変換して地図上に表示します。

よく利用する店や行ってみたい店をネットで調べたら、店舗一覧が住所の文字情報だけしか表示されていないことがたまにあります。

住所で地図検索すれば所在地が分かりますが、一つ一つの住所を検索するのは結構な手間がかかります。

そのような場合、店舗一覧が表示されているページから各店舗の住所を抜き取り、その住所を緯度と経度のセットに変換したCSVファイルを作成し、QGISで表示させることによって自作の店舗一覧地図を作成することができます。

手順としては、以下のようになります。

  1. 住所の一覧を記載しているページを取得
  2. ページから住所のリストを取得
  3. Geocodingを利用して緯度と経度を取得
  4. 緯度と経度の情報をCSVファイルにまとめる
  5. QGISにCSVファイルを読み込ませる

手順1~4まではPythonを利用します。

具体例としてWORKMAN 店舗一覧(東京都)を地図化してみます。

まずは店舗一覧サイトのソースを確認し、店舗と住所のパターンを見つけます。これが確定できればページを取得し、正規表現を用いて住所リストを作成するだけです。

import urllib.request
import urllib.parse
import re
import time

info = '' # 情報の一時保存
jusyo = [] # 店舗名と住所のリスト保存

pat1 = re.compile('">(.+店)</') # 店舗名のパターン
pat2 = re.compile('(東京都.+)<br') # 住所のパターン

url = 'http://www.workman.co.jp/shop_search/list.html?ken=13'
html = urllib.request.urlopen(url)
for line in html:
    line_u = line.decode('utf-8')

    # 店舗名
    obj1 = pat1.search(line_u)
    if obj1:
        info = obj1.group(1) + ' '
        continue

    # 店舗の住所
    obj2 = pat2.search(line_u)
    if obj2:
        info += obj2.group(1)
        jusyo.append(info)
        info = ''

続いてGeocodingのAPIを利用させてもらい住所を緯度と経度に変換します。サーバーに負荷をかけないように一回検索ごとに7秒の間隔をあけます。Geocodingできなかった場合のエラー処理はしていません。

result = ''
pat_lat = re.compile('<lat>(.+?)<') # 緯度のパターン
pat_lng = re.compile('<lng>(.+?)<') # 経度のパターン
# jusyoには「店舗名 住所」というリストが保存されている
for line in jusyo:
    elem = line.split(' ')
    url = 'http://www.geocoding.jp/api/?' + urllib.parse.urlencode({'q':elem[1]})
    html = urllib.request.urlopen(url)
    
    for line2 in html:
        line_u = line2.decode('utf-8')
        
        # XMLから緯度と経度の数値を抜き取って保存
        if '<lat>' in line_u:
            obj = pat_lat.search(line_u)
            lat = obj.group(1)
        elif '<lng>' in line_u:
            obj = pat_lng.search(line_u)
            lng = obj.group(1)
            result += elem[0] + ',' + lng + ','  + lat + '\n'
    time.sleep(7)

最後に、Geocodingの結果をCSVファイルに書き込みます。

f = open('result.csv', 'w')
f.write('name, lng, lat\n') # タイトル行書き込み
f.write(result)
f.close()

こうしてできたCSVファイルをQGISで読み込みます。

メニューから「レイヤ」→「レイヤの追加」→「デリミティッドテキストレイヤの追加」を選ぶか、左側にあるツールバーのカンマをクリックします。

f:id:tekito-gottani:20170413172052j:plain

読み込みウィンドウを表示させたら、「参照」から作成したCSVファイルを読み込み、Xフィールドに経度行、Yフィールドに緯度行を指定してOKをします。

f:id:tekito-gottani:20170413172233j:plain

最後に、座標参照システムを「WGS84」に指定すると下図のように丸い点でワークマン店舗(東京都)の位置が表示されます。

f:id:tekito-gottani:20170413172319j:plain
「国土交通省国土政策局「国土数値情報(行政区域(東京))」をもとにid:tekito-gottaniがQGISを用いて編集・加工」

あとはプロパティで色を変えたり店舗名を表示させたり、電車や道路などのデータを読み込ませたり、自分好みの地図を作成していきます。

f:id:tekito-gottani:20170413172405j:plain
「国土交通省国土政策局「国土数値情報(行政区域(東京))及び(全国)」をもとにid:tekito-gottaniがQGISを用いて編集・加工」