✔ Python/2. Visualization

[GeoPandas] 서울시 공원 위치 시각화(1/2)

  • -
주제:  서울시 공원 위치 시각화(1/2)
수정일: 14th January, 2023
버전: pandas 1.4.4 / geopandas 0.9.0 / mpl 3.5.2
활용데이터:
공간정보시스템 - 대한민국 최신 행정구역(SHP) 다운로드
서울열린데이터광장 - 서울시 주요공원 현황
선행학습 :
라이브러리 설치 - 2023.01.06 - [✔ Python/Visualization] - [GeoPandas] GeoPandas 라이브러리 설치

전국데이터에서 서울만 표출 -
 
2023.01.06 - [✔ Python/Visualization] - [GeoPandas] GeoPandas 라이브러리 설치

서울시 공원 시각화 작업

안녕하세요, wscode 루카스입니다.
오늘은
서울시 주요 공원 현황데이터를 가지고 서울시 주요 공원의 위치 시각화를 해보도록 하겠습니다.


1. 데이터

정부 및 지차체에서 데이터의 중요성 및 가치를 인지함에 따라, 기 구축된 데이터 및 생성되고 있는 신규 데이터들을 많이 개방하고 있는 추세입니다. 덕분에 과거 대비 데이터를 쉽게 구할 수 있게 된 점은 긍정적인 효과인 듯합니다.

1.1. 서울시 주요 공원 데이터

이전 포스팅에 언급했던 서울시의 공원위치 시각화를 위해 "서울 열린데이터광장"에서 데이터를 다운로드하였습니다.

  • 서울 열린데이터광장  홈페이지 : https://data.seoul.go.kr/index.do
  • 데이터위치 : 서울 열린데이터 광장 > 공공데이터 > 카테고리, 환경 > 서울시 주요 공원현황
 

열린데이터광장 메인

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

data.seoul.go.kr

 

2. 데이터 준비

2.1. CSV 파일 읽기

%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['axes.unicode_minus'] = False

# 데이터로딩
F2 = '/서울시 주요 공원현황.csv'
D2 = pd.read_csv(F2, encoding='CP949') #utf-8 오류해결하는 방안 : CP949
D2.head()

해당 데이터는 encoding 없이 파일을 읽는 경우, 오류 및 한글이 깨지는 현상이 발생합니다.

  • encoding = "CP949"을 통해 오류해결이 가능합니다.
  • CP(Code Page, 코드페이지)에 상세한 내용은 더보기 클릭하여 확인이 가능합니다.
더보기

**내용출처 - 위키백과 (링크는 하단 참조)

1. CP(Code Page, 코드페이지)란?
코드 페이지(code page)는 특정한 문자 인코딩 테이블을 위해 쓰이는 전통적인 IBM 용어이다. 문자 인코딩 테이블은 0부터 255까지의 정수를 표현하는 단일 옥텟(octet, 바이트)이라고 불리는 일련의 비트들이 특정한 문자와 결합하여 도표화(mapping) 한 것이다.  IBM 마이크로소프트는 코드 페이지를 문자열 집합(charset)에 자주 할당한다.

2. CP949란?

코드 페이지 949는 마이크로소프트사가 도입한 코드 페이지이다. 본래는 KS C 5601의 완성형 한글을 표현한 코드 페이지였으나, 윈도 95부터는 확장 완성형 혹은 통합형 한글 코드이라는 명칭으로 확장되어 현대의 모든 한글을 수용하게 되었다.

3. 그 외 코드페이지

2.2. CSV 파일 읽기

필요한 데이터만 추출 및 표출하기

df2 = D1[["공원명","X좌표(WGS84)","Y좌표(WGS84)"]]
df2.head()

원하는 데이터만 추출

plt.scatter(df1['X좌표(WGS84)'],df1['Y좌표(WGS84)'],
            color= "#bfff00",
            linewidths = 10)

산점도 그리기

 

그럼, 이제 이 공원위치를 서울시 SHP파일 위에 표출해 보도록 하겠습니다.

3. 표출

서울시 shp파일과 그려본 공원데이터를 보면, 좌표계가 상이한 걸 확인할 수 있습니다. 즉, 하나의 좌표계로 통일이 필요합니다.

