이전내용과 이어집니다
이전 내용이 궁금하시다면 클릭
지도 시각화를 통해 각 지역에 대한 관심도 평균값을 시각화하고자합니다.
우선 지도 시각화를 위한 json 파일을 위해 국내 시군구 지도 데이터를 아래 사이트에서 얻었습니다.
시도/ 시군구 / 읍면동 / 리 단위로 되어있는데 저의 경우에는 시도 파일을 다운로드 하였습니다.
http://www.gisdeveloper.co.kr/?p=2332
대한민국 최신 행정구역(SHP) 다운로드 – GIS Developer
www.gisdeveloper.co.kr
shp 파일을 다운로드 한 뒤 이를 아래 사이트에서 설정해줍니다.
mapshaper
Drop or paste files here or select from a folder Shapefile, GeoJSON, TopoJSON, KML and CSV files are supported Files can be gzipped or in a zip archive Quick import Drop or paste files here to import with default settings
mapshaper.org
select에서 아까 다운로드 받은 zip 파일을 선택해줍니다.
그 뒤에 'encoding = euc-kr' 을 작성한 뒤에 Import 해줍니다.
그럼 다음과 같이 지도가 나타납니다.
위 Simplify 버튼을 누르면 아래와 같이 정밀도를 조절하여 섬이나 선들을 없애고 깔끔하게 나타낼 수 있습니다.
조절이 끝났으면 Export 해줍니다.
이때 두가지 방법이 있는데 shp 파일로 Export 하여 이를 json으로 변환하는 방법과
GeoJSON으로 Export하는 방법이 있습니다.
shp 파일을 json 파일로 변환하는 것은 아래 사이트에서 가능합니다.
그러나 저의 경우에는 Upload zip file을 눌러도 아무런 반응이없었습니다.
https://gipong.github.io/shp2geojson.js/
Demo page - shp2geojson.js
Sorry, this format are not supported.
gipong.github.io
따라서 shp 파일을 json으로 변환하는 방법을 찾았습니다.
geopandas를 설치하면 json으로 변경이 가능하다고 해서
가상환경에서
pip install geopandas
위 코드를 통해 설치 완료하였으나 geopandas 모듈이 없다고 오류가 발생해서
아래 두가지 방법을 다 사용하였습니다.
conda install geopandas
conda install --channel conda-forge geopandas
그래도 오류가 발생해서 그냥 가상환경을 나가 python3 (ipykernel)에서 실행하니..
됐습니다.. 이유는 모르겠습니다.. 죄송합니다
우선 됐으니 다행입니다
아래 코드를 통해 shp 파일을 불러냈고
import geopandas as gpd
df = gpd.read_file('ctprvn/ctprvn.shp',encoding='euc-kr')
이러한 데이터가 있는것을 확인할 수 있었습니다.
아래 코드를 통해 위 데이터 프레임 df로 저장된 shp 파일을 geojson으로 변환할 수 있습니다.
df.to_file(driver='GeoJSON', filename='shp_kr.geojson')
사실 아까 위에서 GeoJSON으로 Export 할수 있었는데 그래도 되는지를 몰라서 조금 돌아왔습니다ㅎ
이제 시각화를 해보겠습니다.
○ 라이브러리 정의
# conda install -c conda-forge folium
import folium
### json 파일 처리 모듈
import json
○ json 파일 읽어들이기
### json 파일 읽어들이기
file_path = "./ctprvn(1).json"
sgg_get = json.load(open(file_path, encoding="utf-8"))
#print(seoul_sgg_get.keys())
sgg_get["features"][0]["properties"]
{'CTPRVN_CD': '11', 'CTP_ENG_NM': 'Seoul', 'CTP_KOR_NM': '서울특별시'}
for i in range(0, len(sgg_get["features"]), 1):
print(sgg_get["features"][i]["properties"])
len(sgg_get["features"])
{'CTPRVN_CD': '11', 'CTP_ENG_NM': 'Seoul', 'CTP_KOR_NM': '서울특별시'}
{'CTPRVN_CD': '26', 'CTP_ENG_NM': 'Busan', 'CTP_KOR_NM': '부산광역시'}
{'CTPRVN_CD': '27', 'CTP_ENG_NM': 'Daegu', 'CTP_KOR_NM': '대구광역시'}
{'CTPRVN_CD': '28', 'CTP_ENG_NM': 'Incheon', 'CTP_KOR_NM': '인천광역시'}
{'CTPRVN_CD': '29', 'CTP_ENG_NM': 'Gwangju', 'CTP_KOR_NM': '광주광역시'}
{'CTPRVN_CD': '30', 'CTP_ENG_NM': 'Daejeon', 'CTP_KOR_NM': '대전광역시'}
{'CTPRVN_CD': '31', 'CTP_ENG_NM': 'Ulsan', 'CTP_KOR_NM': '울산광역시'}
{'CTPRVN_CD': '36', 'CTP_ENG_NM': 'Sejong-si', 'CTP_KOR_NM': '세종특별자치시'}
{'CTPRVN_CD': '41', 'CTP_ENG_NM': 'Gyeonggi-do', 'CTP_KOR_NM': '경기도'}
{'CTPRVN_CD': '43', 'CTP_ENG_NM': 'Chungcheongbuk-do', 'CTP_KOR_NM': '충청북도'}
{'CTPRVN_CD': '44', 'CTP_ENG_NM': 'Chungcheongnam-do', 'CTP_KOR_NM': '충청남도'}
{'CTPRVN_CD': '45', 'CTP_ENG_NM': 'Jeollabuk-do', 'CTP_KOR_NM': '전라북도'}
{'CTPRVN_CD': '46', 'CTP_ENG_NM': 'Jellanam-do', 'CTP_KOR_NM': '전라남도'}
{'CTPRVN_CD': '47', 'CTP_ENG_NM': 'Gyeongsangbuk-do', 'CTP_KOR_NM': '경상북도'}
{'CTPRVN_CD': '48', 'CTP_ENG_NM': 'Gyeongsangnam-do', 'CTP_KOR_NM': '경상남도'}
{'CTPRVN_CD': '50', 'CTP_ENG_NM': 'Jeju-do', 'CTP_KOR_NM': '제주특별자치도'}
{'CTPRVN_CD': '51', 'CTP_ENG_NM': 'Gangwon-do', 'CTP_KOR_NM': '강원특별자치도'}
17
sgg_get["features"]
[1047679.6707692873, 1910190.3049400412],
[1051257.109884115, 1910701.6772802453],
[1054261.187967956, 1912270.527290251],
[1055467.659852257, 1915258.9966819473],
[1058918.6299705068, 1912927.2889677417],
[1059795.8241480393, 1915074.3206493761],
[1062771.818599647, 1916895.3548284173],
[1064625.3668725481, 1914602.114891339],
▶ 이때는 몰랐습니다 뭐가 잘못됐는지 하하 값이 너무 크죠?
### 지도맵 그리기
travel_mean = folium.Map(
### 최초에 보여줄 지도의 중심위치(위/경도) 지정
# - 서울 중심점
location = [37.573050, 126.979189],
### 지도 스타일 지정하기
tiles = "CartoDB positron",
# tiles = "CartoDB dark_matter",
### 최초에 보여줄 zoom 사이즈 지정하기
zoom_start = 11
)
### 시군구 경계 표시하기
def style_function(feature) :
return {
# 불투명도
"opacity" : 0.7,
# 두께
"weight" : 0.6,
# 색상
"color" : "yellow",
}
folium.GeoJson(
### geojson 변수 : 경계면 데이터
sgg_get,
### 스타일 함수 넣기
style_function = style_function
).add_to(travel_mean)
travel_mean
▶ json을 통해 경계면 데이터를 줬는데 왜 경계면 표시가 안되고 지도만 표시되는지에 대해
한참을 생각해본 결과 값이 너무 크다는 것을 알게되었습니다
아래 사이트에서 본인이 가지고 있는 geojson 파일이 맞는지 확인할 수 있습니다.
https://geojson.io/#map=2/0/20
geojson.io | powered by Mapbox
A quick, simple tool for creating, viewing, and sharing spatial data.
geojson.io
저의 경우에는 위경도가 맞지 않는다고 떴습니다.
왜 그랬을까 여기저기 검색해본 결과
제가 다운로드한 shp 파일은 UTM-K로 되어있어 Folium 에서 사용하려면 WGS84 형태로 변환해야했습니다.
따라서 XrProjection을 설치하여 변환해주는 작업을 수행했습니다.
참고: http://www.gisdeveloper.co.kr/?p=1868
[GIS] 공간 데이터 좌표 변환툴 – XrProjection – GIS Developer
이 툴에 대한 최신 버전은 XrProjection v3.1 을 통해 다운로드 받아 사용하시기 바랍니다. 개발자 피드백 EPSG900913(구글좌표계)를 지원합니다. 구글좌표계는 WGS84 타원체를 사용하므로 WGS84 타원체가
www.gisdeveloper.co.kr
설치하고 실행하면 다음과 같이 나오는데 단일 SHP파일 변환을 누릅니다
아래와 같이 지정하고 변환합니다.
변환한 파일을 (shp, shx,dbf 전체 파일) 통해 다시 json으로 변경하고 지도 시각화 해봤습니다.
지도 시각화
① shp 파일 json 파일로 변환
import geopandas as gpd
df = gpd.read_file('ctpvn_tran/ctprvn_tran.shp',encoding='euc-kr')
df.to_file(driver='GeoJSON', filename='shp_kr2.geojson')
② json 파일 불러들이기
import folium
import json
### json 파일 읽어들이기
file_path = "./shp_kr2.geojson"
sgg_get = json.load(open(file_path, encoding="utf-8"))
③ 지도 시각화
### 지도맵 그리기
travel_mean = folium.Map(
### 최초에 보여줄 지도의 중심위치(위/경도) 지정
# - 서울 중심점
location = [37.573050, 126.979189],
### 지도 스타일 지정하기
tiles = "CartoDB positron",
# tiles = "CartoDB dark_matter",
### 최초에 보여줄 zoom 사이즈 지정하기
zoom_start = 8
)
### 시군구 경계 표시하기
def style_function(feature) :
return {
# 불투명도
"opacity" : 0.7,
# 두께
"weight" : 0.6,
# 색상
"color" : "yellow",
}
folium.GeoJson(
### geojson 변수 : 경계면 데이터
sgg_get,
### 스타일 함수 넣기
style_function = style_function
).add_to(travel_mean)
travel_mean
처음 해보는 지도 시각화라 이리저리 헤맨 부분도 많아 아직 실제 데이터를 넣어 시각화하지는 못했습니다.
다음에는 국내 여행지의 관심도 평균을 지도에 시각화하는 것까지 하도록 하겠습니다.
도움 받은 참고 사이트
https://mjs1995.tistory.com/169?category=802136
https://blog.naver.com/PostView.nhn?blogId=kcchang61&logNo=221350672356
'Project' 카테고리의 다른 글
[전자제품쇼핑몰] 데이터 전처리 - 웹크롤링 데이터 전처리 (3) | 2024.01.24 |
---|---|
[전자제품쇼핑몰] 데이터 수집 - 전자 제품 데이터 웹크롤링 (5) | 2024.01.21 |
[데이터 분석] 국내 여행지역 관심도 분석(4) (3) | 2024.01.06 |
[데이터 분석] 국내 여행지역 관심도 분석(3) (2) | 2023.12.17 |
[데이터분석 미니프로젝트] plotly 그래프 생성하기 (2) | 2023.12.11 |