공간 데이터 시각화(geopandas,folium)

이서영·2023년 8월 17일
0

시각화

목록 보기
3/3

1. 공간 데이터란

  • 공간이란 말 그대로 어떠한 물체나 물질이 존재할 수 있는 장소를 말한다.
    공간데이터란 지구의 표면상에 위치하는 물체나 사건, 현상을 기록한 데이터라고 할 수 있다.

  • 많은 공간데이터를 보지는 않았지만, 공간 데이터에는 실제 우리 지구의 물체, 사건, 현상이 위도와 경도를 포함하는 형태로서 지니고 있다.

1-1. 지리좌표체계

  • 지리좌표체계란 지구상의 어떤 물체의 절대적 위치를 나타내는 좌표체계

  • 지리 좌표 체계를 나타내는 방법은 지구 타원체를 '동→서 방향의 위도선'과 '남→북 방향의 경도선'을 종횡으로 일정한 간격을 두고, '도, 분, 초'로 표시

  • 지리 좌표계 종류

    • WGS84
      • 지구 중심에 회전 타원체의 중심을 위치시키는 방식
      • 경도, 위도를 갖고 있는 데이터라면 대부분 WGS84 좌표계
    • Bessel
      • 지구 중심이 아닌 다른 곳에 회전 타원체를 위치시키는 방식
      • 우리나라는 WGS84와 더불어 하께 사용

1-2 평면 지각 좌표체계

  • 평면에 투영된 경위도 좌표계(파란색)와 별도로 일정 크기의 직각 격자들로 구성되는 좌표계(빨간색)를 지도상에서 만들어 사용하는 좌표계

  • 투영법이 필요

  • 3차원 지리좌표를 2차원으로 변환하기 위한 parameter

    • 데이텀(Datum)

      • 측정의 기준이 되는 선과 점이며, 측지계라고도 한다. 타원체의 종류, 좌표체계의 기준점과 방향 등을 정의
    • 투영법(Projection)

    • 중앙 경선(Centeral Meridian) / 중앙 위선(Latitude of Origin)

      • 평면 직각 좌표체계의 원점을 의미
    • False Northing / False Easting

      • 지리 좌표계값을 평면 직각 좌표계로 바꿔줄 때 위치에 따라 좌표값에 일정한 값을 더하거나 빼주어야 하는데, 이때 사용되는 값
    • 단위(Unit)

      • Meter
    • 선 증대율(Scale Factor)

      • 타원체 상의 거리와 지도상의 거리의 비율을 의미
  • 종류

    • TM(Transverse Mercator)
      • 지구를 평면에 투영하기 위해 원통을 적도와 접하는 대신, 90도 회전 시켜 원통 면이 지구 타원체의 임의의 자오선과 접하도록 하여 투영하는 방법
    • UTM
      • 각 지점의 위치를 위도와 경도가 아닌 구역(zone) 의 고유번호 숫자와 가상의 기준점에서 북(North)/동(East)으로 떨어진 거리를 'Meter'로 나타내는 방법.

1-3. EPSG 코드체계

  • 전세계적으로 분포되어있는 좌표계를 표준화된 코드로 정의한것
  • 종류
    • GCS(지리좌표체계)
      • WGS84 = EPSG4326
    • PCS(평면 직각 좌표계)
      • UTM-K = EPSG5179

2. 공간데이터 유형

2-1. 벡터

  • 점(point) : x,y 좌표에 의해 위치가 정해지는 객체
  • 선(line) : 두개 이상의 point와 선분으로 구성된다
  • 면(Polygon) : 면적, 둘레, 모양의 정보를 가지고 있다

2-2. 레스터

  • 픽셀 단위의 색 또는 색조 값을 가지고 있는 데이터 형태

2-3 레스터 vs 벡터

  • 벡터 데이터는 정점을 사용하여 저장하는 데이터 값이고, 래스터 데이터는 데이터를 행, 열로 나눈 셀에 값을 저장한 데이터이다
  • 벡터 데이터는 한 개의 개별 값이 데이터, 래스터 데이터는 서로 연관된 연속된 데이터이다

