void QgsCurvePolygon::setExteriorRing( QgsCurve *ring ) { if ( !ring ) { return; } mExteriorRing.reset( ring ); //set proper wkb type if ( QgsWkbTypes::flatType( wkbType() ) == QgsWkbTypes::Polygon ) { setZMTypeFromSubGeometry( ring, QgsWkbTypes::Polygon ); } else if ( QgsWkbTypes::flatType( wkbType() ) == QgsWkbTypes::CurvePolygon ) { setZMTypeFromSubGeometry( ring, QgsWkbTypes::CurvePolygon ); } //match dimensionality for rings for ( QgsCurve *ring : qgis::as_const( mInteriorRings ) ) { if ( is3D() ) ring->addZValue(); else ring->dropZValue(); if ( isMeasure() ) ring->addMValue(); else ring->dropMValue(); } clearCache(); }
bool QgsLineStringV2::insertVertex( const QgsVertexId& position, const QgsPointV2& vertex ) { if ( position.vertex < 0 || position.vertex > mX.size() ) { return false; } if ( mWkbType == QgsWKBTypes::Unknown || mX.isEmpty() ) { setZMTypeFromSubGeometry( &vertex, QgsWKBTypes::LineString ); } mX.insert( position.vertex, vertex.x() ); mY.insert( position.vertex, vertex.y() ); if ( is3D() ) { mZ.insert( position.vertex, vertex.z() ); } if ( isMeasure() ) { mM.insert( position.vertex, vertex.m() ); } mBoundingBox = QgsRectangle(); //set bounding box invalid return true; }
void QgsCompoundCurve::addCurve( QgsCurve *c ) { if ( c ) { if ( mCurves.empty() ) { setZMTypeFromSubGeometry( c, QgsWkbTypes::CompoundCurve ); } mCurves.append( c ); if ( QgsWkbTypes::hasZ( mWkbType ) && !QgsWkbTypes::hasZ( c->wkbType() ) ) { c->addZValue(); } else if ( !QgsWkbTypes::hasZ( mWkbType ) && QgsWkbTypes::hasZ( c->wkbType() ) ) { c->dropZValue(); } if ( QgsWkbTypes::hasM( mWkbType ) && !QgsWkbTypes::hasM( c->wkbType() ) ) { c->addMValue(); } else if ( !QgsWkbTypes::hasM( mWkbType ) && QgsWkbTypes::hasM( c->wkbType() ) ) { c->dropMValue(); } clearCache(); } }
void QgsPolygonV2::setExteriorRing( QgsCurve *ring ) { if ( !ring ) { return; } if ( ring->hasCurvedSegments() ) { //need to segmentize ring as polygon does not support curves QgsCurve *line = ring->segmentize(); delete ring; ring = line; } QgsLineString *lineString = qgsgeometry_cast< QgsLineString *>( ring ); if ( lineString && !lineString->isClosed() ) { lineString->close(); } mExteriorRing.reset( ring ); //set proper wkb type setZMTypeFromSubGeometry( ring, QgsWkbTypes::Polygon ); //match dimensionality for rings for ( QgsCurve *ring : qgis::as_const( mInteriorRings ) ) { ring->convertTo( mExteriorRing->wkbType() ); } clearCache(); }
void QgsTriangle::setExteriorRing( QgsCurve *ring ) { if ( !ring ) { return; } if ( ring->hasCurvedSegments() ) { //need to segmentize ring as polygon does not support curves QgsCurve *line = ring->segmentize(); delete ring; ring = line; } if ( ( ring->numPoints() > 4 ) || ( ring->numPoints() < 3 ) ) { delete ring; return; } else if ( ring->numPoints() == 4 ) { if ( !ring->isClosed() ) { delete ring; return; } } else if ( ring->numPoints() == 3 ) { if ( ring->isClosed() ) { delete ring; return; } QgsLineString *lineString = static_cast< QgsLineString *>( ring ); if ( !lineString->isClosed() ) { lineString->close(); } ring = lineString; } if ( !validateGeom( ring->vertexAt( QgsVertexId( 0, 0, 0 ) ), ring->vertexAt( QgsVertexId( 0, 0, 1 ) ), ring->vertexAt( QgsVertexId( 0, 0, 2 ) ) ) ) { delete ring; return; } mExteriorRing.reset( ring ); //set proper wkb type setZMTypeFromSubGeometry( ring, QgsWkbTypes::Triangle ); clearCache(); }
void QgsCircularString::setPoints( const QgsPointSequence &points ) { clearCache(); if ( points.empty() ) { mWkbType = QgsWkbTypes::CircularString; mX.clear(); mY.clear(); mZ.clear(); mM.clear(); return; } //get wkb type from first point const QgsPoint &firstPt = points.at( 0 ); bool hasZ = firstPt.is3D(); bool hasM = firstPt.isMeasure(); setZMTypeFromSubGeometry( &firstPt, QgsWkbTypes::CircularString ); mX.resize( points.size() ); mY.resize( points.size() ); if ( hasZ ) { mZ.resize( points.size() ); } else { mZ.clear(); } if ( hasM ) { mM.resize( points.size() ); } else { mM.clear(); } for ( int i = 0; i < points.size(); ++i ) { mX[i] = points[i].x(); mY[i] = points[i].y(); if ( hasZ ) { double z = points.at( i ).z(); mZ[i] = std::isnan( z ) ? 0 : z; } if ( hasM ) { double m = points.at( i ).m(); mM[i] = std::isnan( m ) ? 0 : m; } } }
bool QgsMultiPointV2::addGeometry( QgsAbstractGeometry *g ) { if ( !dynamic_cast<QgsPointV2 *>( g ) ) { delete g; return false; } setZMTypeFromSubGeometry( g, QgsWkbTypes::MultiPoint ); return QgsGeometryCollection::addGeometry( g ); }
bool QgsMultiCurveV2::addGeometry( QgsAbstractGeometryV2* g ) { if ( !dynamic_cast<QgsCurveV2*>( g ) ) { delete g; return false; } setZMTypeFromSubGeometry( g, QgsWKBTypes::MultiCurve ); return QgsGeometryCollectionV2::addGeometry( g ); }
void QgsCircularString::setPoints( const QgsPointSequence &points ) { clearCache(); if ( points.size() < 1 ) { mWkbType = QgsWkbTypes::Unknown; mX.clear(); mY.clear(); mZ.clear(); mM.clear(); return; } //get wkb type from first point const QgsPointV2 &firstPt = points.at( 0 ); bool hasZ = firstPt.is3D(); bool hasM = firstPt.isMeasure(); setZMTypeFromSubGeometry( &firstPt, QgsWkbTypes::CircularString ); mX.resize( points.size() ); mY.resize( points.size() ); if ( hasZ ) { mZ.resize( points.size() ); } else { mZ.clear(); } if ( hasM ) { mM.resize( points.size() ); } else { mM.clear(); } for ( int i = 0; i < points.size(); ++i ) { mX[i] = points[i].x(); mY[i] = points[i].y(); if ( hasZ ) { mZ[i] = points[i].z(); } if ( hasM ) { mM[i] = points[i].m(); } } }
void QgsLineStringV2::setPoints( const QList<QgsPointV2>& points ) { if ( points.size() < 1 ) { mWkbType = QgsWKBTypes::Unknown; mCoords.clear(); mZ.clear(); mM.clear(); return; } //get wkb type from first point const QgsPointV2& firstPt = points.at( 0 ); bool hasZ = firstPt.is3D(); bool hasM = firstPt.isMeasure(); setZMTypeFromSubGeometry( &firstPt, QgsWKBTypes::LineString ); mCoords.resize( points.size() ); if ( hasZ ) { mZ.resize( points.size() ); } else { mZ.clear(); } if ( hasM ) { mM.resize( points.size() ); } else { mM.clear(); } for ( int i = 0; i < points.size(); ++i ) { mCoords[i].rx() = points[i].x(); mCoords[i].ry() = points[i].y(); if ( hasZ ) { mZ[i] = points[i].z(); } if ( hasM ) { mM[i] = points[i].m(); } } }
void QgsLineStringV2::setPoints( const QList<QgsPointV2>& points ) { mBoundingBox = QgsRectangle(); //set bounding box invalid if ( points.isEmpty() ) { clear(); return; } //get wkb type from first point const QgsPointV2& firstPt = points.at( 0 ); bool hasZ = firstPt.is3D(); bool hasM = firstPt.isMeasure(); setZMTypeFromSubGeometry( &firstPt, QgsWKBTypes::LineString ); mX.resize( points.size() ); mY.resize( points.size() ); if ( hasZ ) { mZ.resize( points.size() ); } else { mZ.clear(); } if ( hasM ) { mM.resize( points.size() ); } else { mM.clear(); } for ( int i = 0; i < points.size(); ++i ) { mX[i] = points.at( i ).x(); mY[i] = points.at( i ).y(); if ( hasZ ) { mZ[i] = points.at( i ).z(); } if ( hasM ) { mM[i] = points.at( i ).m(); } } }
void QgsLineStringV2::append( const QgsLineStringV2* line ) { if ( !line ) { return; } if ( numPoints() < 1 ) { setZMTypeFromSubGeometry( line, QgsWKBTypes::LineString ); } mCoords += line->mCoords; mZ += line->mZ; mM += line->mM; }
void QgsLineStringV2::addVertex( const QgsPointV2& pt ) { if ( mWkbType == QgsWKBTypes::Unknown ) { setZMTypeFromSubGeometry( &pt, QgsWKBTypes::LineString ); } mCoords.append( QPointF( pt.x(), pt.y() ) ); if ( is3D() ) { mZ.append( pt.z() ); } if ( isMeasure() ) { mM.append( pt.m() ); } }
void QgsLineStringV2::addVertex( const QgsPointV2& pt ) { if ( mWkbType == QgsWKBTypes::Unknown ) { setZMTypeFromSubGeometry( &pt, QgsWKBTypes::LineString ); } mCoords.append( QPointF( pt.x(), pt.y() ) ); if ( is3D() ) { mZ.append( pt.z() ); } if ( isMeasure() ) { mM.append( pt.m() ); } mBoundingBox = QgsRectangle(); //set bounding box invalid so it needs to be recalculated next time }
void QgsLineStringV2::addVertex( const QgsPointV2& pt ) { if ( mWkbType == QgsWKBTypes::Unknown || mX.isEmpty() ) { setZMTypeFromSubGeometry( &pt, QgsWKBTypes::LineString ); } mX.append( pt.x() ); mY.append( pt.y() ); if ( is3D() ) { mZ.append( pt.z() ); } if ( isMeasure() ) { mM.append( pt.m() ); } mBoundingBox = QgsRectangle(); //set bounding box invalid }
bool QgsMultiLineString::addGeometry( QgsAbstractGeometry *g ) { if ( !dynamic_cast<QgsLineString *>( g ) ) { delete g; return false; } if ( mGeometries.empty() ) { setZMTypeFromSubGeometry( g, QgsWkbTypes::MultiLineString ); } if ( is3D() && !g->is3D() ) g->addZValue(); else if ( !is3D() && g->is3D() ) g->dropZValue(); if ( isMeasure() && !g->isMeasure() ) g->addMValue(); else if ( !isMeasure() && g->isMeasure() ) g->dropMValue(); return QgsGeometryCollection::addGeometry( g ); // clazy:exclude=skipped-base-method }
bool QgsMultiSurface::addGeometry( QgsAbstractGeometry *g ) { if ( !qgsgeometry_cast<QgsSurface *>( g ) ) { delete g; return false; } if ( mGeometries.empty() ) { setZMTypeFromSubGeometry( g, QgsWkbTypes::MultiSurface ); } if ( is3D() && !g->is3D() ) g->addZValue(); else if ( !is3D() && g->is3D() ) g->dropZValue(); if ( isMeasure() && !g->isMeasure() ) g->addMValue(); else if ( !isMeasure() && g->isMeasure() ) g->dropMValue(); return QgsGeometryCollection::addGeometry( g ); }
void QgsLineStringV2::append( const QgsLineStringV2* line ) { if ( !line ) { return; } if ( numPoints() < 1 ) { setZMTypeFromSubGeometry( line, QgsWKBTypes::LineString ); } mX += line->mX; mY += line->mY; if ( line->is3D() ) { mZ += line->mZ; } else { // if append line does not have z coordinates, fill with 0 to match number of points in final line mZ.insert( mZ.count(), mX.size() - mZ.size(), 0 ); } if ( line->is3D() ) { mM += line->mM; } else { // if append line does not have m values, fill with 0 to match number of points in final line mM.insert( mM.count(), mX.size() - mM.size(), 0 ); } mBoundingBox = QgsRectangle(); //set bounding box invalid }
void QgsLineString::append( const QgsLineString *line ) { if ( !line ) { return; } if ( numPoints() < 1 ) { setZMTypeFromSubGeometry( line, QgsWkbTypes::LineString ); } // do not store duplicit points if ( numPoints() > 0 && line->numPoints() > 0 && endPoint() == line->startPoint() ) { mX.pop_back(); mY.pop_back(); if ( is3D() ) { mZ.pop_back(); } if ( isMeasure() ) { mM.pop_back(); } } mX += line->mX; mY += line->mY; if ( is3D() ) { if ( line->is3D() ) { mZ += line->mZ; } else { // if append line does not have z coordinates, fill with NaN to match number of points in final line mZ.insert( mZ.count(), mX.size() - mZ.size(), std::numeric_limits<double>::quiet_NaN() ); } } if ( isMeasure() ) { if ( line->isMeasure() ) { mM += line->mM; } else { // if append line does not have m values, fill with NaN to match number of points in final line mM.insert( mM.count(), mX.size() - mM.size(), std::numeric_limits<double>::quiet_NaN() ); } } clearCache(); //set bounding box invalid }
void QgsCompoundCurve::addVertex( const QgsPoint &pt ) { if ( mCurves.isEmpty() || mWkbType == QgsWkbTypes::Unknown ) { setZMTypeFromSubGeometry( &pt, QgsWkbTypes::CompoundCurve ); } //is last curve QgsLineString QgsCurve *lastCurve = nullptr; if ( !mCurves.isEmpty() ) { lastCurve = mCurves.at( mCurves.size() - 1 ); } QgsLineString *line = nullptr; if ( !lastCurve || QgsWkbTypes::flatType( lastCurve->wkbType() ) != QgsWkbTypes::LineString ) { line = new QgsLineString(); mCurves.append( line ); if ( lastCurve ) { line->addVertex( lastCurve->endPoint() ); } lastCurve = line; } else //create new QgsLineString* with point in it { line = static_cast<QgsLineString *>( lastCurve ); } line->addVertex( pt ); clearCache(); }