НОТА: Я добавил оба C
а также C++
теги, так как я пытался с C++
версия и C
версия API.
Я должен загрузить geotiff
файл, чтобы показать его вдоль траектории автомобиля. Сначала я открываю файл, используя gdal C++
API для извлечения некоторой информации из него:
double geo_transform[6];
GDALDataset* data = (GDALDataset*) GDALOpenShared( "MyRaster.tif", GA_ReadOnly );
if(data) {
size[0] = data->GetRasterXSize();
size[1] = data->GetRasterYSize();
qDebug() << "RASTER TOTAL BANDS:" << data->GetRasterCount();
if( CE_None == data->GetGeoTransform( geo_transform ) ) {
qDebug() << "RASTER TL:" << geo_transform[0] << geo_transform[3];
qDebug() << "RASTER SIZE:" << size[0] << size[1];
qDebug() << "RASTER ROTATIONS:" << geo_transform[2] << geo_transform[4];
qDebug() << "PIXEL SIZE:" << geo_transform[1] << geo_transform[5];
toret = true;
}
/*
* Retrieve the pixel size and top left corner and store it in a proper variable.
*/
GDALClose(data);
Затем в другой теме (запускается через QThread
) Я «загружаю» изображение в QPixmap
(это переменная класса, в который я загружаю растр. В конструкторе он инициализируется пустым растровым изображением):
temp_pixmap.load( "MyRaster.tif" );
Кажется, это работает, так как растр отображается, и я могу увеличить его, панорамировать и т. Д.
Проблема в том, что я могу открыть один и тот же файл только один раз. Если я хочу, чтобы растр загружался в двух разных растровых изображениях, поэтому первый может быть присоединен к траектории, а второй — для создания аннотаций, второй загружается пустым.
Я попробовал эти варианты, но безуспешно:
Вариация 1: Имея GDALDataSource
указатель как переменная класса и вызов GDALClose
в деструкторе.
Вариация 2: Вместо открытия растра с помощью GDALOpen
Я попробовал это с GDALOpenShared
и закройте его в деструкторе.
Вариация 3: С использованием C
версия:
GDALDatasetH hDataset;
hDataset = GDALOpen( Element::getFilePath().c_str(), GA_ReadOnly );
if( hDataset != NULL ) {
GDALDriverH hDriver;
hDriver = GDALGetDatasetDriver( hDataset );
if( GDALGetGeoTransform( hDataset, geo_transform ) == CE_None ) {
// Get the size and top left corner...
}
}
GDALClose(hDataset);
в Закрытие набора данных раздел API учебник есть это:
Forgetting to call GDALClose on a dataset opened in update mode in a popular format like GTiff will likely result in being unable to open it afterwards
Я открыл набор данных, если READ_ONLY
режим и обязательно позвонить всегда Close
, Так что проблема может быть в Qt
сторона, когда он загружает растр в растровое изображение?
NEW:
После разговора с коллегой, у которого была такая же проблема, мы думаем, что проблема в стороне gdal
, так как кажется, что растр не закрыт должным образом, и это вызывает поведение, объясняющее в API Tutorial.
Я буду продолжать расследование …
НОТА: Это временно и не удовлетворительно. Я все еще ищу лучшее решение. Так что, если кто-то знает способ, опубликуйте ответ, и я с благодарностью приму и одобряю его.
Решение, которое я использую сейчас, заключается в закрытии растра всякий раз, когда мне нужно проверить другой.
Наше приложение имеет виджет дерева, который показывает, сколько элементов у нас открыто (и их тип). Поэтому, когда мы выбираем растр, связанный с траекторией, мы просто закрываем его, если он загружен (как в этом случае, нам нужно дважды открыть его), и снова открываем его.
Затем, когда нам нужно работать только с растром, мы должны закрыть его в связанный узел и открыть его в Я здесь одна узел.
Настоящая боль.
Других решений пока нет …