-1

我在 GIS 系统上工作并使用数据库来存储坐标。我使用 QT API 从数据库中读取坐标。我从数据库中以 WKT 格式(众所周知的文本)获取坐标。接下来,我正在尝试从 WKT 构建 GDAL 类型(OGRGeometry)。Geometry 是抽象类,Point 继承 Geometry。我正在尝试使用功能,特别适用于 Point。当我调试时,最后一列有错误。错误是“”访问冲突读取位置 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";}`
4

1 回答 1

2

根据(与 Google 一起找到)的文档,您的OGRGeometryFactory::createFromWktnew_geom "will be NULL if the method failed"

现在,如果您正在获得返回值OGRERR_NONE但也获得了 that NULL,那么有一些可能性:

  1. 您检查返回值的代码是错误的(问题中未显示)。
  2. 库中有错误。
  3. 有一些未记录的错误情况,您可以将其组合起来,NULL但也可以OGRERR_NONE返回值。

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


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

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

然后看看那些并试着弄清楚你是否有这些:

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

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

于 2014-08-02T06:48:42.900 回答