Я работаю на ГИС-системе и использую базу данных для хранения координат. Я читаю координаты из базы данных с помощью QT API. Я получаю координаты из базы данных в формате WKT (Хорошо известный текст). Далее я пытаюсь построить типы GDAL (OGRGeometry) из WKT. Геометрия является абстрактным классом, а 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";}`
Согласно документы о OGRGeometryFactory::createFromWkt
(найдено с помощью Google), ваш new_geom
«будет НЕДЕЙСТВИТЕЛЕН, если метод потерпит неудачу».
Теперь, если вы получаете возвращаемое значение OGRERR_NONE
но и это NULL
Тогда есть несколько возможностей:
NULL
но также OGRERR_NONE
возвращаемое значениеЧто бы это ни было, вы все равно должны проверить, что NULL
и интерпретировать это как неопределенную ошибку.
Тогда возникает вопрос, почему вы получаете ошибку. Я предлагаю вам добавить эти отладочные отпечатки:
qDebug() << "qsWKT:" << qsWKT;
qDebug() << "hexdump:" << QByteArray(pszWKT).toHex();
Затем посмотрите на них и попытайтесь выяснить, есть ли у вас некоторые из них:
QString::trimmed()
или даже QString::simplified()
чинить)QString
UTF16QString
в std::string
WKT, вероятно, должен быть 7-битным ASCII, поэтому, если этот шестнадцатеричный дамп показывает какие-либо значения, >= 0x80
, тогда вы точно знаете, что у вас есть проблема с кодировкой или повреждением данных.