Использование GDAL в Python для создания TIFF-файлов из CSV-файлов

У меня есть много CSV-файлов с этим форматом:

Latitude,Longitude,Concentration
53.833399,-122.825257,0.021957
53.837893,-122.825238,0.022642
....

Моя цель - создать файлы GeoTiff на основе информации, содержащейся в этих файлах (один файл TIFF на файл CSV), предпочтительно с использованием Python. Это было сделано несколько лет назад над проектом, над которым я работаю, однако то, как они это делали раньше, было потеряно. Все, что я знаю, это то, что они, скорее всего, использовали GDAL.

Я пытался сделать это, исследуя, как использовать GDAL, но это никуда меня не привело, так как ресурсы ограничены, и я не знаю, как это использовать.

Может кто-то помочь мне с этим?

1 ответ

Решение

Вот небольшой код, который я адаптировал для вашего случая. Вам нужно иметь каталог GDAL со всеми *.exe в вашем пути, чтобы он работал (в большинстве случаев это C:\Program Files (x86)\GDAL).

Он использует gdal_grid.exe util (см. документ здесь: http://www.gdal.org/gdal_grid.html)

Вы можете изменить, как вы хотите gdal_cmd Переменная в соответствии с вашими потребностями.

import subprocess
import os

# your directory with all your csv files in it
dir_with_csvs = r"C:\my_csv_files"

# make it the active directory
os.chdir(dir_with_csvs)

# function to get the csv filenames in the directory
def find_csv_filenames(path_to_dir, suffix=".csv"):
    filenames = os.listdir(path_to_dir)
    return [ filename for filename in filenames if filename.endswith(suffix) ]

# get the filenames
csvfiles = find_csv_filenames(dir_with_csvs)

# loop through each CSV file
# for each CSV file, make an associated VRT file to be used with gdal_grid command
# and then run the gdal_grid util in a subprocess instance
for fn in csvfiles:
    vrt_fn = fn.replace(".csv", ".vrt")
    lyr_name = fn.replace('.csv', '')
    out_tif = fn.replace('.csv', '.tiff')
    with open(vrt_fn, 'w') as fn_vrt:
        fn_vrt.write('<OGRVRTDataSource>\n')
        fn_vrt.write('\t<OGRVRTLayer name="%s">\n' % lyr_name)
        fn_vrt.write('\t\t<SrcDataSource>%s</SrcDataSource>\n' % fn)
        fn_vrt.write('\t\t<GeometryType>wkbPoint</GeometryType>\n')
        fn_vrt.write('\t\t<GeometryField encoding="PointFromColumns" x="Longitude" y="Latitude" z="Concentration"/>\n')
        fn_vrt.write('\t</OGRVRTLayer>\n')
        fn_vrt.write('</OGRVRTDataSource>\n')

    gdal_cmd = 'gdal_grid -a invdist:power=2.0:smoothing=1.0 -zfield "Concentration" -of GTiff -ot Float64 -l %s %s %s' % (lyr_name, vrt_fn, out_tif)

    subprocess.call(gdal_cmd, shell=True)
Другие вопросы по тегам