이것저것 기록

[python, folium] 서울 따릉이 대여소 (x,y)좌표 변환 및 지도 시각화 본문

코린이/실무를 위한 코딩 기록

[python, folium] 서울 따릉이 대여소 (x,y)좌표 변환 및 지도 시각화

anweh 2020. 10. 9. 21:16

 

 

오랜만에 벡터 데이터 다루기~~ 

생각보다? 서울에 따릉이 대여소가 진짜 많다. 

원래 목표는 유동 인구를 히트맵으로 시각화 한 다음에 그 위에 따릉이 좌표를 찍어 보는게 목표였는데...

히트맵 만드는 과정이 생각보다 까다로워서 일단 맛보기로 따릉이 좌표만 시각화 해봤다. 

 

 

따릉이 대여소 좌표 데이터는 여기서 받음! : data.seoul.go.kr/dataList/OA-13252/F/1/datasetView.do 

 

서울특별시 공공자전거 대여소 정보

데이터 이용하기-서울특별시 공공자전거 대여소 정보

data.seoul.go.kr

 


 

 

서울특별시 공공자전거 대여소 정보(19.12.9).xlsx

이 파일에서 내가 사용할 정보는 파란 박스의 대여소ID빨간 박스의 위도, 경도이다. 

대여소 ID는 사용할 줄 알아서 추출하긴 했는데 안씀;; 

 

 

1. 엑셀 데이터 불러오기 및 특정 컬럼 추출

from pyproj import Transformer
import pyproj
import numpy as np
import pandas  as pd
from shapely.geometry import Point as point
import geopandas as gpd
import folium


bike = pd.read_excel('C:/Users/user/Desktop/tta.xlsx') # 해당 엑셀 파일 불러오기
bike_id = bike['대여소ID']
bike_x = bike['위도']
bike_y = bike['경도']

우선 필요한 라이브러리를 import 해주고 pd.read_excel을 사용해서 엑셀 파일을 불러왔다. 

bike에 불러온 모습을 확인해보면 다음과 같다. 

bike DataFrame

파란 박스와 빨간 박스 부분의 내용이 모두 잘 불러와진 것을 알 수 있다. 

이 정보들을 bike_id, bike_x, bike_y 라는 변수에 각각 저장해주었다. 

- bike_id = 대여소ID

- bike_x = 위도

- bike_y = 경도

 

 

2. 좌표계 변환 후.shp로 내보내기 

# Case 1

'''
- x, y 좌표와 대여소ID를 받아서 dict 형태로 만들고 
- x, y 좌표를 QGIS 지도 좌표계에 맞게 변환 (to EPSG:3857)
- 후에 point들을 .shp로 내보내기 
'''

TRAN_4326_TO_3857 = Transformer.from_crs("EPSG:4326", "EPSG:3857") # EPSG:3857좌표계로 변환
	# "ESPG:3857"을 다른 좌표계로 바꾸면 무한하게 응용 가능
points = []
ttareung = []

for i in range(len(bike)-1): # 마지막 인덱스에 NaN이 존재해서 -1
    
    idx = bike_id[i]
    x_coord = bike_x[i]
    y_coord = bike_y[i]
    
    xx, yy = TRAN_4326_TO_3857.transform(x_coord, y_coord) # 변환하는 과정
    bike_dict = {'ID': idx, 'x_coord': xx, 'y_coord': yy}
    
    if i % 20 == 0: 
        print(f'{i}th station is working...')
    
    points.append(point(xx, yy))
    ttareung.append(bike_dict)

points = gpd.GeoDataFrame(geometry = points)
points.to_file('C:/Users/user/Desktop/tta_points.shp', driver="Shapefile")

좌표계 변환은 Transformer.from_crs라는 함수를 사용해준다. 

TRAN_4326_TO_3857이라는 변수에 어떤 좌표에서 어떤 좌표계로 변환할 것인지 선언해주고

for loop 안에서 대여소 한개씩 변환하게끔 적용해준다. (xx, yy) 

points라는 리스트에 변환된 좌표를 shapely의 point로 바꿔주어 저장! 

마지막으로 이 shapely point 리스트를 GeoDataFram 형식으로 저장하여 .shp파일 형태로 내보내주면 아래와 같은 좌표 점들이 생성된 파일을 얻을 수 있다. 

QGIS에서 따릉이 대여소 위치 좌표를 열어본 결과

 

 

3. Folium을 활용한 지도 시각화 

# Case 2
'''
- x, y 좌표를 받아서 좌표계 변환 없이 m.html에 시각화하기 
'''
#지도의 중심을 지정하기 위해 위도와 경도의 평균 구하기
lat = bike['위도'].mean()
long = bike['경도'].mean()

#지도 띄우기
m = folium.Map([lat, long], zoom_start = 9)

coords = []
for i in range(len(bike)-1):
    x = bike_x[i]
    y = bike_y[i]
    coords.append([x, y])
    
for i in range(len(coords)):
    folium.Circle(
        location = coords[i],
        radius = 50,
        color = '#000000',
        fill = 'crimson',
    ).add_to(m)

m.save('C:/Users/user/Desktop/map.html')

Folium은 파이썬 기반의 지도 라이브러리이다. 가볍고 간단하게 구현이 가능하다는 것이 특징인데 기능도 나쁘지 않음! 

다만 내가 사용하는 IDE인 스파이더에서는 바로 팝업이 되지 않기 때문에 .html로 저장한 후에 확인해봤다. 

실행 결과

바탕화면에 생성된 map.html을 클릭하면 위와 같은 새 창이 나타난다. 

확대 및 축소도 가능함!! 

무엇보다 QGIS가 익숙하지 않으면 이런식으로 지도 시각화를 해도 괜찮을듯!

 

 

Comments