-1

私はGISシステムに取り組んでおり、座標を保存するためにデータベースを使用しています。QT API を使用してデータベースから座標を読み取ります。データベースから座標を WKT 形式 (Well-Known Text) で取得します。次に、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::createFromWktよると、new_geom 「メソッドが失敗した場合は NULL になります」

戻り値OGRERR_NONEだけでなくそれも取得している場合NULL、いくつかの可能性があります。

  1. 戻り値を確認したコードが間違っています (質問には示されていません)。
  2. ライブラリにバグがあります。
  3. 文書化されていないエラー状況がいくつかあり、その組み合わせを取得するNULLだけでなく、OGRERR_NONE戻り値も取得します。

これらのいずれであっても、それが得られるかどうかを確認しNULL、それを未特定のエラーとして解釈する必要があります。


次に、問題は、なぜエラーが発生するのかということになります。これらのデバッグ プリントを追加することをお勧めします。

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

次に、それらを見て、これらのいくつかがあるかどうかを把握してみてください。

  • ただの無効な WKT 形式
  • 予期しない空白 (QString::trimmed()またはを使用QString::simplified()して修正することもできます)
  • QStringUTF16に変換される前の元のデータのテキスト エンコーディングの不一致
  • QStringからへの変換時のテキスト エンコーディングの不一致std::string

WKT はおそらく 7 ビット ASCII である必要があるため、その 16 進ダンプに の値が示さ>= 0x80れている場合は、エンコードまたはデータ破損の問題があることがわかります。

于 2014-08-02T06:48:42.900 に答える