Skip to content

Commit e7f5052

Browse files
committedJun 26, 2017
Make QgsLineString Z and M values NaN if unspecified
1 parent 8e7e573 commit e7f5052

File tree

4 files changed

+20
-17
lines changed

4 files changed

+20
-17
lines changed
 

‎src/core/geometry/qgscurve.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,12 @@ bool QgsCurve::isClosed() const
3131
//don't consider M-coordinates when testing closedness
3232
QgsPoint start = startPoint();
3333
QgsPoint end = endPoint();
34-
return ( qgsDoubleNear( start.x(), end.x(), 1E-8 ) &&
35-
qgsDoubleNear( start.y(), end.y(), 1E-8 ) &&
36-
qgsDoubleNear( start.z(), end.z(), 1E-8 ) );
34+
35+
bool closed = qgsDoubleNear( start.x(), end.x(), 1E-8 ) &&
36+
qgsDoubleNear( start.y(), end.y(), 1E-8 );
37+
if ( is3D() )
38+
closed &= qgsDoubleNear( start.z(), end.z(), 1E-8 ) || ( qIsNaN( start.z() ) && qIsNaN( end.z() ) );
39+
return closed;
3740
}
3841

3942
bool QgsCurve::isRing() const

‎src/core/geometry/qgslinestring.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -380,8 +380,8 @@ QgsPoint QgsLineString::pointN( int i ) const
380380

381381
double x = mX.at( i );
382382
double y = mY.at( i );
383-
double z = 0;
384-
double m = 0;
383+
double z = std::numeric_limits<double>::quiet_NaN();
384+
double m = std::numeric_limits<double>::quiet_NaN();
385385

386386
bool hasZ = is3D();
387387
if ( hasZ )
@@ -441,15 +441,15 @@ double QgsLineString::zAt( int index ) const
441441
if ( index >= 0 && index < mZ.size() )
442442
return mZ.at( index );
443443
else
444-
return 0.0;
444+
return std::numeric_limits<double>::quiet_NaN();
445445
}
446446

447447
double QgsLineString::mAt( int index ) const
448448
{
449449
if ( index >= 0 && index < mM.size() )
450450
return mM.at( index );
451451
else
452-
return 0.0;
452+
return std::numeric_limits<double>::quiet_NaN();
453453
}
454454

455455
void QgsLineString::setXAt( int index, double x )

‎tests/src/core/testqgsgeometry.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,8 +1317,8 @@ void TestQgsGeometry::lineString()
13171317
QCOMPARE( l9.zAt( 0 ), 3.0 );
13181318
QCOMPARE( l9.zAt( 1 ), 13.0 );
13191319
QCOMPARE( l9.zAt( 2 ), 23.0 );
1320-
QCOMPARE( l9.zAt( -1 ), 0.0 ); //out of range
1321-
QCOMPARE( l9.zAt( 11 ), 0.0 ); //out of range
1320+
QVERIFY( qIsNaN( l9.zAt( -1 ) ) ); //out of range
1321+
QVERIFY( qIsNaN( l9.zAt( 11 ) ) ); //out of range
13221322

13231323
l9.setZAt( 0, 53.0 );
13241324
QCOMPARE( l9.zAt( 0 ), 53.0 );
@@ -1330,8 +1330,8 @@ void TestQgsGeometry::lineString()
13301330
QCOMPARE( l9.mAt( 0 ), 4.0 );
13311331
QCOMPARE( l9.mAt( 1 ), 14.0 );
13321332
QCOMPARE( l9.mAt( 2 ), 24.0 );
1333-
QCOMPARE( l9.mAt( -1 ), 0.0 ); //out of range
1334-
QCOMPARE( l9.mAt( 11 ), 0.0 ); //out of range
1333+
QVERIFY( qIsNaN( l9.mAt( -1 ) ) ); //out of range
1334+
QVERIFY( qIsNaN( l9.mAt( 11 ) ) ); //out of range
13351335

13361336
l9.setMAt( 0, 54.0 );
13371337
QCOMPARE( l9.mAt( 0 ), 54.0 );
@@ -1346,8 +1346,8 @@ void TestQgsGeometry::lineString()
13461346
<< QgsPoint( QgsWkbTypes::PointM, 21, 22, 0, 24 ) );
13471347

13481348
//basically we just don't want these to crash
1349-
QCOMPARE( l9.zAt( 0 ), 0.0 );
1350-
QCOMPARE( l9.zAt( 1 ), 0.0 );
1349+
QVERIFY( qIsNaN( l9.zAt( 0 ) ) );
1350+
QVERIFY( qIsNaN( l9.zAt( 1 ) ) );
13511351
l9.setZAt( 0, 53.0 );
13521352
l9.setZAt( 1, 63.0 );
13531353

@@ -1357,8 +1357,8 @@ void TestQgsGeometry::lineString()
13571357
<< QgsPoint( 21, 22 ) );
13581358

13591359
//basically we just don't want these to crash
1360-
QCOMPARE( l9.mAt( 0 ), 0.0 );
1361-
QCOMPARE( l9.mAt( 1 ), 0.0 );
1360+
QVERIFY( qIsNaN( l9.mAt( 0 ) ) );
1361+
QVERIFY( qIsNaN( l9.mAt( 1 ) ) );
13621362
l9.setMAt( 0, 53.0 );
13631363
l9.setMAt( 1, 63.0 );
13641364

‎tests/src/core/testqgsgeometryutils.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -642,14 +642,14 @@ void TestQgsGeometryUtils::testClosestPoint()
642642

643643
QgsPoint pt1 = QgsGeometryUtils::closestPoint( linestringZ, QgsPoint( 1, 0 ) );
644644
QGSCOMPARENEAR( pt1.z(), 1, 0.0001 );
645-
// QVERIFY( qIsNaN( pt1.m() ) );
645+
QVERIFY( qIsNaN( pt1.m() ) );
646646

647647
QgsLineString linestringM( QVector<QgsPoint>()
648648
<< QgsPoint( 1, 1, std::numeric_limits<double>::quiet_NaN(), 1 )
649649
<< QgsPoint( 1, 3, std::numeric_limits<double>::quiet_NaN(), 2 ) );
650650

651651
QgsPoint pt2 = QgsGeometryUtils::closestPoint( linestringM, QgsPoint( 1, 4 ) );
652-
// QVERIFY( qIsNaN( pt2.z() ) );
652+
QVERIFY( qIsNaN( pt2.z() ) );
653653
QGSCOMPARENEAR( pt2.m(), 2, 0.0001 );
654654

655655
QgsLineString linestringZM( QVector<QgsPoint>()

0 commit comments

Comments
 (0)
Please sign in to comment.