我有很多这种格式的csv文件:
Latitude,Longitude,Concentration
53.833399,-122.825257,0.021957
53.837893,-122.825238,0.022642
....
我的目标是根据这些文件中的信息(每个csv文件一个tiff文件)生成GeoTiff文件,最好使用python。这是几年前在我正在进行的项目上完成的,但他们之前是如何做到的。我所知道的是他们最有可能使用GDAL。
我试图通过研究如何使用GDAL来做到这一点,但这并没有让我任何地方,因为资源有限,我不知道如何使用它。
有人可以帮我这个吗?
答案 0 :(得分:2)
这是我根据你的情况调整的一些代码。您需要将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)