From 4080aad0eef5d8ca78fdab2e3c4e3ce0815e6610 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Mon, 27 Jun 2016 12:04:11 +1000 Subject: [PATCH] [ogr] Read GPX elevation values as geometry Z values --- src/providers/ogr/qgsogrprovider.cpp | 1 + tests/src/python/test_provider_ogr.py | 18 ++++++++++++++++++ tests/testdata/elev.gpx | 15 +++++++++++++++ tests/testdata/noelev.gpx | 12 ++++++++++++ 4 files changed, 46 insertions(+) create mode 100644 tests/testdata/elev.gpx create mode 100644 tests/testdata/noelev.gpx diff --git a/src/providers/ogr/qgsogrprovider.cpp b/src/providers/ogr/qgsogrprovider.cpp index b95108233047..b6d9ff7cccbc 100644 --- a/src/providers/ogr/qgsogrprovider.cpp +++ b/src/providers/ogr/qgsogrprovider.cpp @@ -3073,6 +3073,7 @@ void QgsOgrProvider::open( OpenMode mode ) QgsDebugMsg( "mLayerName: " + mLayerName ); QgsDebugMsg( "mSubsetString: " + mSubsetString ); CPLSetConfigOption( "OGR_ORGANIZE_POLYGONS", "ONLY_CCW" ); // "SKIP" returns MULTIPOLYGONs for multiringed POLYGONs + CPLSetConfigOption( "GPX_ELE_AS_25D", "YES" ); // use GPX elevation as z values if ( mFilePath.startsWith( "MySQL:" ) && !mLayerName.isEmpty() && !mFilePath.endsWith( ",tables=" + mLayerName ) ) { diff --git a/tests/src/python/test_provider_ogr.py b/tests/src/python/test_provider_ogr.py index 680c2fa6e5ff..9fb11b4780b6 100644 --- a/tests/src/python/test_provider_ogr.py +++ b/tests/src/python/test_provider_ogr.py @@ -116,6 +116,24 @@ def testMixOfLineStringCompoundCurve(self): self.assertEqual(len(vl.dataProvider().subLayers()), 1) self.assertEqual(vl.dataProvider().subLayers()[0], '0:testMixOfLineStringCompoundCurve:5:CompoundCurve') + def testGpxElevation(self): + # GPX without elevation data + datasource = os.path.join(TEST_DATA_DIR, 'noelev.gpx') + vl = QgsVectorLayer(u'{}|layername=routes'.format(datasource), u'test', u'ogr') + self.assertTrue(vl.isValid()) + f = next(vl.getFeatures()) + self.assertEqual(f.constGeometry().geometry().wkbType(), QgsWKBTypes.LineString) + + # GPX with elevation data + datasource = os.path.join(TEST_DATA_DIR, 'elev.gpx') + vl = QgsVectorLayer(u'{}|layername=routes'.format(datasource), u'test', u'ogr') + self.assertTrue(vl.isValid()) + f = next(vl.getFeatures()) + self.assertEqual(f.constGeometry().geometry().wkbType(), QgsWKBTypes.LineString25D) + self.assertEqual(f.constGeometry().geometry().pointN(0).z(), 1) + self.assertEqual(f.constGeometry().geometry().pointN(1).z(), 2) + self.assertEqual(f.constGeometry().geometry().pointN(2).z(), 3) + if __name__ == '__main__': unittest.main() diff --git a/tests/testdata/elev.gpx b/tests/testdata/elev.gpx new file mode 100644 index 000000000000..961a591a5bc0 --- /dev/null +++ b/tests/testdata/elev.gpx @@ -0,0 +1,15 @@ + + + + + + 1 + + + 2 + + + 3 + + + diff --git a/tests/testdata/noelev.gpx b/tests/testdata/noelev.gpx new file mode 100644 index 000000000000..2c56fad9155a --- /dev/null +++ b/tests/testdata/noelev.gpx @@ -0,0 +1,12 @@ + + + + + + + + + + + +