티스토리 뷰

반응형

이번 글은 파이썬에서 GIS 경위도 좌표에 해당하는 다양한 환경변수 주제도의 값들을 추출하고 엑셀파일로 저장하는 일련의 과정을 설명한다.

 

1. 관련 패키지를 불러온다.

import os

from osgeo import gdal
import affine

import pandas as pd
import numpy as np
import glob

2. GIS 경위도 좌표를 불러온다.

in_xy = "./data/samples/in_xy.csv"
df = pd.read_csv(in_xy, encoding="euc-kr")

3. GIS 위치좌표에 해당하는 환경변수의 값을 일괄로 추출하는 함수를 작성

# asc파일의 특정 위치에서 해당 값 추출하기
# 해발고도와 관련 asc파일에서 특정위치의 해발고도 값을 추출하기

for env in glob.glob("./data/layers/*.asc"):

    val = []

    # print(env)

    env_name = env.split("\\")[-1].split(".")[0]

    ds = gdal.Open(env)
    # print(ds.GetGeoTransform())
    tl_x, x_res, _, tl_y, _, y_res = ds.GetGeoTransform()
    # print(tl_x, x_res, tl_y, y_res)

    array = ds.ReadAsArray()

    for i, row in df.iterrows():

        # print(i, row["longitude"])

        # x = df.loc[0, "longitude"]
        # y = df.loc[0, "latitude"]

        x = row["longitude"]
        y = row["latitude"]

        x_index = int((x - tl_x) / x_res)
        y_index = int((y - tl_y) / y_res)
        # print(x_index, y_index)

        val.append(array[y_index, x_index])

    # print(val)
    df[env_name] = val
    print(df)

4. 실행결과를 csv파일로 저장한다.

df.to_csv("xy_env_data.csv", index=False)
ds = None

5. 전체 코드는 다음과 같다.

import os

from osgeo import gdal
import affine

import pandas as pd
import numpy as np
import glob

in_xy = "./data/samples/in_xy.csv"
in_asc = "./data/layers/alt_110_skorea.asc"
out_tif = "./data/outputs/alt_100_skorea.tif"

df = pd.read_csv(in_xy, encoding="euc-kr")

# print(df.head())

# ds = gdal.Open(in_asc)
# print(ds.GetGeoTransform())
# tl_x, x_res, _, tl_y, _, y_res = ds.GetGeoTransform()
# print(tl_x, x_res, tl_y, y_res)
# array = ds.ReadAsArray()
# print(array)


# asc파일의 특정 위치에서 해당 값 추출하기
# 해발고도와 관련 asc파일에서 특정위치의 해발고도 값을 추출하기

for env in glob.glob("./data/layers/*.asc"):

    val = []

    # print(env)

    env_name = env.split("\\")[-1].split(".")[0]

    ds = gdal.Open(env)
    # print(ds.GetGeoTransform())
    tl_x, x_res, _, tl_y, _, y_res = ds.GetGeoTransform()
    # print(tl_x, x_res, tl_y, y_res)

    array = ds.ReadAsArray()

    for i, row in df.iterrows():

        # print(i, row["longitude"])

        # x = df.loc[0, "longitude"]
        # y = df.loc[0, "latitude"]

        x = row["longitude"]
        y = row["latitude"]

        x_index = int((x - tl_x) / x_res)
        y_index = int((y - tl_y) / y_res)
        # print(x_index, y_index)

        val.append(array[y_index, x_index])

    # print(val)
    df[env_name] = val


print(df)
df.to_csv("xy_env_data.csv", index=False)
ds = None
반응형
댓글