서울시shp파일(GPS84,EPSG5179)과 공원데이터(WGS84, EPGS4326)  좌표계 차이

필자 또한 좌표계변환이 익숙한 개념은 아니라서 이전까지는 xrproject 소프트웨어를 사용했었습니다.
하지만, 이번엔 구글링을 통해 쉽게 변환하는 방법을 알아냈습니다.

3.1. 좌표계 변환

좌표계에 관련해서 자세한 내용은 추후 정리해도록 하겠습니다.
우선, 서울시 shp파일은 GPS84(
EPSG5179) 좌표계를 사용하고 공원데이터는 WGS84(EPGS4326) 사용하고 있었습니다.

print(seoul.crs)                        
seoul.set_crs(epsg=5179, inplace= True)
new_seoul = seoul.to_crs(epsg=4326)
new_seoul

좌표계 변환((좌)변경 전 (우)변경 후)

3.2. 표출

이제는 좌표계 통일하였으니, 표출만도록 하겠습니다.

new_seoul.convex_hull.plot(color='#3ceca7', edgecolor="w")
plt.scatter(df2['X좌표(WGS84)'],df2['Y좌표(WGS84)'],
            color= "#bfff00",linewidths = 10)                     
plt.show

서울시 주요공원 위치 표출

3.3. 그림 표출

혹시 저처럼 특정 이미지를 plot 위에 표출하고싶은 분들은 아래 코드를 확인하시면 됩니다.

from matplotlib.offsetbox import OffsetImage, AnnotationBbox

def getImage(path):
   return OffsetImage(plt.imread(path), zoom=0.020, alpha = 1)
paths = './Data/Tree.png' #]*len(df1['X좌표(WGS84)'])
x0 = df1['X좌표(WGS84)'].iloc[:].to_list()
y0 = df1['Y좌표(WGS84)'].iloc[:].to_list()

ax2 = new_seoul.convex_hull.plot(color='#3ceca7', edgecolor="w") 
# ax.scatter(df1['X좌표(WGS84)'], df1['Y좌표(WGS84)'], color= "white")

for index, row in df1.iterrows():
    ab = AnnotationBbox(getImage(paths), (row['X좌표(WGS84)'], row['Y좌표(WGS84)']), frameon=False)
    ax2.add_artist(ab)

ax2.set_axis_off()   
plt.show()

서울시 주요공원 표출

 

4. 전체 소스코드

# import libaray and packages
%matplotlib inline
import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
from matplotlib.offsetbox import OffsetImage, AnnotationBbox


# prepare and read data
F1 = './행정구역/EMD_20221119/emd.shp' 
D1 = gpd.read_file(F1, encoding='cp949')

# extract seoul data from the orginal dataset
df1 = D1.astype({ 'EMD_CD' : 'int' })
seoul = df1[df1['EMD_CD']<20000000]

# draw the seoul map
ax = seoul.convex_hull.plot(color='pink', edgecolor="w")          
ax.set_axis_off()                           
plt.show()

# define fuction
def getImage(path):
   return OffsetImage(plt.imread(path), zoom=0.020, alpha = 1)


paths = './Data/Tree.png' #]*len(df1['X좌표(WGS84)'])
x0 = df1['X좌표(WGS84)'].iloc[:].to_list()
y0 = df1['Y좌표(WGS84)'].iloc[:].to_list()
ax2 = new_seoul.convex_hull.plot(color='#3ceca7', edgecolor="w") 

for index, row in df1.iterrows():
    ab = AnnotationBbox(getImage(paths), (row['X좌표(WGS84)'], row['Y좌표(WGS84)']), frameon=False)
    ax2.add_artist(ab)

ax2.set_axis_off()   
plt.show()

 

Other Posts

Geopandas 활용한 Geoscience series 링크입니다


Reference

  1. 좌표계 확인 및 변환 : https://anweh.tistory.com/53
  2. 코드페이지(CP)란 : https://ko.wikipedia.org/wiki/%EC%BD%94%EB%93%9C_%ED%8E%98%EC%9D%B4%EC%A7%80 
  3. How to plot image instead of points : https://stackoverflow.com/questions/22566284/matplotlib-how-to-plot-images-instead-of-points

 

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.