Skip to content

Commit 7de9999

Browse files
authored
Merge pull request #5206 from rouault/ogrprovider_use_gdaldriver_and_gdaldataset_api
[OGR provider] USE GDAL driver and dataset API, and pass FORCE_SRS_DETECTION=YES for GML
2 parents 938f261 + 0ee9d66 commit 7de9999

File tree

5 files changed

+214
-183
lines changed

5 files changed

+214
-183
lines changed

src/providers/ogr/qgsogrconnpool.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@
1818

1919
#include "qgsconnectionpool.h"
2020
#include "qgsogrprovider.h"
21-
#include <ogr_api.h>
21+
#include <gdal.h>
2222

2323

2424
struct QgsOgrConn
2525
{
2626
QString path;
27-
OGRDataSourceH ds;
27+
GDALDatasetH ds;
2828
bool valid;
2929
};
3030

@@ -37,14 +37,14 @@ inline void qgsConnectionPool_ConnectionCreate( const QString &connInfo, QgsOgrC
3737
{
3838
c = new QgsOgrConn;
3939
QString filePath = connInfo.left( connInfo.indexOf( QLatin1String( "|" ) ) );
40-
c->ds = OGROpen( filePath.toUtf8().constData(), false, nullptr );
40+
c->ds = GDALOpenEx( filePath.toUtf8().constData(), GDAL_OF_VECTOR, nullptr, nullptr, nullptr );
4141
c->path = connInfo;
4242
c->valid = true;
4343
}
4444

4545
inline void qgsConnectionPool_ConnectionDestroy( QgsOgrConn *c )
4646
{
47-
QgsOgrProviderUtils::OGRDestroyWrapper( c->ds );
47+
QgsOgrProviderUtils::GDALCloseWrapper( c->ds );
4848
delete c;
4949
}
5050

src/providers/ogr/qgsogrdataitems.cpp

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,13 @@ QgsOgrLayerItem::QgsOgrLayerItem( QgsDataItem *parent,
5151
setState( Populated ); // children are not expected
5252

5353
OGRRegisterAll();
54-
OGRSFDriverH hDriver;
55-
OGRDataSourceH hDataSource = QgsOgrProviderUtils::OGROpenWrapper( mPath.toUtf8().constData(), true, &hDriver );
54+
GDALDriverH hDriver;
55+
GDALDatasetH hDataSource = QgsOgrProviderUtils::GDALOpenWrapper( mPath.toUtf8().constData(), true, &hDriver );
5656

5757
if ( hDataSource )
5858
{
59-
QString driverName = OGR_Dr_GetName( hDriver );
60-
OGR_DS_Destroy( hDataSource );
59+
QString driverName = GDALGetDriverShortName( hDriver );
60+
GDALClose( hDataSource );
6161

6262
if ( driverName == QLatin1String( "ESRI Shapefile" ) )
6363
mCapabilities |= SetCrs;
@@ -336,9 +336,9 @@ void QgsOgrLayerItem::deleteLayer()
336336

337337
// -------
338338

339-
static QgsOgrLayerItem *dataItemForLayer( QgsDataItem *parentItem, QString name, QString path, OGRDataSourceH hDataSource, int layerId, bool isSubLayer = false )
339+
static QgsOgrLayerItem *dataItemForLayer( QgsDataItem *parentItem, QString name, QString path, GDALDatasetH hDataSource, int layerId, bool isSubLayer = false )
340340
{
341-
OGRLayerH hLayer = OGR_DS_GetLayer( hDataSource, layerId );
341+
OGRLayerH hLayer = GDALDatasetGetLayer( hDataSource, layerId );
342342
OGRFeatureDefnH hDef = OGR_L_GetLayerDefn( hLayer );
343343

344344
QgsLayerItem::LayerType layerType = QgsLayerItem::Vector;
@@ -404,11 +404,11 @@ QVector<QgsDataItem *> QgsOgrDataCollectionItem::createChildren()
404404
{
405405
QVector<QgsDataItem *> children;
406406

407-
OGRSFDriverH hDriver;
408-
OGRDataSourceH hDataSource = QgsOgrProviderUtils::OGROpenWrapper( mPath.toUtf8().constData(), false, &hDriver );
407+
GDALDriverH hDriver;
408+
GDALDatasetH hDataSource = QgsOgrProviderUtils::GDALOpenWrapper( mPath.toUtf8().constData(), false, &hDriver );
409409
if ( !hDataSource )
410410
return children;
411-
int numLayers = OGR_DS_GetLayerCount( hDataSource );
411+
int numLayers = GDALDatasetGetLayerCount( hDataSource );
412412

413413
children.reserve( numLayers );
414414
for ( int i = 0; i < numLayers; ++i )
@@ -417,7 +417,7 @@ QVector<QgsDataItem *> QgsOgrDataCollectionItem::createChildren()
417417
children.append( item );
418418
}
419419

420-
OGR_DS_Destroy( hDataSource );
420+
GDALClose( hDataSource );
421421

422422
return children;
423423
}
@@ -576,20 +576,21 @@ QGISEXTERN QgsDataItem *dataItem( QString path, QgsDataItem *parentItem )
576576
// if this is a VRT file make sure it is vector VRT to avoid duplicates
577577
if ( suffix == QLatin1String( "vrt" ) )
578578
{
579-
OGRSFDriverH hDriver = OGRGetDriverByName( "VRT" );
579+
GDALDriverH hDriver = GDALGetDriverByName( "OGR_VRT" );
580580
if ( hDriver )
581581
{
582582
// do not print errors, but write to debug
583583
CPLPushErrorHandler( CPLQuietErrorHandler );
584584
CPLErrorReset();
585-
OGRDataSourceH hDataSource = OGR_Dr_Open( hDriver, path.toLocal8Bit().constData(), 0 );
585+
GDALDatasetH hDataSource = GDALOpenEx(
586+
path.toLocal8Bit().constData(), GDAL_OF_VECTOR, nullptr, nullptr, nullptr );
586587
CPLPopErrorHandler();
587588
if ( ! hDataSource )
588589
{
589590
QgsDebugMsgLevel( "Skipping VRT file because root is not a OGR VRT", 2 );
590591
return nullptr;
591592
}
592-
OGR_DS_Destroy( hDataSource );
593+
GDALClose( hDataSource );
593594
}
594595
}
595596
// Handle collections
@@ -609,22 +610,22 @@ QGISEXTERN QgsDataItem *dataItem( QString path, QgsDataItem *parentItem )
609610

610611
// test that file is valid with OGR
611612
OGRRegisterAll();
612-
OGRSFDriverH hDriver;
613+
GDALDriverH hDriver;
613614
// do not print errors, but write to debug
614615
CPLPushErrorHandler( CPLQuietErrorHandler );
615616
CPLErrorReset();
616-
OGRDataSourceH hDataSource = QgsOgrProviderUtils::OGROpenWrapper( path.toUtf8().constData(), false, &hDriver );
617+
GDALDatasetH hDataSource = QgsOgrProviderUtils::GDALOpenWrapper( path.toUtf8().constData(), false, &hDriver );
617618
CPLPopErrorHandler();
618619

619620
if ( ! hDataSource )
620621
{
621-
QgsDebugMsg( QString( "OGROpen error # %1 : %2 on %3" ).arg( CPLGetLastErrorNo() ).arg( CPLGetLastErrorMsg() ).arg( path ) );
622+
QgsDebugMsg( QString( "GDALOpen error # %1 : %2 on %3" ).arg( CPLGetLastErrorNo() ).arg( CPLGetLastErrorMsg() ).arg( path ) );
622623
return nullptr;
623624
}
624625

625-
QgsDebugMsgLevel( QString( "OGR Driver : %1" ).arg( OGR_Dr_GetName( hDriver ) ), 2 );
626+
QgsDebugMsgLevel( QString( "GDAL Driver : %1" ).arg( GDALGetDriverShortName( hDriver ) ), 2 );
626627

627-
int numLayers = OGR_DS_GetLayerCount( hDataSource );
628+
int numLayers = GDALDatasetGetLayerCount( hDataSource );
628629

629630
QgsDataItem *item = nullptr;
630631

@@ -639,6 +640,6 @@ QGISEXTERN QgsDataItem *dataItem( QString path, QgsDataItem *parentItem )
639640
item = new QgsOgrDataCollectionItem( parentItem, name, path );
640641
}
641642

642-
OGR_DS_Destroy( hDataSource );
643+
GDALClose( hDataSource );
643644
return item;
644645
}

src/providers/ogr/qgsogrfeatureiterator.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@ QgsOgrFeatureIterator::QgsOgrFeatureIterator( QgsOgrFeatureSource *source, bool
5555

5656
if ( mSource->mLayerName.isNull() )
5757
{
58-
ogrLayer = OGR_DS_GetLayer( mConn->ds, mSource->mLayerIndex );
58+
ogrLayer = GDALDatasetGetLayer( mConn->ds, mSource->mLayerIndex );
5959
}
6060
else
6161
{
62-
ogrLayer = OGR_DS_GetLayerByName( mConn->ds, mSource->mLayerName.toUtf8().constData() );
62+
ogrLayer = GDALDatasetGetLayerByName( mConn->ds, mSource->mLayerName.toUtf8().constData() );
6363
}
6464
if ( !ogrLayer )
6565
{
@@ -306,7 +306,7 @@ bool QgsOgrFeatureIterator::close()
306306

307307
if ( mSubsetStringSet )
308308
{
309-
OGR_DS_ReleaseResultSet( mConn->ds, ogrLayer );
309+
GDALDatasetReleaseResultSet( mConn->ds, ogrLayer );
310310
}
311311

312312
if ( mConn )
@@ -420,7 +420,7 @@ QgsOgrFeatureSource::QgsOgrFeatureSource( const QgsOgrProvider *p )
420420
, mFields( p->mAttributeFields )
421421
, mFirstFieldIsFid( p->mFirstFieldIsFid )
422422
, mOgrGeometryTypeFilter( QgsOgrProvider::ogrWkbSingleFlatten( p->mOgrGeometryTypeFilter ) )
423-
, mDriverName( p->ogrDriverName )
423+
, mDriverName( p->mGDALDriverName )
424424
, mCrs( p->crs() )
425425
, mWkbType( p->wkbType() )
426426
{

0 commit comments

Comments
 (0)