使用GDAL

时间:2017-12-12 20:34:17

标签: c++ gdal

我使用GDAL库中的OGR来管理空间数据。现在我在Mac上拥有我的本地开发环境。提供的代码在Mac上按预期工作。

但是当在生产Ubuntu机器上构建和运行时,我会遇到Segmentation fault(核心转储)。

代码从PostgreSQL表中获取空间数据并循环结果。在循环中,我打算将OGRGeometry分配给指针,然后分配正确的空间参考。但正如前面所述,我得到了分段错误(核心转储)。应用程序的其他部分使用类似的代码,但它们都不在循环中。大多数情况下,应用程序只是为单个几何体指定空间参考,然后继续前进。

我在记忆问题上添加了评论。

OGRSpatialReference epsg3006;
epsg3006.SetWellKnownGeogCS("EPSG:3006");

for (pqxx::result::const_iterator i = r.begin(); i != r.end(); ++i) {
    const char* wkt = i["geometry"].as<std::string>().c_str();

    // cast because OGR_G_CreateFromWkt will move the pointer
    auto pszWkt = (char*) wkt;

    OGRGeometry* polygon;
    OGRErr err = OGRGeometryFactory::createFromWkt(&pszWkt, &epsg3006, &polygon);

    // This line produces the seg fault
    polygon->assignSpatialReference(&epsg3006);

    // ..omitted code
}

我尝试移动代码:

OGRSpatialReference epsg3006;
epsg3006.SetWellKnownGeogCS("EPSG:3006");

在循环内部没有任何运气。

我尝试使用Valgrind进行调试。但由于here所见的其他问题,它似乎过早地退出了。但这对另一个帖子来说是一个问题。

编辑:现在已经设法让Valgrind工作了。可以找到输出here。 我想问题是在这里释放内存时

at 0x553D4E9: OGRSpatialReference::Release() (in /usr/lib/libgdal.so.20.1.3)

但是我没有想法该怎么做。

我没有想法。生产机器上的段错误可能是什么问题?

0 个答案:

没有答案