Skip to content

Commit f350774

Browse files
committed
QgsLineStringV2: better handling of LineString25D, more tests
1 parent f45f688 commit f350774

File tree

3 files changed

+404
-3
lines changed

3 files changed

+404
-3
lines changed

src/core/geometry/qgsabstractgeometryv2.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,14 @@ void QgsAbstractGeometryV2::setZMTypeFromSubGeometry( const QgsAbstractGeometryV
8181
return;
8282
}
8383

84+
//special handling for 25d types:
85+
if ( baseGeomType == QgsWKBTypes::LineString &&
86+
( subgeom->wkbType() == QgsWKBTypes::Point25D || subgeom->wkbType() == QgsWKBTypes::LineString25D ) )
87+
{
88+
mWkbType = QgsWKBTypes::LineString25D;
89+
return;
90+
}
91+
8492
bool hasZ = subgeom->is3D();
8593
bool hasM = subgeom->isMeasure();
8694

src/core/geometry/qgslinestringv2.cpp

+31-2
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,11 @@ QgsPointV2 QgsLineStringV2::pointN( int i ) const
214214
}
215215

216216
QgsWKBTypes::Type t = QgsWKBTypes::Point;
217-
if ( hasZ && hasM )
217+
if ( mWkbType == QgsWKBTypes::LineString25D )
218+
{
219+
t = QgsWKBTypes::Point25D;
220+
}
221+
else if ( hasZ && hasM )
218222
{
219223
t = QgsWKBTypes::PointZM;
220224
}
@@ -481,6 +485,12 @@ bool QgsLineStringV2::insertVertex( const QgsVertexId& position, const QgsPointV
481485
{
482486
return false;
483487
}
488+
489+
if ( mWkbType == QgsWKBTypes::Unknown || mX.isEmpty() )
490+
{
491+
setZMTypeFromSubGeometry( &vertex, QgsWKBTypes::LineString );
492+
}
493+
484494
mX.insert( position.vertex, vertex.x() );
485495
mY.insert( position.vertex, vertex.y() );
486496
if ( is3D() )
@@ -682,6 +692,12 @@ bool QgsLineStringV2::addZValue( double zValue )
682692
if ( QgsWKBTypes::hasZ( mWkbType ) )
683693
return false;
684694

695+
if ( mWkbType == QgsWKBTypes::Unknown )
696+
{
697+
mWkbType = QgsWKBTypes::LineStringZ;
698+
return true;
699+
}
700+
685701
mWkbType = QgsWKBTypes::addZ( mWkbType );
686702

687703
mZ.clear();
@@ -699,7 +715,20 @@ bool QgsLineStringV2::addMValue( double mValue )
699715
if ( QgsWKBTypes::hasM( mWkbType ) )
700716
return false;
701717

702-
mWkbType = QgsWKBTypes::addM( mWkbType );
718+
if ( mWkbType == QgsWKBTypes::Unknown )
719+
{
720+
mWkbType = QgsWKBTypes::LineStringM;
721+
return true;
722+
}
723+
724+
if ( mWkbType == QgsWKBTypes::LineString25D )
725+
{
726+
mWkbType = QgsWKBTypes::LineStringZM;
727+
}
728+
else
729+
{
730+
mWkbType = QgsWKBTypes::addM( mWkbType );
731+
}
703732

704733
mM.clear();
705734
int nPoints = numPoints();

0 commit comments

Comments
 (0)