3. 데이터 가져오기

  • 공간정보는 각종 공공데이터포털을 통해 파일 다운로드나 Open API 형태로 활용 가능하다. Open API(Open Application Programming Interface, 오픈 API)란 누구나 사용할 수 있도록 공개된 API를 뜻하며, 여기서 API는 개발자가 응용프로그램을 개발하는데 쓰이는 인터페이스를 말한다.

  • Open API 형태의 공간정보는 Open API 호출 URL과 인증키를 입력하면, 원하는 데이터를 XML(eXtensible Markup Language) 또는 JSON(JavaScript Object Notation)과 같은 형태로 제공받아 활용할 수 있다.

###공공기관
import pandas as pd
import request          # 통신 라이브러리
def function_name(parameter1):
    request_get = requests.get(
        url="",
        params={
            "serviceKey": parameter1
        }
    )

    request_df = pd.DataFrame(request_get.json()["가져올 데이터"])
  
    return request_df
serviceKey = ""
### api
### 기본적으로 서비스 id와 key를 발급받아 토큰을 가져온 후에 데이터를 가지고 온다
import requests
## sgis
def get_access_token(consumer_key, consumer_secret):
    temp_res = requests.get(
        url="https://sgisapi.kostat.go.kr/OpenAPI3/auth/authentication.json",
        params={
            "consumer_key": consumer_key,
            "consumer_secret": consumer_secret
        }
    )

    access_token = temp_res.json()["result"]["accessToken"]
  
    return access_token

consumer_key = ""
consumer_secret = ""
### 토큰으로 json데이터 받기
def get_vaccination_center(serviceKey):
    temp_res = requests.get(
        url="",
        params={
            "serviceKey": serviceKey
        }
    )

    temp_df = pd.DataFrame(temp_res.json()["data"])
  
    return temp_df

4. Geopandas

  • 파이썬에서 지리정보 데이터 처리의 기하하적 연산과 시각화 등을 돕는 패키지
  • 두 가지의 자료형 GeoSeries와 GeoDataFrame이 있다. 다루는 방법에 큰 차이가 없다
  • 공간정보를 담고 있는 Geometry를 활용해 시각화 가능
    • geometry는 point, ploygon, linestring를 포함


4-1. Geopandas 시각화 기본

### geopandas 시각화

import geopandas as gpd
countries = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
cities = gpd.read_file(gpd.datasets.get_path('naturalearth_cities'))
countries.head()
#cities.head()

###geopandas 로 shp파일 불러오기
x = gpd.read_file('경로/file_name.shp'. encoding='cp949')

  • geometry column을 보면 polygon이라고 되어있는데 이것은 위에 있듯이 면을 의미한다
ax = countries.plot(column="continent",categorical =True)  
ax.set_axis_off()  #x,y 축 제거  
  • 표현하려는 정보가 카테고리 데이터 일때는 categorical인자를 True로 설정
countries['gdp_per_cap'] = countries['gdp_md_est'] / countries['pop_est'] * 100

ax = countries.plot(column='gdp_per_cap', legend=True, scheme='quantiles', cmap="Blues")
### scheme는 mapclassify 모듈 필요 
ax.set_axis_off()
ax.set_title("세계 국가의 1인당 GDP")
* 특정 지정 추출
africa_df = countries[countries['continent']=='Africa'] #아프리카 지정
africa_df.plot()
ax.set_axis_off()

4-2. Geometry

i) point

  • 하나의 좌표를 통해서 표현 가능하다
country_map = countries.plot(column='continent')
cities_map = cities.plot(ax=country_map,marker='*',color='red',markersize=4)
cities_map.set_axis_off()

ii) linestring

