티스토리 뷰
이번 글은 MaxEnt 모델에 사용되는 환경변수들을 일괄적으로 기준 파일이 가지고 있는 해상도와 지리적 범위을 일치시키는 방법을 설명한다.
MaxEnt 프로그램을 수행할 때 사용되는 다양한 환경변수들은 반드시 동일한 해상도와 지리적 범위에 있어야 오류없이 수행된다.
# 관련 패키지 불러오기
# rasterio 설치: pip install rasterio
import rasterio
from rasterio.warp import reproject, Resampling
import numpy as np
# 다중 환경변수 래스터 파일을 기준 래스터 파일의 해상도와 지리적 범위를 일치시키는 함수 정의
def match_resolution_size(reference_raster, target_raster):
raster_name = os.path.basename(target_raster).split('.')[0]
os.makedirs("temp1", exist_ok=True)
# 기준 래스터 파일 열기
with rasterio.open(reference_raster) as src_ref:
# 기준 래스터 파일의 해상도 및 지리적 범위 가져오기
reference_resolution = src_ref.res
reference_extent = src_ref.bounds
reference_crs = src_ref.crs
# 대상 래스터 파일 열기
with rasterio.open(target_raster) as src_target:
# 대상 래스터 파일의 해상도 및 지리적 범위 가져오기
target_resolution = src_target.res
target_extent = src_target.bounds
target_crs = src_target.crs
# 대상 래스터 파일을 기준 래스터 파일의 해상도와 지리적 범위로 재투영
reprojected_data, _ = reproject(
source=rasterio.band(src_target, 1),
destination=np.empty((src_ref.height, src_ref.width)), # Provide a destination
src_transform=src_target.transform,
src_crs=target_crs,
src_resolution=target_resolution,
dst_transform=src_ref.transform,
dst_crs=reference_crs,
dst_resolution=reference_resolution,
# resampling=Resampling.bilinear
resampling=Resampling.nearest
)
# 재투영된 데이터를 새로운 래스터 파일로 저장
with rasterio.open(f"temp1/{raster_name}_ed.tif", 'w', driver='GTiff', width=reprojected_data.shape[1],
height=reprojected_data.shape[0], count=1, dtype=reprojected_data.dtype,
crs=reference_crs, transform=src_ref.transform) as dst:
dst.write(reprojected_data, 1)
print(f"{raster_name}_output_raster.tif 해상도 및 지리적 범위가 일치하는 래스터 파일이 생성되었습니다.")
# 기준 래스터 파일 (해상도 및 지리적 범위를 설정할 대상)
# 환경변수가 있는 폴더 지정
env_folder =
# 환경변수 목록 만들기
raster_paths = []
# 래스터 파일 목록 가져오기
for root, dirs, files in os.walk(env_data_path):
for file in files:
if file.endswith(".tif"): # 래스터 파일 확장자에 맞게 수정
raster_paths.append(os.path.join(root, file))
# 기준 래스터 파일 (해상도 및 지리적 범위를 설정할 대상)
reference_raster = 'env_data/bnd/seoul_bnd.tif'
# 폴더 있는 환경변수 목록을 대상으로 일괄 처리
for raster_path in raster_paths:
print(raster_path)
match_resolution_size(reference_raster, raster_path)
<전체 코드>
# 관련 패키지 불러오기
# rasterio 설치: pip install rasterio
import rasterio
from rasterio.warp import reproject, Resampling
import numpy as np
# 다중 환경변수 래스터 파일을 기준 래스터 파일의 해상도와 지리적 범위를 일치시키는 함수 정의
def match_resolution_size(reference_raster, target_raster):
raster_name = os.path.basename(target_raster).split('.')[0]
os.makedirs("temp1", exist_ok=True)
# 기준 래스터 파일 열기
with rasterio.open(reference_raster) as src_ref:
# 기준 래스터 파일의 해상도 및 지리적 범위 가져오기
reference_resolution = src_ref.res
reference_extent = src_ref.bounds
reference_crs = src_ref.crs
# 대상 래스터 파일 열기
with rasterio.open(target_raster) as src_target:
# 대상 래스터 파일의 해상도 및 지리적 범위 가져오기
target_resolution = src_target.res
target_extent = src_target.bounds
target_crs = src_target.crs
# 대상 래스터 파일을 기준 래스터 파일의 해상도와 지리적 범위로 재투영
reprojected_data, _ = reproject(
source=rasterio.band(src_target, 1),
destination=np.empty((src_ref.height, src_ref.width)), # Provide a destination
src_transform=src_target.transform,
src_crs=target_crs,
src_resolution=target_resolution,
dst_transform=src_ref.transform,
dst_crs=reference_crs,
dst_resolution=reference_resolution,
# resampling=Resampling.bilinear
resampling=Resampling.nearest
)
# 재투영된 데이터를 새로운 래스터 파일로 저장
with rasterio.open(f"temp1/{raster_name}_ed.tif", 'w', driver='GTiff', width=reprojected_data.shape[1],
height=reprojected_data.shape[0], count=1, dtype=reprojected_data.dtype,
crs=reference_crs, transform=src_ref.transform) as dst:
dst.write(reprojected_data, 1)
print(f"{raster_name}_output_raster.tif 해상도 및 지리적 범위가 일치하는 래스터 파일이 생성되었습니다.")
# 기준 래스터 파일 (해상도 및 지리적 범위를 설정할 대상)
# 환경변수가 있는 폴더 지정
env_folder =
# 환경변수 목록 만들기
raster_paths = []
# 래스터 파일 목록 가져오기
for root, dirs, files in os.walk(env_data_path):
for file in files:
if file.endswith(".tif"): # 래스터 파일 확장자에 맞게 수정
raster_paths.append(os.path.join(root, file))
# 기준 래스터 파일 (해상도 및 지리적 범위를 설정할 대상)
reference_raster = 'env_data/bnd/seoul_bnd.tif'
# 폴더 있는 환경변수 목록을 대상으로 일괄 처리
for raster_path in raster_paths:
print(raster_path)
match_resolution_size(reference_raster, raster_path)
'Python for GIS and 원격탐사' 카테고리의 다른 글
geoTiff 파일을 asc 파일로 폴더 단위로 일괄 변경하기 (0) | 2024.05.19 |
---|