반응형

안녕하세요!

오늘은 저번에 했던 용산구 CCTV위치 시각화에 이어서 가로등 위치를 추가하고 클러스터링 해보겠습니다.

CCTV위치 시각화 관련 포스팅은 아래를 참고해 주세요.

 

[python] folium을 이용하여 CCTV 위치 시각화하기

안녕하세요! ㅎㅎ 오늘을 folium을 이용해서 지리정보 시각화를 간단히 해 보려고 합니다. 그럼 시작하겠습니다! Preview step1. 데이터 준비하기 오늘 사용할 데이터는 서울 열린 데이터 광장의 '용

wonhwa.tistory.com

 

Preview

Preview

step1. 데이터 준비하기

용산구의 CCTV, 가로등 위치를 시각화 해야 되니까 두 개의 데이터 파일이 필요합니다.

1. 용산구 CCTV 파일

서울시 열린 데이터

 

열린데이터광장 메인

데이터분류,데이터검색,데이터활용

data.seoul.go.kr

2. 용산구 가로등 현황 파일(용산구)

전국 보안등 정보 표준데이터

 

전국보안등정보표준데이터

보안등정보(보안등위치, 설치개수 등)를 제공합니다. 공공데이터 개방 표준데이터 속성정보(표현형식/단위 등)는 [공공데이터 개방 표준]고시를 참고하시기 바랍니다.(정보공유>자료실>법령(고

www.data.go.kr

가로등 파일은 서울 검색 후 용산구로 다운 받으시면 됩니다.

 

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 파일은 제가 미리 준비해 놓았으니 아래의 파일을 다운받아 사용해 주시면 됩니다:)

yongsan.zip.geojson
0.04MB

######지도 만들기#####
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 종류는 아래의 링크를 참고해주세요.

glyphicons

 

Components · Bootstrap

Extend form controls by adding text or buttons before, after, or on both sides of any text-based . Use .input-group with an .input-group-addon or .input-group-btn to prepend or append elements to a single .form-control. Textual s only Avoid using elements

getbootstrap.com

마크 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')
코드 파일

깃허브

 

GitHub - ElenaLim/Visualizations: This repository is for python visualizations, enjoy🤟

This repository is for python visualizations, enjoy🤟 - GitHub - ElenaLim/Visualizations: This repository is for python visualizations, enjoy🤟

github.com

 

마무리

오늘은 이렇게 geojson과 클러스터링까지 하여 시각화를 해보았습니다 ㅎㅎ

이런 위치정보를 가지고 안전한 길찾기 서비스를 해도 좋을 것 같네요.

다른 좋은 아이디어가 있으면 댓글로 공유 부탁드려요 ㅎㅎ

반응형

+ Recent posts