folium 라이브러리를 이용해서 특정 위치의 지도를 띄우고 원하는 곳에 마커를 표시할 수 있다.
공공데이터를 다운받아 전국 공원 정보를 적절히 가공한 뒤, 제주도에 대한 공원을 표시하는 실습을 진행해볼 것이다.
Folium 라이브러리 사용
import folium
mymap = folium.Map(location=[33.371296, 126.560056], zoom_start=11)
folium.Marker([33.371296, 126.560056], popup='한라산').add_to(mymap)
mymap.save('test.html')
아주 간단한 folium 활용 코드이다. Map은 통해 띄워줄 지도의 위도와 경도 값을 받아 객체를 만들어 준다. zoom_start는 초기 확대 수준을 나타내는데, 일반적으로 0에서 18까지의 값을 가진다.
Marker는 위도와 경도 값을 받고, 앞서 구성한 지도 객체안에 Marker를 찍어준다. 이때 popup 옵션으로 해당 위치에 대한 설명을 적어줄 수 있다.
원하는 위치의 위도/경도 확인 방법
구글 맵에서 원하는 위치를 검색하고, 지도 창에서 오른쪽 버튼을 눌러 ‘이곳이 궁금한가요?’를 클릭한다.
회색 작은 Marker 표시가 나타나는 것을 확인할 수 있다.
해당 회색을 마우스 왼쪽 클릭을 하면 위와 같이 해당 위치의 위도와 경도를 확인할 수 있다.
이때, 앞서 검색했던 왼쪽 검색 창이 활성화 되어 있으면, 위도와 경도가 뜨지 않으므로, 위도와 경도가 뜨지 않는다면 해당 부분을 확인해보면 된다.
[pandas] 공원 데이터 가공
위 링크에서 전국에 있는 공원 정보를 엑셀파일 형태로 다운받을 수 있다.
오른쪽 상단에 원하는 확장자를 선택해서 다운로드 한다.
위와 같은 엑셀 데이터를 얻을 수 있다. 우리가 중점적으로 사용할 부분은 위도와 경도이다.
import pandas as pd
df = pd.read_excel('./전국도시공원정보표준데이터.xlsx')
print(df.isna().sum())
먼저, 해당 파일의 결측치를 확인해본다. 위도와 경도, 소재지지번주소가 없다면, 마커를 찍는 과정에서 에러가 발생하기 때문에, 해당 데이터는 없애줘야 한다.
import pandas as pd
df = pd.read_excel('./전국도시공원정보표준데이터.xlsx')
df = df.dropna(subset = ['위도', '경도', '소재지지번주소']) #해당 subset 결측지를 0으로 만듦.
print(df.isna().sum())
위도와 경도, 그리고 소재지지번 주소가 없는 것을 dropna 함수로 없애주고 다시 결측치를 확인해보면 0인 것을 확인할 수 있다. 이처럼 결측치에 의한 오류가 나지 않도록, 사용할 데이터의 결측치를 제거해주는 과정이 필요하다.
import pandas as pd
df = pd.read_excel('./전국도시공원정보표준데이터.xlsx')
df = df.dropna(subset = ['위도', '경도', '소재지지번주소']) #해당 subset 결측지를 0으로 만듦.
df = df.query("소재지지번주소.str.contains('제주')", engine='python')
print(df)
query를 통해 제주가 소재지지번주소에서 제주가 들어가 있는 공원만 필터링한다.
이로써 제주도의 공원을 시각화하기 위한 데이터 가공이 끝났다.
[seaborn] 위치 좌표 그래프
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from tqdm import *
df = pd.read_excel('./전국도시공원정보표준데이터.xlsx')
df = df.dropna(subset = ['위도', '경도', '소재지지번주소']) #해당 subset 결측지를 0으로 만듦.
df = df.query("소재지지번주소.str.contains('제주')", engine='python')
sns.scatterplot(data=df, x='경도', y='위도', hue='공원구분')
plt.rc('font', family='Gulim') #한글 깨짐 방지
plt.show()
scatterplot을 통해 공원 구분 별로 색으로 나누어서 좌표를 나타내어 공원 구분별 밀집도를 파악할 수 있다.
[folium] 공원 위치 지도 표시
import matplotlib.pyplot as plt
import folium
import pandas as pd
import seaborn as sns
from tqdm import *
mymap = folium.Map(location=[33.371296, 126.560056], zoom_start=11)
df = pd.read_excel('./전국도시공원정보표준데이터.xlsx')
df = df.dropna(subset = ['위도', '경도', '소재지지번주소']) #해당 subset 결측지를 0으로 만듦.
df = df.query("소재지지번주소.str.contains('제주')", engine='python')
for i in trange(0,len(df)):
row = df.iloc[i]
lat = row['위도']
lng = row['경도']
name = row['소재지지번주소']
popup = folium.Popup(name, max_width=300)
folium.Marker([lat, lng], popup=popup).add_to(mymap)
mymap.save('test.html')
앞서 가공된 데이터를 for문으로 행단위로 받아와서, 위도와 경도로 Marker를 표시한다. 또한, 특정 마커를 클릭하면 소재지지번주소가 뜰 수 있도록 popup을 추가한다.
이후, save를 하고 만들어진 파일을 열어보면 위와 같이 공원 위치와 주소가 표시된 제주 지도를 확인할 수 있다.
Ref