import os
path = '''
seoul_line_geo_df = gpd.read_file(
    path, # file_name
    encoding="cp949" # 한글깨짐 현상 방지
)

## 시각화 하기
# 캔버스 사이즈 정의
plt.rcParams['figure.figsize']=(10,20)

# Line 시각화
seoul_line_geo_df.plot(
    color="black"
)

4-3. 좌표계

  • 좌표계는 지구라는 곡면을 2차원 데이터로 표현하는 방법론

  • Geopandas 데이터는 crs속성값으로 확인 가능

    • 만약 None이 반환된다면 초기화
  • 좌표계 변환

    • to_crs()로 변환가능
dataframe.crs = {"init": "epsg:5179"} #epsg 5179로 초기화
dataframe.to_crs("init":"epsg=4326")  #epsg 4326 변환 init은 생략가능

5.folium

  • leaflet.js를 기반으로 만들어진 python 지도 시각화 라이브러리

  • 인터렉티브 지도 시각화 라이브러리

  • 특징 및 주요기능

    • i) 대화형 지도 생성

      • Folium을 사용해서 대화식 지도 생성 가능
    • ii)마커와 팝업

      • 지도 상에 지점을 나타내는 마커를 추가하고, 클릭하면 팝업으로 추가 정보 표시
    • iii) 다양한 렌더링 옵션

      • Folium을 사용해 다양한 지도 타일 랜더링 옵션을 선택 가능
    • iv) 지리공간 데이터 시각화

      • GeoJSON 형식의 지리공간 데이터를 Folium을 사용하여 시각화 가능
    • v)Choropleth 맵

      • Choropleth 맵을 생성하여 지역별 데이터의 시각적인 차이를 표현 이를 통해 지역별 통계 정보를 시각화 가능.
    • vi) 레이어 및 그룹화

      • 여러 개의 레이어를 추가하고 그룹화하여 지도 위에서 정보를 더 잘 관리하고 구분.
    • vii) 마우스 이벤트 처리

      • 지도의 상호 작용에 따른 이벤트를 처리 가능. 클릭, 더블 클릭, 드래그 등의 동작에 대한 반응을 정의 가능

5-1. 기본형식

### 기본 사용(랜더링 옵션 포함)
##d
import folium
x = 37.394946
y = 127.111104

m = folium.Map(location= [x,y],  # 처음 위치. 튜플이나 리스트
               zoom_start=18,    # 초기 축소나,크기 정도. int, default =10
               width =750,       # 맵의 넚이. 픽셀이나 int, default =100%
               height=500,       # 맵의 높이 픽셀이나 int, default =100%
               tiles=''          # 타일의 옵션 

###예제
x = 36.294946
y = 127.111104

m = folium.Map(location =(x,y),zoom_start=11,width=500,height =500)

5-2. Marker layer

  • 마커는 특정지점을 나타내는 아이콘이고, 팝업은 해당 마커를 클릭했을 시 나타나는 정보창
###기본
folium.Marker([마커를 표시할 위도,경도],     
              popup ="나타낼 내용", # html도 가능
              tooltip ="",       # 마우스만 가져다대면 텍스트 표시. str
              icon ="",          # 마커를 렌더링하는데 사용할 아이콘. icon plugin
              draggable =""      # 드래그 가능 여부. bool   
              ).add_to(m)

5-3. Vecter layer

  • Polyline, Polygon, Rectangle, Circle, and CircleMarker 가 있다

i) circle

  • folium.circle를 통하여 지도 위에 원을 그린다.
### 기본
circle = folium.Circle(
    location=[위도, 경도],  # 원의 중심 좌표
    radius=10000,             # 반지름 (미터 단위)
    color='blue',             # 선 색상
    fill=True,                # 내부를 채울지 여부
    fill_color='blue',        # 내부 색상
    fill_opacity=0.5,         # 내부 색상의 투명도
    popup='Sample Circle'     # 팝업 정보
    ).add_to(m)

ii) linepoly

  • folium.poly를 통하여 선을 그린다
###기본
coordinates = [(37.5, -122.0), (37.6, -122.2), (37.6, -122.1)]

polyline = folium.PolyLine(
    locations=coordinates,  # 선을 구성하는 좌표들의 리스트
    color='blue',           # 선 색상
    weight=3,               # 선 두께
    opacity=0.7,            # 선 투명도
    popup='Sample PolyLine'  # 팝업 정보
).add_to(m)

iii) polygon

  • folium.polygon을 통해 지도위에 도형을 그린다
coordinates = [(37.5, -122.0), (37.6, -122.2), (37.6, -122.1)]
polygon = folium.Polygon(
    locations=coordinates,  # 다각형을 구성하는 좌표들의 리스트
    color='blue',           # 선 색상
    fill=True,              # 내부를 채울지 여부
    fill_color='blue',      # 내부 색상
    fill_opacity=0.5,       # 내부 색상의 투명도
    popup='Sample Polygon'  # 팝업 정보
)

5-4. 지리공간 데이터 시각화(GeoJSON layer)

i) GeoJSON

  • GeoJSON은 지리공간 데이터를 표현하기 위한 형식 중 하나
  • 지리 정보를 기하학적인 형태와 속성 데이터로 표현하는 표준 데이터 형식
  • 텍스트 기반 형식으로 지도 데이터 및 공간 데이터를 손쉽게 교확하고 저자하기 위해 사용됨
  • GeoJSON 구성요소
    • Feature
      • 지리공간 형상과 속성으로 구성된 단일 지오메트리 객체 표현
        ex ) 행정 구역 경계와 해당 구역의 이름 인구 등의 정보가 하나의
                Feature로 구성 될수 있음
    • Feature collection
      • 여러 개의 Feature를 모아놓기 컬랙션을 나타냄
      • 지오메트리와 속성 정보를 하나의 그룹으로 나타낼때 사용
    • Geometry
      • 지리공간 형상을 나타내는 부분으로 점,선,면 등의 다양한 유형이 있다
    • Properties
      • 지리 공간 객체의 속성을 나타내는 부분으로 해당 지오메트리와 관련된 부가 정보를 포함
  • Feature collection,Feature이 타입이라면 geoJSON이다.
{
  "type": "Feature",        #Feature의 우형
  "geometry": {             # 해당 Feature의 지오메트리의 정보
    "type": "Point",
    "coordinates": [102.0, 0.5]
  },
  "properties": {          # Feature의 속성 정보
    "name": "Sample Point"
  }
}

ii) 지리 공간 데이터 시각화

# 기본
folium.GeoJson(data= 'geojson',
               name='',           #레이어의 이름 설정
               )
# 지도 객체 생성
m = folium.Map(location=[5, 5], zoom_start=5)

# GeoJSON 데이터
geojson_data = {
    "type": "Feature",
    "geometry": {
        "type": "Polygon",
        "coordinates": [
            [
                [0, 0],
                [10, 0],
                [10, 10],
                [0, 10]
            ]
        ]
    },
    "properties": {
        "name": "Sample Polygon"
    }
}
folium.GeoJson(geojson_data, name='geojson_layer').add_to(m)

m

5-5. Choropleth map

  • 지도 위에 지역별 데이터의 시각적 차이를 나타내는데 사용
  • 각 지역은 다른 색상 또는 색상 강도로 표시
  • 데이터의 분포나 패턴 시각화 가능
###기본
# Choropleth 맵 생성
folium.Choropleth(
    geo_data='geojson', # 지도 데이터 파일경로  (.GeoJSON)
    data=data_frame,   # 시각화 하고자 하는 파일 (데이터 프레임)
    columns=['', ''],  # 지도데이터와 매핑할값, 시각화하고자 하는 변수
    key_on='feature.',         # 데이터 파일과 매핑할 값  
    fill_color='YlGn',  # 색상 스케일링
    fill_opacity=0.7,  # 채우기 투명도
    line_opacity=0.2,  # 경계선 투명도
    legend_name='Legend'  # 범례 이름
)
  • columns 에는 geo_data의 변수(열)중에 data와 매핑할 변수
    key_on값과 매핑할 값

  • key_on에는 string값이 들어가야된다. 위에서 설명했 듯이 geojson에는 properties라는 dic형태 안에 속성(변수)가 들어가 있다.
    그 중에 매칭할 값을 찾아야한다.

  • 참고로 key_on에는 'feature.properties.속성' 이 들어간다.

profile
전공자 학생

2개의 댓글

comment-user-thumbnail
2023년 8월 17일

좋은 정보 얻어갑니다, 감사합니다.

답글 달기
comment-user-thumbnail
2023년 8월 21일

감사합니다

답글 달기