Skip to content

Commit

Permalink
Merge pull request #33021 from rouault/fx_writing_to_kml_with_gdal_3
Browse files Browse the repository at this point in the history
QgsVectorFileWriter: fix axis order issue with GDAL 3 (fixes #33014)
  • Loading branch information
rouault committed Nov 22, 2019
2 parents 22a72be + e75ff1b commit a485b47
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 0 deletions.
6 changes: 6 additions & 0 deletions src/core/qgsvectorfilewriter.cpp
Expand Up @@ -398,6 +398,12 @@ void QgsVectorFileWriter::init( QString vectorFileName,
QString srsWkt = srs.toWkt();
QgsDebugMsg( "WKT to save as is " + srsWkt );
mOgrRef = OSRNewSpatialReference( srsWkt.toLocal8Bit().constData() );
#if GDAL_VERSION_MAJOR >= 3
if ( mOgrRef )
{
OSRSetAxisMappingStrategy( mOgrRef, OAMS_TRADITIONAL_GIS_ORDER );
}
#endif
}

// datasource created, now create the output layer
Expand Down
34 changes: 34 additions & 0 deletions tests/src/python/test_qgsvectorfilewriter.py
Expand Up @@ -1144,6 +1144,40 @@ def testWriteWithBinaryField(self):
del vl
os.unlink(filename + '.gpkg')

def testWriteKMLAxisOrderIssueGDAL3(self):
"""Check axis order issue when writing KML with EPSG:4326."""

if not ogr.GetDriverByName('KML'):
return

vl = QgsVectorLayer(
'PointZ?crs=epsg:4326&field=name:string(20)',
'test',
'memory')

self.assertTrue(vl.isValid(), 'Provider not initialized')

ft = QgsFeature()
ft.setGeometry(QgsGeometry.fromWkt('Point(2 49)'))
myResult, myFeatures = vl.dataProvider().addFeatures([ft])
self.assertTrue(myResult)
self.assertTrue(myFeatures)

dest_file_name = os.path.join(str(QDir.tempPath()), 'testWriteKMLAxisOrderIssueGDAL3.kml')
write_result, error_message = QgsVectorFileWriter.writeAsVectorFormat(
vl,
dest_file_name,
'utf-8',
vl.crs(),
'KML')
self.assertEqual(write_result, QgsVectorFileWriter.NoError, error_message)

# Open result and check
created_layer = QgsVectorLayer(dest_file_name, 'test', 'ogr')
self.assertTrue(created_layer.isValid())
f = next(created_layer.getFeatures(QgsFeatureRequest()))
self.assertEqual(f.geometry().asWkt(), 'PointZ (2 49 0)')


if __name__ == '__main__':
unittest.main()

0 comments on commit a485b47

Please sign in to comment.