GIS

Python: GBIF 생물종 분포 데이터 검색 및 다운로드

유병혁 2023. 7. 31. 12:57

안녕하세요? 이번 글은 Python으로 GBIF(https://www.gbif.org/) 생물종 분포 데이터를 검색 및 다운로드하는 방법을 정리해 보겠습니다.

 

GBIF 생물종 분포 데이터

GBIF(지비아이에프)Global Biodiversity Information Facility의 약자로, 전세계 생물다양성 정보를 관리하는 국제적인 기구입니다. GBIF는 과학 연구, 환경 보호 및 정책 결정에 도움이 되는 생물종 분포 데이터를 제공하는 중요한 역할을 합니다. 이 기관은 다양한 출처로부터 생물종 관련 데이터를 수집하고 공유하여 과학자들과 일반 대중에게 제공합니다.

 

생물종 분포 데이터는 특정 생물종이 어느 지역에 얼마나 분포되어 있는지를 기록한 정보입니다. 이 데이터는 특정 지역 또는 국가에서 발견된 생물종의 위치, 수량, 관측 일자 등을 포함하고 있어서 생태학, 환경 보호, 종 보전 등 다양한 분야에서 활용됩니다.

 

GBIF REST API(https://www.gbif.org/developer/summary)는 GBIF에서 제공하는 생물종 분포 데이터에 접근하기 위한 웹 기반 인터페이스입니다. 이 API를 사용하면 데이터를 검색, 필터링 및 다운로드할 수 있으며, 생물종과 관련된 다양한 정보를 얻을 수 있습니다. Python과 같은 프로그래밍 언어를 사용하여 GBIF REST API에 접근하고 데이터를 요청하면, JSON 형식으로 응답이 제공됩니다. 여기서는 응답 포맷을 CSV와 GeoPackage로 변환해 보도록 하겠습니다.

 

GBIF 생물종 분포 데이터 검색 및 다운로드

일단, 필요한 라이브러리들을 가져옵니다.

import os
import requests
import pandas as pd
import geopandas as gpd

실습 편의를 위해 작업 폴더(예: D:/GEODATA)를 변경합니다.

new_working_directory = "D:/GEODATA"

try:
    # 디렉토리를 변경합니다.
    os.chdir(new_working_directory)
    print("작업 폴더가 변경되었습니다. 현재 작업 폴더:", os.getcwd())
except OSError as e:
    print(f"작업 폴더 변경에 실패했습니다: {e}")

GBIF REST API를 사용하여 특정 생물종의 분포 데이터를 다운로드하는 함수(download_gbif_data)를 정의합니다. 함수는 주어진 species_name과 country_code에 해당하는 데이터를 요청하고, 응답을 받은 후에 JSON 형식의 데이터를 Pandas DataFrame으로 변환하여 CSV 파일로 저장합니다.

def download_gbif_data(species_name, country_code, output_file):
    base_url = "https://api.gbif.org/v1/occurrence/search"
    params = {
        "scientificName": species_name,
        "country": country_code,
        "hasCoordinate": "true",
        "basisOfRecord": "HUMAN_OBSERVATION",  # 인간 관측
        "limit": 10000,  # 요청당 가져올 최대 관측 기록 수
    }

    response = requests.get(base_url, params=params)

    if response.status_code == 200:
        data = response.json()
        if "results" in data:
            occurrences = data["results"]
            df = pd.json_normalize(occurrences)

            df.to_csv(output_file, index=False)
            print("데이터 다운로드 및 저장 완료::", output_file)
        else:
            print("주어진 종에 대한 결과를 찾을 수 없습니다.")
    else:
        print("GBIF API에서 데이터 가져오기 실패.")

download_gbif_data 함수를 사용하여 "Pitta nympha"라는 생물종(팔색조)에 대한 대한민국(KR)의 생물종 분포 데이터를 다운로드하고, pitta_nympha_data.csv라는 파일에 저장하는 예시입니다.

species_name = "Pitta nympha"  # 검색하려는 종의 학명(팔색조)
country_code = "KR"  # 대한민국 ISO 3166-1 alpha-2 국가 코드
output_file = "pitta_nympha_data.csv"  # 출력할 csv 파일 이름

download_gbif_data(species_name, country_code, output_file)

이번에는 CSV 파일을 읽어와서 GeoPackage 파일로 변환하는 csv_to_gpkg 함수를 정의해봅니다.

def csv_to_gpkg(input_csv, output_gpkg):
    # CSV 파일을 DataFrame으로 읽기
    df = pd.read_csv(input_csv)

    # DataFrame을 GeoDataFrame으로 변환
    gdf = gpd.GeoDataFrame(
        df,
        geometry=gpd.points_from_xy(df.decimalLongitude, df.decimalLatitude),
        crs="EPSG:4326",
    )

    # Save GeoDataFrame as GeoPackage
    gdf.to_file(output_gpkg, driver="GPKG")
    print("데이터 변환 및 저장 완료:", output_gpkg)

앞서 저장한 "pitta_nympha_data.csv"라는 CSV 파일을 읽어와서 "pitta_nympha_data.gpkg"라는 GeoPackage 파일로 변환하는 작업을 수행합니다. 여기까지 Python으로 GBIF 생물종 분포 데이터를 검색 및 다운로드하는 방법을 정리해 봤습니다.

input_csv = "pitta_nympha_data.csv"  # 입력 csv 파일 경로
output_gpkg = "pitta_nympha_data.gpkg"  # 출력 GeoPackage 파일 경로

csv_to_gpkg(input_csv, output_gpkg)

pitta_nympha_data.csv
0.20MB
pitta_nympha_data.gpkg
0.35MB
1907_Python_GBIF 생물종 분포 데이터 검색 및 다운로드.ipynb
0.00MB