안녕하세요!
오늘은 저번에 했던 용산구 CCTV위치 시각화에 이어서 가로등 위치를 추가하고 클러스터링 해보겠습니다.
CCTV위치 시각화 관련 포스팅은 아래를 참고해 주세요.
Preview
step1. 데이터 준비하기
용산구의 CCTV, 가로등 위치를 시각화 해야 되니까 두 개의 데이터 파일이 필요합니다.
1. 용산구 CCTV 파일
2. 용산구 가로등 현황 파일(용산구)
가로등 파일은 서울 검색 후 용산구로 다운 받으시면 됩니다.
step2. cctv와 가로등 위치데이터 추출하기
위치를 시각화하기위해 용산구 cctv, 가로등의 위, 경도 데이터를 모두 추출해 주도록 하겠습니다.
cctv는 전 게시물과 동일하므로 코드를 첨부하도록 하겠습니다.
###CCTV위치 꺼내기####
# CSV 파일 열기
import pandas as pd
file = r'C:\파일위치\yongsan_CCTV.csv'
file = file.replace('\\','//')
#print(file)
cctv_csv = pd.read_csv(file,encoding='cp949')
print(cctv_csv.head(5))
# 데이터프레임 NaN 값 대체
cctv_csv = cctv_csv.fillna(0.0)
print(cctv_csv.head())
# x좌표(위도),y좌표(경도) 리스트로 만들기
x = []
y = []
for i in range(len(cctv_csv['WGS x좌표'])):
if cctv_csv['WGS x좌표'][i] == 0.0 or cctv_csv['WGS y좌표'][i] == 0.0:
pass
else:
x.append(cctv_csv['WGS x좌표'][i])
y.append(cctv_csv['WGS y좌표'][i])
print('x갯수: ',len(x))
print('y갯수: ',len(y))
이제 가로등 위치를 꺼내보도록 하겠습니다.
가로등도 cctv와 마찬가지로 데이터 확인 후 필요정보를 뽑아보도록 하겠습니다.
####가로등 파일 열기#####
# CSV 파일 열기
import pandas as pd
file = r'C:\파일위치\서울특별시_용산구_보안등정보.csv'
file = file.replace('\\','//')
#print(file)
street_csv = pd.read_csv(file,encoding='cp949')
print(street_csv.head())
출력:
여기서 필요한 정보는 위도(x) 경도(y), 그리고 나중에 위치 마킹할 때 이름을 달아주기 위해 보안등 위치명까지 뽑아 보도록 하겠습니다.
NaN이 있는 곳은 0.0으로 대체 후 , 위경도에 0.0이 있으면 그 곳은 제외하는 방식으로 값을 저장해 주도록 하겠습니다.
# 데이터프레임 NaN 값 대체
street_csv = street_csv.fillna(0.0)
print(street_csv.head())
# x좌표(위도),y좌표(경도), 이름 리스트로 만들기
x1 = []
y1 = []
name = []
for i in range(len(street_csv['위도'])):
if street_csv['위도'][i] == 0.0 or street_csv['경도'][i] == 0.0:
pass
else:
name.append(street_csv['보안등위치명'][i])
x1.append(street_csv['위도'][i])
y1.append(street_csv['경도'][i])
print('이름갯수: ',len(name))
print('x갯수: ',len(x1))
print('y갯수: ',len(y1))
출력:
가로등 수가 cctv 수보다 훨씬 많습니다.
step3. 지도를 만들고 그 위에 위치 표시하기
이제 필요한 데이터 준비는 다 되었으니 시각화해 보도록 하겠습니다.
지도를 불러오고, 그 위에 용산구 geojson파일로 구역을 눈에 들어오도록 시각화 해보겠습니다.
용산구 geojson 파일은 제가 미리 준비해 놓았으니 아래의 파일을 다운받아 사용해 주시면 됩니다:)
######지도 만들기#####
import folium
import folium.plugins as plug
import json
#map 만들기
map_osm = folium.Map(location=[37.538821, 126.98368841130002],zoom_start=14)
#geojson파일 오픈
file_name= r'C:\파일위치\yongsan.zip.geojson'
file_name = file_name.replace('\\','/')
with open(file_name, 'rt') as f:
geo = json.load(f)
f.close()
folium.GeoJson(geo, name='YongSan').add_to(map_osm)
map_osm
이렇게 용산구 지역에 표시가 되었습니다.ㅎㅎ
다음으로 cctv랑 가로등의 위치를 찍고 클러스터링 해 보도록 하겠습니다.
###가로등, cctv 위치 표시및 클러스터링###
import folium.plugins as plug
marker_cluster = plug.MarkerCluster().add_to(map_osm)
for i in range(len(x)):
folium.Marker([x[i],y[i]], popup='용산CCTV_%d'%i, icon=folium.Icon(color='red', icon='ok-circle')).add_to(marker_cluster)
for i in range(len(x1)):
folium.Marker([x1[i],y1[i]], popup= name[i], icon=folium.Icon(color='orange', icon='star')).add_to(marker_cluster)
지도 위에 표시하는 아이콘은 모양을 설정할 수 있는데요 icon 종류는 아래의 링크를 참고해주세요.
만약 음표 아이콘을 쓰고 싶다면 파라미터에 icon=folium.Icon(icon=music) 이렇게 작성하면 됩니다.
다른 아이콘도 glyphicon glyphicon- 뒤에 써져 있는 아이콘이름을 입력해 주면 적용이 됩니다ㅎㅎ
#map저장
map_osm.save('YONGSAN.html')
결과물:
자 그럼 이렇게 완성이 됩니다 ㅎㅎ
스크롤을 위로 올리면 확대가 되면서 원이 더 많이 생기고 그중 하나를 클릭해 보면,
아까 만든 cctv,가로등 마크와 이름을 확인할 수 있습니다.
별모양은 가로등, cctv는 빨간 마크입니다.
전체 코드
####CCTV#####
# CSV 파일 열기
import pandas as pd
file = r'C:\파일위치\yongsan_CCTV.csv'
file = file.replace('\\','//')
#print(file)
cctv_csv = pd.read_csv(file,encoding='cp949')
print(cctv_csv.head(5))
# 데이터프레임 NaN 값 대체
cctv_csv = cctv_csv.fillna(0.0)
print(cctv_csv.head())
# x좌표(위도),y좌표(경도) 리스트로 만들기
x = []
y = []
for i in range(len(cctv_csv['WGS x좌표'])):
if cctv_csv['WGS x좌표'][i] == 0.0 or cctv_csv['WGS y좌표'][i] == 0.0:
pass
else:
x.append(cctv_csv['WGS x좌표'][i])
y.append(cctv_csv['WGS y좌표'][i])
print('x갯수: ',len(x))
print('y갯수: ',len(y))
#####가로등######
# CSV 파일 열기
import pandas as pd
file = r'C:\Users\user\Desktop\web_AI\python_code\서울특별시_용산구_보안등정보.csv'
file = file.replace('\\','//')
#print(file)
street_csv = pd.read_csv(file,encoding='cp949')
print(street_csv.head())
# 데이터프레임 NaN 값 대체
street_csv = street_csv.fillna(0.0)
print(street_csv.head())
# x좌표(위도),y좌표(경도), 이름 리스트로 만들기
x1 = []
y1 = []
name = []
for i in range(len(street_csv['위도'])):
if street_csv['위도'][i] == 0.0 or street_csv['경도'][i] == 0.0:
pass
else:
name.append(street_csv['보안등위치명'][i])
x1.append(street_csv['위도'][i])
y1.append(street_csv['경도'][i])
print('이름갯수: ',len(name))
print('x갯수: ',len(x1))
print('y갯수: ',len(y1))
######지도생성######
import folium
import folium.plugins as plug
import json
#map 만들기
map_osm = folium.Map(location=[37.538821, 126.98368841130002],zoom_start=14)
#클러스터추가
marker_cluster = plug.MarkerCluster().add_to(map_osm)
#geojson파일 오픈
file_name= r'C:\Users\user\Downloads\yongsan.zip.geojson'
file_name = file_name.replace('\\','/')
with open(file_name, 'rt') as f:
geo = json.load(f)
f.close()
folium.GeoJson(geo, name='YongSan').add_to(map_osm)
for i in range(len(x)):
folium.Marker([x[i],y[i]], popup='용산CCTV_%d'%i, icon=folium.Icon(color='red', icon='ok-circle')).add_to(marker_cluster)
for i in range(len(x1)):
folium.Marker([x1[i],y1[i]], popup= name[i], icon=folium.Icon(color='orange', icon='star')).add_to(marker_cluster)
#map저장
map_osm.save('YONGSAN.html')
코드 파일
마무리
오늘은 이렇게 geojson과 클러스터링까지 하여 시각화를 해보았습니다 ㅎㅎ
이런 위치정보를 가지고 안전한 길찾기 서비스를 해도 좋을 것 같네요.
다른 좋은 아이디어가 있으면 댓글로 공유 부탁드려요 ㅎㅎ
'시각화(Visualization)' 카테고리의 다른 글
[python/시각화] matplotlib으로 그래프 만들기- 다변량그래프, 밀집도그래프, 육각그래프 (0) | 2021.12.15 |
---|---|
[python/시각화] matplotlib으로 그래프 만들기- 히스토그램, 산점도, 박스그래프 (0) | 2021.12.15 |
[python] folium을 이용하여 CCTV 위치 시각화하기 (3) | 2021.11.15 |
[python] 네이버 블로그 크롤링 결과로 WordCloud 시각화하기 (5) | 2021.11.10 |
[python] 공공데이터 코로나 확진자 데이터로 bar_chart_race 시각화하기 (3) | 2021.11.08 |