티스토리 뷰

이전 포스팅에 이어 공간데이터를 본격적으로 다루어보겠습니다. 

 

데이터 불러오기는 이전 포스팅을 참고해주세요.

 

geopandas는 아래와 같은 분석을 할 때 쉽게 사용할 수 있습니다. 

 

  1. within : 포함되는지 여부
  2. contains : 포함하고 있는지 여부
  3. intersects : 교차하는지 여부(경계에 닿아 있기만 해도됨)
  4. crosses : 교차하는지 여부(내부를 지나가야 함)
  5. distance : 두 공간 객체 사이의 직선(최단)거리를 계산한다.

공간 

저번 포스팅에서 intersects를 다루었는데 오늘은 공간 데이터를 다룰 때 꼭 쓰게되는 기법들에 대해서 다뤄보겠습니다.

 


1. within

 

within은 객체 A가 객체 B에 포함되는지 여부를 알아내는 방법입니다.

 

바로 예시로 알아보겠습니다.

 

서울 상권 DB에서 버거킹 매장을 추출한 다음 어디 읍면동에 존재하는지 확인해 보겠습니다.

 

import geopandas as gpd
import pandas as pd

# 서울 읍면동 가져오기
EMD = gpd.read_file('./EMD_202005/EMD.shp',encoding = 'ANSI')
seoul = EMD[EMD['EMD_CD'].str.startswith('11')]

# 서울 상권 정보 가져오기
shop = pd.read_csv('./상권정보/소상공인시장진흥공단_상가(상권)정보_서울_20200630.csv',sep='|')
shop = gpd.GeoDataFrame(shop, geometry=gpd.points_from_xy(shop['경도'], shop['위도']))
shop.set_crs(epsg = 4326, inplace = True) # shop의 x,y 좌표를 wgs 84로 인식

# 읍면동의 좌표계를 wgs 84로 바꾸기
seoul = seoul.to_crs(epsg=4326)

# 버거킹 매장 추출
burger = shop[shop['상호명'].str.contains('버거킹')]
# print(len(burger)) # 144개 버거킹 존재

# within 으로 버거킹이 존재하는 seoul 지역 뽑아보기
f = lambda x: burger['geometry'].within(x)
result = seoul['geometry'].apply(f)
seoul[(result==True).any(axis=1)]
# print(len(seoul[(result==True).any(axis=1)]) # 78개 읍면동

결과는 다음과 같습니다.

 

within으로 버거킹이 존재하는 seoul 지역 뽑기
within으로 버거킹이 존재하는 seoul 지역 뽑기

위 결과를 plot한 결과입니다. 아래 코드를 실행시켜 실제로 비교해서 결과를 확인할 수 있습니다.

burger['도로명주소'].tolist()

 

흥미로운점은 78개의 읍면동에만 버거킹이 존재한다는 점입니다.

서울지역 골고루 퍼져있는 것이 아니라 특정 읍면동에 모여있다는 점이죠.

아무튼 그렇습니다.


2. contains

 

이번에는 contains을 사용하여 버거킹이 있는 곳을 찾아봅시다. 

 

사실 contains이랑 within은 주어와 목적어만 바꾸면됩니다.

 

  1. within : 포함되는지 여부
  2. contains : 포함하고 있는지 여부

영어 문법에서 수동태가 within, 능동태가 contains이 되겠네요. 

 

포함하려면 더 큰 단위인 면(polygon)이 주체가 되어야 겠죠? 

 

<polygon>.contains(<point>) 형태로 사용하시면 되겠습니다.

import geopandas as gpd
import pandas as pd

# 서울 읍면동 가져오기
EMD = gpd.read_file('./EMD_202005/EMD.shp',encoding = 'ANSI')
seoul = EMD[EMD['EMD_CD'].str.startswith('11')]

# 서울 상권 정보 가져오기
shop = pd.read_csv('./상권정보/소상공인시장진흥공단_상가(상권)정보_서울_20200630.csv',sep='|')
shop = gpd.GeoDataFrame(shop, geometry=gpd.points_from_xy(shop['경도'], shop['위도']))
shop.set_crs(epsg = 4326, inplace = True) # shop의 x,y 좌표를 wgs 84로 인식

# 읍면동의 좌표계를 wgs 84로 바꾸기
seoul = seoul.to_crs(epsg=4326)

# 버거킹 매장 추출
burger = shop[shop['상호명'].str.contains('버거킹')]
print(len(burger)) # 144개 버거킹 존재

# contain 으로 버거킹이 존재하는 seoul 지역 뽑아보기
f = lambda x: seoul['geometry'].contains(x)
result = burger['geometry'].apply(f)
seoul[(result==True).any(axis=0)]
print(len(seoul[(result==True).any(axis=0)])) # 78개 읍면동

 

결과가 within을 사용했을 때와 동일하게 나옴을 확인할 수 있습니다.

 

contain으로 버거킹이 존재하는 seoul 지역 뽑기
contain으로 버거킹이 존재하는 seoul 지역 뽑기

 


3 & 4. intersects & crosses

 

intersects는 저번 포스팅에서 다루었으므로 crosses를 살펴보겠습니다.


해당 내용은 공식 사이트 geopandas.org/set_operations.html에서 확인 할 수 있습니다.

 

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함