I am trying to visualize a GDAL dataset in VTK using vtkGDALVectorReader... Everything works fine if I use a disk file. but when I use a memory dataset (ex."/vsimem/input.dat"), vtkGDALVectorReader reports the following error.
ERROR: In /opt/app/VTK-7.1.0/IO/GDAL/vtkGDALVectorReader.cxx, line 643 vtkGDALVectorReader (0xb881b0):
I debugged the program and found out that GDALOpenEx (in vtkGDALVectorReader) returns NULL... How do I fix it?
I am using VTK-7.1 and GDAL-2.1.2 on "RHEL Server 7.2"
the code is as follows....
#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;
}