とある地点から地点までの距離を求めるプログラムを作成してほしいという依頼があったので、その際にやったことを公開する。
仕様
1.基準となる住所を決める。
2.住所の一覧があるので、それぞれの住所から基準までの距離を求める。
3.求めた距離の一覧をcsvファイルで出力する。
といったシンプルな仕様になっている。
但し、YahooAPIには住所から2点間の距離を求める機能は無いため
住所を緯度、経度に変換してから求めている。
YahooAPI用のappidは下記のURLを参考に取得した。
https://www.gyro-n.com/sfs/faq/sfs_YahooID/
以下、実際に作成したソース。
import hashlib
import hmac
import requests
import datetime
import json
import csv
import urllib.parse
import xml.etree.ElementTree as ET
"""
基準となる地点とそれぞれの地点の距離を測るプログラムです。
"""
# yahoo API のID
app_id = "YahooAPIのID"
# 基準となる住所
CRITERIA_ADDRESS = "東京都千代田区永田町1丁目7−1"
# 住所から経度、緯度を求めるAPI
MAP_REQUEST_URL = "https://map.yahooapis.jp/geocode/V1/geoCoder?appid={YahooAPIのappID}&query="
# 2点間の経度、緯度から距離を求めるAPI
tude_REQUEST_URL = "https://map.yahooapis.jp/dist/V1/distance?coordinates="
# 住所から緯度、経度を取得する。
def calc_tude(address):
print(address + "の経度、緯度を取得")
request_address = MAP_REQUEST_URL + urllib.parse.quote(address)
print( request_address)
point = requests.get(request_address)
print( point.text)
print( point.status_code)
root = ET.fromstring(point.text)
print(root[0][0].text)
# 取得に失敗した場合は空の配列を返す。
if root[0][0].text == '0':
return []
tude = root[1][3][1].text
return tude
def calc_distance(tude1, tude2):
# 距離をリクエストするためのURIを作成する。
request_URL = "https://map.yahooapis.jp/dist/V1/distance?coordinates=" + urllib.parse.quote(tude1) + "%20" + urllib.parse.quote(tude2) + "%20" + "&appid=" + app_id
# リクエストを送信する。
print(request_URL)
point = requests.get(request_URL)
root = ET.fromstring(point.text)
print(root[1][0][1].text)
return root[1][0][1].text+"km"
# 基準点の経度、緯度情報を取得する。
criteria_tude = calc_tude(CRITERIA_ADDRESS)
# csvファイルの読み出しを行う。
csv_file = open("test.csv", "r", encoding="ms932", errors="", newline="" )
# 住所情報の数だけ繰り返す。
f = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)
total_info = []
for row in f:
address = row[0]
# 住所情報から輝度、緯度情報を取得する。
tude = calc_tude(address)
if tude == []:
continue
# 取得した2つの住所情報を用いて距離情報を取得する。
distance = calc_distance(criteria_tude, tude)
# 住所と距離のリストを作成。
info_list = []
info_list.append(address)
info_list.append(distance)
total_info.append(info_list)
print(len(total_info))
# 取得した距離情報をcsvに追記する。
with open('sample_writer_row.csv', 'a', newline='') as f:
writer = csv.writer(f, lineterminator = '\n')
writer.writerows(total_info)
といった感じになった。