단계구분도의 가장 쉬운 데이터는 역시나 인구수가 아닐까 싶습니다. 서울특별시 관악구의 인구수를 확인해봅시다.

 

● 데이터 다운로드

국토정보플랫폼의 국토정보맵에서 국토통계지도를 확인합니다.

 

 

11시방향과 같이 검색을 진행합니다.

※ 격자로 선택하는 경우, 500M 이하 구역으로 자를 때 구별 미만의 단위로만 가능합니다.

다음과 같이 형성된 데이터를 다운로드합니다.

.msid파일은 필요없습니다

 

● 코딩

패키지를 import 합니다

#기본 패키지
import numpy as np
import pandas as pd
import json
import folium
import geopandas as gpd
from geopandas import GeoDataFrame  #메인
from shapely.geometry import Polygon, LineString, Point  #격자, 선, 점
from fiona.crs import from_string

# 좌표 바꾸는 패키지
from pyproj import Transformer
import pyproj

# 심신의 안정 찾기(경고창 안뜨게 하기)
import warnings
warnings.filterwarnings('ignore')

 

shape 파일을 불러옵니다. (하나의 상위 폴더에 모두 넣어주는게 보기 편합니다.)

shape = gpd.GeoDataFrame.from_file('shp경로', encoding = 'utf-8')

 

# shape.crs를 통해 shp파일의 설명을 확인할 수 있습니다.

# shape.shape나 shape.crrs를 통해서도 가능합니다

# shape.head(n)을 통해서 index별 데이터 확인도 가능합니다(일반 dataframe과 유사합니다)

 

이런식으로 구성되어 있는것을 확인할 수 있습니다.

여기서 gid는 국가지점번호, lbl과 val은 인구수를 의미합니다.

※ geometry는 geopandas를 위해 꼭 필요한 컬럼으로, 단계구분도를 그려보자 1에서 설명한 EPSG마다 입력되는 형태가 다릅니다.

EPSG형태는 4326의 경위도가 기본인데, 조금 다른것 같습니다. 바꿔보겠습니다.

 

조금더 편-안해졌습니다.

경도, 위도의 순서로 배치된 것을 확인할 수 있습니다.

이후 folium을 사용하여 다음과 같은 코드를 입력하면

# folium 지도 불러오기
m = folium.Map(location=[ '37.478069', '126.951523'], # 관악구청 경위도
               zoom_start=12.5,
               tiles='OpenStreetMap')
folium.GeoJson(
    shape,
    style_function = lambda x : style
).add_to(m)


# 인구별 단계구분도를 띄우기 위한 Polygon (다각형) 스타일 지정
style = {'fillColor': 'orange',   # 채우는 색
         'fillOpacity': 0.5,     # 채우기 투명도
         'color': 'black',        # 선 색
         'opacity' : 0.05,        # 선 투명도
         'weight': 1              
         }

# Choropleth 맵 생성
folium.Choropleth(
    
    geo_data = shape,                      # Choropleth 맵에 사용될 지리 정보
    data = shape,                          # Choropleth 맵에 사용될 데이터
    columns = ['gid', 'val'],       # 데이터에서 사용될 열 이름(구역, 인구 수) 
    key_on='feature.properties.gid',    # GeoJson에서 고유 식별자로 사용할 (지리적 영역을 구분할) 열 이름   
    
    fill_color='YlOrRd',                # 색상 팔레트 설정  예) 'YlGnBu', 'YlOrRd'
    fill_opacity= 0.7,                  # 채우기 투명도 설정 / 0 (투명) ~ 1 
    bins= 14,                           # 색 구간
    
    line_color = 'black',               # 경계선 색
    line_opacity = 0.05,                # 경계선 투명도
    
    nan_fill_color = 'white',           # 결측치 색
    nan_fill_opacity = 0,               # 결측치 투명도 - 0 (완전투명)
    
    name='관악구 총인구',              # 이름 
    legend_name='관악구 총인구'        # 범례 이름 설정
).add_to(m)

# 레이어 컨트롤 추가
folium.LayerControl().add_to(m)

# html 파일로 저장
# m.save('관악구 단계구분도.html')   
# 지도 띄우기
m

아래와 같은 단계구분도를 그릴 수 있습니다.

 

다음 포스팅은 layer들을 합치는 작업을 진행하겠습니다.

+ Recent posts