티스토리 뷰

반응형

이번 글은 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)
반응형
댓글