Pythonで横浜市の地域防災拠点を地図にプロットする

横浜市の地域防災拠点データ

横浜市の地域防災拠点データは、オープンデータとして提供されています。
http://www.city.yokohama.lg.jp/somu/org/kikikanri/data/

データはXML形式で提供されています。提供されている内容は
– 拠点名
– 区名
– 住所
– 拠点の機能

の4つでです。
このデータをXMLをパースし、地図にプロットするためには位置情報が必要になります。
住所から座標を取得するために、GoogleのAPIを利用します。

GoogleAPIを利用するには、APIキーの取得が必要です。

XMLとGooleAPIで入手した位置情報をJSON形式にしてファイルに保存します。
コードは以下のようになります。

“`python
from bs4 import BeautifulSoup
import requests
import json
import time

base_param = {
‘key’ :’APIキー’,
‘language’:’JP’
}
geourl = ‘https://maps.googleapis.com/maps/api/geocode/json’

CITY = ‘横浜市’

def create_address(ward,address):
return CITY + ward + address

def call_geo_api(address):
base_param[‘address’] = address
geo_response = requests.get(geourl,base_param)
if (geo_response.status_code == 200):
geo_results = geo_response.json()
lat = geo_results[‘results’][0][‘geometry’][‘location’][‘lat’]
lng = geo_results[‘results’][0][‘geometry’][‘location’][‘lng’]
return lat, lng

url = requests.get(‘http://www.city.yokohama.lg.jp/somu/org/kikikanri/data/shelter.xml’)
url.encoding = url.apparent_encoding
bsObj = BeautifulSoup( url.text,’lxml’)

shelter_list = bsObj.findAll(‘shelter’)

data = {}
shelter_t = []
for shelter in shelter_list:
info ={}
info[‘name’] = shelter.find(‘name’).get_text()
info[‘ward’] = shelter.find(‘ward’).get_text()
info[‘address’] = shelter.find(‘address’).get_text()
info[‘notes’] = shelter.find(‘notes’).get_text()

lat,lng = call_geo_api(create_address(info[‘ward’] , info[‘address’]))
info[‘lat’] = lat
info[‘lng’] = lng

print(info)
shelter_t.append(info)
time.sleep(1)

data[‘results’] = shelter_t
f = open(‘result.json’,’w’)
json.dump(data,f,ensure_ascii=False)
f.close()
“`

地図へのプロット

地図へプロットは、GoogleMapを使用しても良いのですが、今回はpythonの
地図表示ライブラリfoliumを使用します。

先程、保存したJSONデータを読み込み、プロットします。foliumはとてもシンプルに
プログラミングができます。pythonプログラマーならGoogleMapは使わずに
foliumを覚えた方が良いでしょう。

コードと実行結果は以下のようになります。

“`python
import json
import folium

f = open(‘result.json’,’r’)
data = json.load(f)
f.close()

map_1 = folium.Map(location =[ 35.469716 , 139.629184],
zoom_start=14,
)

for shelter in data[‘results’]:
popup_text = ‘{0}:{1}’.format(shelter[‘name’],shelter[‘notes’])
folium.Marker( [ shelter[‘lat’], shelter[‘lng’]] ,
popup=popup_text,
icon=folium.Icon(color=’red’,icon=’info-sign’)).add_to(map_1)

map_1
“`