원하는 대학교 위치를 folium이라는 지도시각화 라이브러리를 활용하여 지도에 표시하여 시각화
지도를 시각화할 수 있는 라이브러리
pip install folium
엑셀을 사용하기 위한 라이브러리
pip install openxyl
<고등교육기관 하반기 주소록(년도)>의 엑셀 파일을 열어보면 학교명 주소가 포함되어있음.
엑셀파일을 판다스에서 불러와 학교명과 주소를 찾는 코드
import pandas as pd
filePath = r'project27_University_Visualization\고등교육기관 하반기 주소록(2020).xlsx'
df_from_excel = pd.read_excel(filePath, engine='openpyxl')
df_from_excel.columns = df_from_excel.loc[4].tolist()
df_from_excel = df_from_excel.drop(index=list(range(0, 5)))
print(df_from_excel.head()) #데이터의 앞쪽만 몇 개 표시한다.
print(df_from_excel['학교명'].values) #학교명 데이터 출력
print(df_from_excel['주소'].values) # 주소 데이터 출력
모든 학교명과 주소가 출력된다!
folium 라이브러리를 이용하여 지도에 표시하기 위해서는 주소가 아닌 좌표의 데이터가 필요하다. 우리는 주소 데이터만 가지고 있기에 주소를 좌표로 벼환해야 한다. 주소를 좌표로 변환하기 위해서는 나라에서 운영하는 오픈 API를 사용해야한다.
오픈 API 링크
https://www.vworld.kr/dev/v4dv_geocoderguide2_s001.do
여기서 인증키 발급받는 과정이 필요한데,
최대한 실제 서비스할 내용을 상세히 적는 것이 중요하다!
그럼 바로 인증키가 발급된다.
import requests
# API의 접속 내용
url = 'http://api.vworld.kr/req/address?'
params = 'service=address&request=getcoord&version=2.0&crs=epsg:4326&refine=true&simple=false&format=json&type='
road_type = 'ROAD' # 도로명주소
road_type2 = 'PARCEL' # 지번주소
address = '&address='
keys = '&key='
primary_key = 'F4A2453##############' # 발급받은 인증키
def request_geo(road): # 주소를 x,y 좌표로 반환해주는 함수, API에 접속하여 x,y부분만 분리하여 반환한다.
page = requests.get(url+params+road_type+address+road+keys+primary_key)
json_data = page.json()
if json_data['response']['status'] == 'OK':
x = json_data['response']['result']['point']['x']
y = json_data['response']['result']['point']['y']
return x, y
else:
x = 0
y = 0
return x, y
x, y = request_geo("서울특별시 서대문구 이화여대길52 (대현동, 이화여자대학교)")
print(f'x값: {x}')
print(f'y값: {y}')
터미널에서 x,y 좌표가 출력된다.
x값 126.945578678
y값 37.562650039
엑셀에서 읽은 학교명과 주소 데이터를 API를 통해 x,y 좌표로 변경된 값을 [학교주소좌표.xlsx]의 엑셀파일로 생성하는 코드
import pandas as pd
import requests
from openpyxl import load_workbook
from openpyxl import Workbook
import re
filePath = r'project27_University_Visualization\고등교육기관 하반기 주소록(2020).xlsx'
df_from_excel = pd.read_excel(filePath, engine='openpyxl')
df_from_excel.columns = df_from_excel.loc[4].tolist()
df_from_excel = df_from_excel.drop(index=list(range(0, 5)))
url = 'http://api.vworld.kr/req/address?'
params = 'service=address&request=getcoord&version=2.0&crs=epsg:4326&refine=true&simple=false&format=json&type='
road_type = 'ROAD' # 도로명주소
road_type2 = 'PARCEL' # 지번주소
address = '&address='
keys = '&key='
primary_key = '인증키 입력!'
def request_geo(road):
page = requests.get(url+params+road_type+address+road+keys+primary_key)
json_data = page.json()
if json_data['response']['status'] == 'OK':
x = json_data['response']['result']['point']['x']
y = json_data['response']['result']['point']['y']
return x, y
else:
x = 0
y = 0
return x, y
try:
wb = load_workbook(
r"project27_University_Visualization\학교주소좌표.xlsx", data_only=True)
sheet = wb.active
except:
wb = Workbook()
sheet = wb.active
university_list = df_from_excel['학교명'].to_list()
address_list = df_from_excel['주소'].to_list()
for num, value in enumerate(address_list):
addr = re.sub(r'\([^)]*\)', '', value)
print(addr)
x, y = request_geo(addr)
sheet.append([university_list[num], addr, x, y])
wb.save(r"project27_University_Visualization\학교주소좌표.xlsx")
run 실행시키면, [학교주소좌표.xlsx] 엑셀 파일이 생성
folium을 이용하여 이화여자대학교의 위치에 마커를 표시하는 프로그램을 만들어보자.
import folium
map = folium.Map(location=[37, 127], zoom_start=7)
# zoom_start=7는 지도의 배율
marker = folium.Marker([37.562650039, 126.945578678],
popup='이화여자대학교',
icon=folium.Icon(color='green'))
marker.add_to(map)
map.save(r'project27_University_Visualization/uni_map.html')
[uni_map.html] 파일을 크롬 브라우저를 통해 열면 지도에 초록색 마커가 표시된 것을 확인할 수 있다.