Объединение плиток набора данных GDAL в C ++ - PullRequest
0 голосов
/ 17 марта 2020

Я получаю некоторый прототип Python кода, который использует GDAL, перенесенный в C ++, и я застрял в разделе, который считывает фрагменты данных высот из каталога и объединяет их в один набор данных. Код Python выглядит следующим образом:

# Read files containing elevation data in 1° x 1° squares.
geo_file_list = glob.glob ("./geodata/*.hgt")

# Turn the list of files into a list of datasets.
elv_dataset_list = list(map(gdal.Open, geo_file_list))

# Merge datasets into a single one.
elv_dataset = gdal.BuildVRT('', elv_dataset_list)

Я никогда не записываю результирующий VRT, оставляя только память для дальнейшей обработки. Я бы создал драйвер MEM и использовал его, если это возможно.

В C ++ я начинаю с:

// Set data directory.
std::string elev_dir = "./geodata/";

// Get list of files in data directory.
std::vector<GDALDataset *> elev_datasets;

// Read files into datasets.
for(auto& p: std::filesystem::directory_iterator(elev_dir)) {
    elev_datasets.push_back((GDALDataset *) GDALOpen (p.path().c_str(), GA_ReadOnly));
}

Часть, с которой я борюсь, отправляет полученный std: : вектор в GDALBuildVRT (). Вполне возможно, что я все об этом ошибаюсь!

1 Ответ

0 голосов
/ 17 марта 2020

Хитрость заключалась в том, что nullptr является допустимым вводом в GDALBuildVRT() для аргументов, которые следует игнорировать. Следовательно, вызов выглядит так:

GDALDataset *dest_dataset = (GDALDataset *) GDALBuildVRT("", elev_datasets.size(), (GDALDatasetH *) elev_datasets.data(), nullptr, nullptr, nullptr);
...