//! Generalize the WKB-geometry using the BBOX of the original geometry static QgsGeometry generalizeWkbGeometryByBoundingBox( QgsWkbTypes::Type wkbType, const QgsAbstractGeometry& geometry, const QgsRectangle &envelope ) { unsigned int geometryType = QgsWkbTypes::singleType( QgsWkbTypes::flatType( wkbType ) ); // If the geometry is already minimal skip the generalization int minimumSize = geometryType == QgsWkbTypes::LineString ? 2 : 5; if ( geometry.nCoordinates() <= minimumSize ) { return QgsGeometry( geometry.clone() ); } const double x1 = envelope.xMinimum(); const double y1 = envelope.yMinimum(); const double x2 = envelope.xMaximum(); const double y2 = envelope.yMaximum(); // Write the generalized geometry if ( geometryType == QgsWkbTypes::LineString ) { QgsLineString* lineString = new QgsLineString(); lineString->addVertex( QgsPointV2( x1, y1 ) ); lineString->addVertex( QgsPointV2( x2, y2 ) ); return QgsGeometry( lineString ); } else { return QgsGeometry::fromRect( envelope ); } }
// Need NO or >1 points. Duplicate first if only one. static bool lwline_make_geos_friendly( QgsLineString &line ) { if ( line.numPoints() == 1 ) // 0 is fine, 2 is fine { line.addVertex( line.startPoint() ); } return true; }
static bool ring_make_geos_friendly( QgsCurve *ring ) { if ( ring->nCoordinates() == 0 ) return false; // earlier we allowed in only geometries with straight segments QgsLineString *linestring = qgsgeometry_cast<QgsLineString *>( ring ); // close the ring if not already closed (2d only) QgsPoint p1 = linestring->startPoint(), p2 = linestring->endPoint(); if ( p1.x() != p2.x() || p1.y() != p2.y() ) linestring->addVertex( p1 ); // must have at least 4 coordinates to be accepted by GEOS while ( linestring->nCoordinates() < 4 ) linestring->addVertex( p1 ); return true; }
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(); }