공공데이터를 활용한 제주도 AED 설치위치 지도 표시
필요 모듈 설치 및 가져오기
!pip install folium
!pip install requests
!pip install python-dotenv
import requests # 요청 모듈 - 설치 필요
import json, xmltodict # 형식 모듈
import pandas as pd # 데이터프레임(엑셀과 유사) 모듈
import folium # 지도 모듈 - 설치 필요
import time #시간 모듈
import os, dotenv
dotenv.load_dotenv()
Requirement already satisfied: folium in k:\programdata\anaconda3\lib\site-packages (0.12.1.post1)
Requirement already satisfied: jinja2>=2.9 in k:\programdata\anaconda3\lib\site-packages (from folium) (2.11.2)
Requirement already satisfied: branca>=0.3.0 in k:\programdata\anaconda3\lib\site-packages (from folium) (0.4.2)
Requirement already satisfied: numpy in k:\programdata\anaconda3\lib\site-packages (from folium) (1.19.5)
Requirement already satisfied: requests in k:\programdata\anaconda3\lib\site-packages (from folium) (2.24.0)
Requirement already satisfied: MarkupSafe>=0.23 in k:\programdata\anaconda3\lib\site-packages (from jinja2>=2.9->folium) (1.1.1)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in k:\programdata\anaconda3\lib\site-packages (from requests->folium) (1.25.9)
Requirement already satisfied: certifi>=2017.4.17 in k:\programdata\anaconda3\lib\site-packages (from requests->folium) (2020.6.20)
Requirement already satisfied: idna<3,>=2.5 in k:\programdata\anaconda3\lib\site-packages (from requests->folium) (2.10)
Requirement already satisfied: chardet<4,>=3.0.2 in k:\programdata\anaconda3\lib\site-packages (from requests->folium) (3.0.4)
Requirement already satisfied: requests in k:\programdata\anaconda3\lib\site-packages (2.24.0)
Requirement already satisfied: certifi>=2017.4.17 in k:\programdata\anaconda3\lib\site-packages (from requests) (2020.6.20)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in k:\programdata\anaconda3\lib\site-packages (from requests) (1.25.9)
Requirement already satisfied: chardet<4,>=3.0.2 in k:\programdata\anaconda3\lib\site-packages (from requests) (3.0.4)
Requirement already satisfied: idna<3,>=2.5 in k:\programdata\anaconda3\lib\site-packages (from requests) (2.10)
Requirement already satisfied: python-dotenv in k:\programdata\anaconda3\lib\site-packages (0.19.2)
데이터 수집
url = "http://apis.data.go.kr/B552657/AEDInfoInqireService/getEgytAedManageInfoInqire"
key = os.environ.get("AED_DATA_KEY") # 공공데이터에서 발급받은 키
aed_data_list = []
start, data_length = 0, 1
province = '제주특별자치도'
# 데이터 요청
for city in ['서귀포시', '제주시']:
flag = False
for i in range(1, 11): # 100 * 10 개의 데이터 조회
# 중복 제거
while len(aed_data_list) > data_length:
# 중복이 발생한다면 반복문 중지
if aed_data_list[start]['buildAddress'] == aed_data_list[data_length]['buildAddress']:
flag = True
break
data_length += 1
if flag: # 중복에 대한 flag가 True일 경우 중복 없는 List를 반환 후 반복문 중지
aed_data_list = aed_data_list[:data_length]
break
# 파라미터 설정
params = {
'servicekey' : key,
'Q0': province,
'Q1': city,'pageNo':f'{i}',
'numOfRows':'100'}
# 데이터 GET 요청
response = requests.get(url, params=params)
time.sleep(0.5) # 0.5초 쉬었다가 다시 시작 (오류 방지)
json_string = json.dumps(xmltodict.parse(response.content), ensure_ascii=False) # xml에서 json 문자열 형식으로 변환
aed_data_dict = json.loads(json_string) # json 문자열에서 딕셔너리 형식으로 변환
if 'response' in aed_data_dict.keys(): # 응답이 있다면
if aed_data_dict['response']['body']['items'] is not None: # 아이템이 있다면
aed_data_list += aed_data_dict['response']['body']['items']['item']
# 다음 city의 비교를 위함
start = data_length
data_length = start + 1
aed_data = pd.DataFrame(aed_data_list) # 데이터를 데이터프레임으로 반환 후 저장
데이터 처리
# 컬럼명 변경
columns = {
"buildAddress" : "설치기관주소",
"buildPlace" : "설치위치",
"clerkTel" : "설치기관전화번호",
"manager" : "관리책임자명",
"managerTel" : "관리자연락처",
"mfg" : "제조사",
"model" : "AED모델명",
"org" : "설치기관명",
"wgs84Lat" : "위도",
"wgs84Lon" : "경도",
"zipcode1" : "우편번호(앞자리)",
"zipcode2" : "우편번호(뒷자리)"
}
aed_data.rename(columns=columns, inplace=True)
지도 표시
# 제주도 중앙 표시
g_map = folium.Map(location=[33.38800653178708, 126.55288068647766], zoom_start=10)
# AED 설치 위치에 마커 표시
for lat, lon, installation_location in zip(aed_data['위도'], aed_data['경도'], aed_data['설치위치']):
marker = folium.Marker(location=[lat, lon], popup=installation_location, icon=folium.Icon('red'))
marker.add_to(g_map)
# 해당 소스코드 위치에 html파일 저장
g_map.save('./map.html')
g_map
Make this Notebook Trusted to load map: File -> Trust Notebook
'Program_Language > Python' 카테고리의 다른 글
[Python Algorithm Interview] 02. 빅오, 자료형 (0) | 2022.06.08 |
---|---|
[Python Algorithm Interview] 01. 파이썬 언어 (0) | 2022.06.07 |
[Python 기초] 08_파일 (0) | 2021.08.17 |
[Python 기초] 07_딕셔너리 (0) | 2021.08.16 |
[Python 기초] 06_함수 (0) | 2021.08.15 |