无法阅读" / vsimem /"使用vtkGDALVectorReader

时间:2016-12-24 08:13:38

标签: c++ vtk shapefile gdal esri

我正在尝试使用vtkGDALVectorReader在VTK中可视化GDAL数据集... 如果我使用磁盘文件,一切正常。 但是当我使用内存数据集(例如" /vsimem/input.dat")时,vtkGDALVectorReader会报告以下错误。

错误:在/opt/app/VTK-7.1.0/IO/GDAL/vtkGDALVectorReader.cxx,第643行 vtkGDALVectorReader(0xb881b0):

我调试了程序,发现GDALOpenEx(在vtkGDALVectorReader中)返回NULL ... 我该如何解决?

我在" RHEL Server 7.2"

上使用VTK-7.1和GDAL-2.1.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;
}

0 个答案:

没有答案