Skip to content

Commit 4080aad

Browse files
committedJun 27, 2016
[ogr] Read GPX elevation values as geometry Z values
1 parent 2e168ef commit 4080aad

File tree

4 files changed

+46
-0
lines changed

4 files changed

+46
-0
lines changed
 

‎src/providers/ogr/qgsogrprovider.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3073,6 +3073,7 @@ void QgsOgrProvider::open( OpenMode mode )
30733073
QgsDebugMsg( "mLayerName: " + mLayerName );
30743074
QgsDebugMsg( "mSubsetString: " + mSubsetString );
30753075
CPLSetConfigOption( "OGR_ORGANIZE_POLYGONS", "ONLY_CCW" ); // "SKIP" returns MULTIPOLYGONs for multiringed POLYGONs
3076+
CPLSetConfigOption( "GPX_ELE_AS_25D", "YES" ); // use GPX elevation as z values
30763077

30773078
if ( mFilePath.startsWith( "MySQL:" ) && !mLayerName.isEmpty() && !mFilePath.endsWith( ",tables=" + mLayerName ) )
30783079
{

‎tests/src/python/test_provider_ogr.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,24 @@ def testMixOfLineStringCompoundCurve(self):
116116
self.assertEqual(len(vl.dataProvider().subLayers()), 1)
117117
self.assertEqual(vl.dataProvider().subLayers()[0], '0:testMixOfLineStringCompoundCurve:5:CompoundCurve')
118118

119+
def testGpxElevation(self):
120+
# GPX without elevation data
121+
datasource = os.path.join(TEST_DATA_DIR, 'noelev.gpx')
122+
vl = QgsVectorLayer(u'{}|layername=routes'.format(datasource), u'test', u'ogr')
123+
self.assertTrue(vl.isValid())
124+
f = next(vl.getFeatures())
125+
self.assertEqual(f.constGeometry().geometry().wkbType(), QgsWKBTypes.LineString)
126+
127+
# GPX with elevation data
128+
datasource = os.path.join(TEST_DATA_DIR, 'elev.gpx')
129+
vl = QgsVectorLayer(u'{}|layername=routes'.format(datasource), u'test', u'ogr')
130+
self.assertTrue(vl.isValid())
131+
f = next(vl.getFeatures())
132+
self.assertEqual(f.constGeometry().geometry().wkbType(), QgsWKBTypes.LineString25D)
133+
self.assertEqual(f.constGeometry().geometry().pointN(0).z(), 1)
134+
self.assertEqual(f.constGeometry().geometry().pointN(1).z(), 2)
135+
self.assertEqual(f.constGeometry().geometry().pointN(2).z(), 3)
136+
119137

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

‎tests/testdata/elev.gpx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0"?>
2+
<gpx version="1.1" creator="GDAL 1.11.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
3+
<metadata><bounds minlat="56.134840267383296" minlon="-3.877982991747363" maxlat="56.135514185147493" maxlon="-3.852565020533009"/></metadata>
4+
<rte>
5+
<rtept lat="56.134840267383296" lon="-3.877982991747363">
6+
<ele>1</ele>
7+
</rtept>
8+
<rtept lat="56.134933668432737" lon="-3.865962243986197">
9+
<ele>2</ele>
10+
</rtept>
11+
<rtept lat="56.135514185147493" lon="-3.852565020533009">
12+
<ele>3</ele>
13+
</rtept>
14+
</rte>
15+
</gpx>

‎tests/testdata/noelev.gpx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0"?>
2+
<gpx version="1.1" creator="GDAL 1.11.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
3+
<metadata><bounds minlat="56.134840267383240" minlon="-3.877982991747359" maxlat="56.135514185147436" maxlon="-3.852565020533005"/></metadata>
4+
<rte>
5+
<rtept lat="56.13484026738324" lon="-3.877982991747359">
6+
</rtept>
7+
<rtept lat="56.13493366843268" lon="-3.865962243986193">
8+
</rtept>
9+
<rtept lat="56.135514185147436" lon="-3.852565020533005">
10+
</rtept>
11+
</rte>
12+
</gpx>

0 commit comments

Comments
 (0)
Please sign in to comment.