void testPointInPolygon() { QgsPointLocator loc( mVL ); QgsPointLocator::MatchList mValid = loc.pointInPolygon( QgsPoint( 0.8, 0.8 ) ); QCOMPARE( mValid.count(), 1 ); QgsPointLocator::Match m = mValid[0]; QVERIFY( m.isValid() ); QVERIFY( m.hasArea() ); QCOMPARE( m.layer(), mVL ); QCOMPARE( m.featureId(), ( QgsFeatureId )1 ); QgsPointLocator::MatchList mInvalid = loc.pointInPolygon( QgsPoint( 0, 0 ) ); QCOMPARE( mInvalid.count(), 0 ); }
void testEdgesInTolerance() { QgsPointLocator loc( mVL ); QgsPointLocator::MatchList lst = loc.edgesInRect( QgsPoint( 0, 0 ), 2 ); QCOMPARE( lst.count(), 3 ); QgsPointLocator::MatchList lst2 = loc.edgesInRect( QgsPoint( 0, 0 ), 0.9 ); QCOMPARE( lst2.count(), 1 ); // test match filtering FilterExcludeEdge myFilter( QgsPoint( 1, 0 ), QgsPoint( 0, 1 ) ); QgsPointLocator::MatchList lst3 = loc.edgesInRect( QgsPoint( 0, 0 ), 2, &myFilter ); QCOMPARE( lst3.count(), 2 ); }
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; } }
void testVerticesInRect() { QgsPointLocator loc( mVL ); QgsPointLocator::MatchList lst = loc.verticesInRect( QgsPointXY( 1, 0 ), 2 ); QCOMPARE( lst.count(), 4 ); QCOMPARE( lst[0].point(), QgsPointXY( 1, 0 ) ); QCOMPARE( lst[0].distance(), 0. ); QCOMPARE( lst[1].point(), QgsPointXY( 1, 1 ) ); QCOMPARE( lst[1].distance(), 1. ); QCOMPARE( lst[2].point(), QgsPointXY( 0, 1 ) ); QCOMPARE( lst[2].distance(), std::sqrt( 2 ) ); QgsPointLocator::MatchList lst2 = loc.verticesInRect( QgsPointXY( 1, 0 ), 1 ); QCOMPARE( lst2.count(), 2 ); // test match filtering FilterExcludePoint myFilter( QgsPointXY( 1, 0 ) ); QgsPointLocator::MatchList lst3 = loc.verticesInRect( QgsPointXY( 1, 0 ), 1, &myFilter ); QCOMPARE( lst3.count(), 1 ); QCOMPARE( lst3[0].point(), QgsPointXY( 1, 1 ) ); }