"Access violation reading location 0x00000000" GDAL WKT C++

"Access violation reading location 0x00000000" GDAL WKT C++

本文关键字:GDAL WKT C++ 0x00000000 location Access violation reading      更新时间:2023-10-16

我在gis系统上工作,使用数据库存储坐标。我从数据库与QT API读取坐标。我得到坐标从数据库在WKT格式(众所周知的文本)。接下来,我将尝试从WKT构建GDAL类型(OGRGeometry)。Geometry是抽象类,Point继承了Geometry。我试着用函数来表示点。当我调试时,在最后一列有错误。错误是"读取位置0x00000000"

`QString qsWKT = model.data(model.index(0, 0)).toString();
std::string temp(qpszWKT.toStdString()); 
char* pszWkt = (char*)temp.c_str();
OGRGeometry* new_geom;
OGRErr err = OGRGeometryFactory::createFromWkt(&pszWkt, NULL, &new_geom);
if(new_geom->getGeometryName() == "Point") { qDebug() << "good";}`

根据OGRGeometryFactory::createFromWkt的文档(通过Google找到),如果方法失败,您的new_geom "将为NULL "

现在,如果你得到返回值OGRERR_NONE,但也NULL,那么有一些可能性:

  1. 您检查返回值的代码是错误的(未显示在问题中)。
  2. 库中有一个bug。
  3. 有一些未记录的错误情况,你得到NULLOGRERR_NONE返回值的组合。

无论它是哪一种,您仍然必须检查是否得到了NULL,并将其解释为未指定的错误。


那么问题就变成了,为什么会出现错误。我建议您添加这些调试打印:

qDebug() << "qsWKT:" << qsWKT;
qDebug() << "hexdump:" << QByteArray(pszWKT).toHex();

然后看看这些,并试着找出你是否有这些:

  • 只是普通无效的WKT格式
  • 意外空白(使用QString::trimmed()甚至QString::simplified()修复)
  • 转换为QString UTF16之前原始数据中的文本编码不匹配
  • QString转换为std::string时文本编码不匹配

WKT可能应该是7位ASCII,所以如果十六进制转储显示任何>= 0x80的值,那么你肯定知道你有编码或数据损坏问题。