static QgsPointLocator::Match _findClosestSegmentIntersection( const QgsPoint& pt, const QgsPointLocator::MatchList& segments ) { if ( segments.isEmpty() ) return QgsPointLocator::Match(); QSet<QgsPoint> endpoints; // make a geometry QList<QgsGeometry*> geoms; Q_FOREACH ( const QgsPointLocator::Match& m, segments ) { if ( m.hasEdge() ) { QgsPolyline pl( 2 ); m.edgePoints( pl[0], pl[1] ); geoms << QgsGeometry::fromPolyline( pl ); endpoints << pl[0] << pl[1]; } } QgsGeometry* g = QgsGeometry::unaryUnion( geoms ); qDeleteAll( geoms ); // get intersection points QList<QgsPoint> newPoints; if ( g->wkbType() == QGis::WKBLineString ) { Q_FOREACH ( const QgsPoint& p, g->asPolyline() ) { if ( !endpoints.contains( p ) ) newPoints << p; } }
static QgsPointLocator::Match _findClosestSegmentIntersection( const QgsPointXY &pt, const QgsPointLocator::MatchList &segments ) { if ( segments.isEmpty() ) return QgsPointLocator::Match(); QSet<QgsPointXY> endpoints; // make a geometry QVector<QgsGeometry> geoms; Q_FOREACH ( const QgsPointLocator::Match &m, segments ) { if ( m.hasEdge() ) { QgsPolylineXY pl( 2 ); m.edgePoints( pl[0], pl[1] ); geoms << QgsGeometry::fromPolylineXY( pl ); endpoints << pl[0] << pl[1]; } } QgsGeometry g = QgsGeometry::unaryUnion( geoms ); // get intersection points QList<QgsPointXY> newPoints; if ( g.wkbType() == QgsWkbTypes::LineString ) { Q_FOREACH ( const QgsPointXY &p, g.asPolyline() ) { if ( !endpoints.contains( p ) ) newPoints << p; } }