본문 바로가기

Theory/DataScience

지도 그리기, basemap 모듈 간단 사용법

지도 시각화 관련 folium을 소개한 적이 있습니다. Folium은 작업후에 노트북파일을 다시 열었을때 지도 결과가 나타나지 않을때가 있어서 보관하는 문서로서는 약간 맞지 않을 때가 있습니다. 그런 목적에서 찾은 아이가 basemap입니다. basemap을 설치하기 위해서는

conda create -n map_viz python=3.6

pip install jupyter
pip install pandas
pip install xlrd
pip install -U matplotlib
pip install folium
pip install seaborn
pip install plotly
pip install pillow

conda install basemap
conda install basemap-data-hires

이렇게 모듈을 설치했네요ㅠㅠ. 이 내용은 제가 사용하려고 설치한 것이구요. 여러분은 그냥 conda 명령으로 basemap을 설치하시면 됩니다. 마지막 두 줄만 실행하시면 되죠^^

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
%matplotlib inline

plt.figure(figsize=(10,10))

map = Basemap(projection='ortho', lat_0=37.35, lon_0=126.58, resolution='i', area_thresh=1000.0)
map.drawcoastlines()
map.drawcountries()
 
plt.show()

그리고 시작하는 코드를 올려보겠습니다. 어렵지 않습니다.~^^

ㅎㅎ.. 해안선그리기(drawcoastlines)와, 국경선그리기(drawcountries)를 모두 사용한 결과압니다. 그리고

plt.figure(figsize=(10,10))

map = Basemap(projection='ortho', lat_0=37.35, lon_0=126.58, resolution='i', area_thresh=1000.0)
 
map.drawcoastlines()
map.drawcountries()
map.fillcontinents(color='coral')

plt.show()

이렇게 대륙의 색상을 입력할 수 있습니다 

이렇게 결과가 나타납니다.

import numpy as np

plt.figure(figsize=(10,10))

map = Basemap(projection='ortho', lat_0=37.35, lon_0=126.58, resolution='i', area_thresh=1000.0)
 
map.drawcoastlines()
map.drawcountries()
map.fillcontinents(color='coral')
map.drawmapboundary()
 
map.drawmeridians(np.arange(0, 360, 30))
map.drawparallels(np.arange(-90, 90, 30))
 
plt.show()

또 위도 경도선을 그릴 수 있습니다. 

앗 그런데.. 혹시나 하고 위도/경도에 대한 개념을 한 번 집고 가면~

출처 : 위키백과 위도/경도 문서

위도(Latitude)는 적도에서 부터 북/남쪽으로 멀어지는 각도, 경도(Longitude)는 영국 그리니치 천문대를 기준으로 좌우로 멀어지는 각도입니다.

plt.figure(figsize=(10,10))

map = Basemap(projection='merc', lat_0=37.35, lon_0=126.58, resolution = 'h',
    urcrnrlat=44, llcrnrlat=32, llcrnrlon=121.5, urcrnrlon=132.5)
 
map.drawcoastlines()
map.drawcountries()
map.drawmapboundary()

plt.show()

이번에는... 우리나라를 한 번 그려봅니다.^^

plt.figure(figsize=(10,10))

map = Basemap(projection='merc', lat_0=37.35, lon_0=126.58, resolution = 'h',
    urcrnrlat=44, llcrnrlat=32, llcrnrlon=121.5, urcrnrlon=132.5)
 
map.drawcoastlines()
map.drawcountries()
map.drawmapboundary()

lon = 126.58
lat = 37.35
x,y = map(lon, lat)
map.plot(x, y, 'bo', markersize=12)

plt.show()

이번에는 마커를 찍어보았습니다.

혹은...

import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib import font_manager, rc
plt.rcParams['axes.unicode_minus'] = False

# f_path = "c:/Windows/Fonts/malgun.ttf"
# f_path = "/Users/pinkwink/Library/Fonts/D2Coding-Ver1.3-20171129.ttf"
f_path = "/Library/Fonts/AppleGothic.ttf"
font_name = font_manager.FontProperties(fname=f_path).get_name()
rc('font', family=font_name)

plt.figure(figsize=(10,10))

map = Basemap(projection='merc', lat_0=37.35, lon_0=126.58, resolution = 'h',
    urcrnrlat=40, llcrnrlat=32, llcrnrlon=121.5, urcrnrlon=132.5)
 
map.drawcoastlines()
map.drawcountries()
map.drawmapboundary()

lon = [126.97806, 129.07556, 126.70528, 128.60250, 126.95556, 127.38500, 126.85306]
lat = [37.56667, 35.17944, 37.45639, 35.87222, 37.39444, 36.35111, 35.15972]
x,y = map(lon, lat)
map.plot(x, y, 'ro', markersize=5)

labels = ['서울', '부산', '인천', '대구', '안양', '대전', '광주']
for label, xpt, ypt in zip(labels, x, y):
    plt.text(xpt, ypt, label)

plt.show()

이렇게 여러개의 마커와 이름을 찍어볼 수 있습니다.

여기까지 오늘은 basemap 간편 테스트였습니다~^^


반응형