GIS

GeoPandas와 Rasterio: 포인트 샘플링(point sampling)

유병혁 2022. 3. 24. 22:01

안녕하세요? 이번 글은 GeoPandas(지오판다스)와 Rasterio(래스터리오)를 이용한 포인트 샘플링(point sampling) 방법을 정리해 보겠습니다. 이 글은 GeoPandas의 예시 갤러리(Examples Gallery)에 포함된 아래 소스코드를 수정한 것입니다. 여기서 포인트 샘플링은 제시된 샘플링 지점(Points)에서 다수 레이어의 래스터 값을 샘플링하는 것을 의미합니다.

 

Using GeoPandas with Rasterio to sample point data — GeoPandas 0.10.2+0.g04d377f.dirty documentation

Sampling the data Rasterio requires a list of the coordinates in x,y format rather than as the points that are in the geomentry column. This can be achieved using the code below coord_list = [(x,y) for x,y in zip(gdf['geometry'].x , gdf['geometry'].y)] Car

geopandas.org

이전 글에서 'Python 종 분포 모델링(SDM)' 시리즈 글을 작성했었는데요, 이번 실습 내용을 반영하면 실습 데이터 전처리 단계를 개선할 수 있습니다. QGIS의 Point sampling tool 플러그인을 실행하지 않고 파이썬 프로그래밍으로 포인트 샘플링을 빠르게 수행할 수 있습니다. 이에 실습은 이전에 다뤘던 데이터를 그대로 다뤄보겠습니다. 포인트는 조슈아 트리(JTREE.shp), 래스터 값은 생물 기후 특징(BIOCLIM/bclim*.asc) 19개 레이어입니다.  

 

QGIS: Python 종 분포 모델링(SDM) (2) - 실습 데이터 전처리

안녕하세요? QGIS와 Python을 이용한 종 분포 모델링(SDM: Species Distribution Modeling)을 시리즈 글로 정리해 보겠습니다. 이번에는 두 번째 실습으로 실습 데이터 전처리를 주된 내용으로 정리해 보겠습

blog.daum.net

자, 그럼 시작해볼까요?! 사용할 파이썬 모듈들을 불러옵니다.

import geopandas as gpd # GeoPandas(지오판다스)
import rasterio # Rasterio(래스터리오)
from pathlib import Path # pathlib
import glob # glob(글로브)
import os

실습 데이터를 바라보도록 현 작업 디렉토리를 변경해 줍니다.

os.chdir('D:\\GEODATA\\DATA') # 작업 디렉토리 변경
os.getcwd() # 현재 작업 디렉토리

먼저, 조슈아 트리(JTREE.shp)의 샘플링 지점을 정의해 봅니다.

# 샘플링 지점
gdf = gpd.GeoDataFrame.from_file("JTREE.shp")
gdf.head()

포인트의 좌표를 리스트로 추출합니다.

coord_list = [(x,y) for x,y in zip(gdf['geometry'].x , gdf['geometry'].y)]
print(coord_list[0:5])

다음으로 생물 기후 특징(BIOCLIM/bclim*.asc) 19개 레이어를 정의합니다.

# 래스터 특징
raster_features = sorted(glob.glob(
    'BIOCLIM/bclim*.asc'))
print(raster_features)

자, 이제 포인트 샘플링(point sampling)을 진행합니다!

from pathlib import Path # pathlib
for file in raster_features:
    src = rasterio.open(file) # 파일 읽기
    gdf[Path(file).stem] = [x for x in src.sample(coord_list)] # 포인트 샘플링
    gdf[Path(file).stem] = gdf[Path(file).stem].astype('float64')

아래와 같이 포인트 샘플링이 빠르게 수행되었습니다! 참고로 반응 변수에 해당하는 필드는 'CLASS'입니다.

gdf.head()

불필요한 필드를 제외('lon', 'lat', 'geometry')한 상태에서 *.csv 파일로 저장해 보겠습니다!

gdf[gdf.columns.difference(['lon', 'lat', 'geometry'])].to_csv('JTREE_TRAIN_VEC.csv',index=False)

이제 해당 파일을 열어보면, 아래와 같이 훈련 데이터 전처리 결과를 확인할 수 있습니다.

import pandas as pd
train_vec = pd.read_csv("JTREE_TRAIN_VEC.csv")
train_vec.head()

해당 소스코드를 Python 종 분포 모델링(SDM) 소스코드에 반영했습니다. 이제 QGIS를 쓰지 않고도 Python으로 종 적합성 매핑을 바로 할 수 있습니다! 이번 글은 여기까지 정리해 봅니다.

 

GitHub - osgeokr/SDM

Contribute to osgeokr/SDM development by creating an account on GitHub.

github.com