Я пытаюсь визуализировать набор данных GDAL в VTK с помощью vtkGDALVectorReader …
Все отлично работает, если я использую файл на диске.
но когда я использую набор данных памяти (например, «/ vsimem / input.dat»), vtkGDALVectorReader сообщает о следующей ошибке.
ОШИБКА: в /opt/app/VTK-7.1.0/IO/GDAL/vtkGDALVectorReader.cxx, строка 643
vtkGDALVectorReader (0xb881b0):
Я отладил программу и обнаружил, что GDALOpenEx (в vtkGDALVectorReader) возвращает NULL …
Как мне это исправить?
Я использую VTK-7.1 и GDAL-2.1.2 на «RHEL Server 7.2»
код выглядит следующим образом ….
#include <iostream>
#include <iomanip>
#include <ogrsf_frmts.h>
#include <vtkSmartPointer.h>
#include <vtkGDALVectorReader.h>
#include <vtkCompositeDataGeometryFilter.h>
#include <vtkCompositePolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkCamera.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#define MEMORY_FILENAME "/vsimem/example.dat"
int main(int argc, char *argv[])
{
GDALAllRegister();
VSIInstallMemFileHandler();
GDALDataset *shpDS = (GDALDataset*) GDALOpenEx(argv[1], GDAL_OF_VECTOR, NULL, NULL, NULL);
if(shpDS == NULL)
{
std::cerr << "Input ESRI Shapefile Open Failed..." << std::endl;
return -1;
}
GDALDriver *memDriver = GetGDALDriverManager()->GetDriverByName("Memory");
if(memDriver == NULL)
{
std::cerr << "GDAL Memory driver not available...." << std::endl;
return -1;
}
GDALDataset *memDS = memDriver->CreateCopy(MEMORY_FILENAME, shpDS, FALSE, NULL, NULL, NULL);
GDALClose(shpDS);
vtkSmartPointer<vtkGDALVectorReader> reader = vtkSmartPointer<vtkGDALVectorReader>::New();
reader->SetFileName(MEMORY_FILENAME);
// reader->SetFileName(argv[1]);
vtkSmartPointer<vtkCompositeDataGeometryFilter> filter = vtkSmartPointer<vtkCompositeDataGeometryFilter>::New();
filter->SetInputConnection(reader->GetOutputPort());
vtkSmartPointer<vtkCompositePolyDataMapper> mapper = vtkSmartPointer<vtkCompositePolyDataMapper>::New();
mapper->SetInputConnection(filter->GetOutputPort());
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
renderer->SetBackground(0.1, 0.2, 0.4);
renderer->ResetCamera();
renderer->GetActiveCamera()->Zoom(1.5);
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->SetSize(500, 500);
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderWindowInteractor->Start();
GDALClose(memDS);
return 0;
}
Задача ещё не решена.
Других решений пока нет …