void testPointInPolygon() { QgsPointLocator loc( mVL ); QgsPointLocator::MatchList mValid = loc.pointInPolygon( QgsPointXY( 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( QgsPointXY( 0, 0 ) ); QCOMPARE( mInvalid.count(), 0 ); }
void testLayerUpdates() { QgsPointLocator loc( mVL ); QgsPointLocator::Match mAddV0 = loc.nearestVertex( QgsPointXY( 12, 12 ), 999 ); QVERIFY( mAddV0.isValid() ); QCOMPARE( mAddV0.point(), QgsPointXY( 1, 1 ) ); mVL->startEditing(); // add a new feature QgsFeature ff( 0 ); QgsPolygon polygon; QgsPolyline polyline; polyline << QgsPointXY( 10, 11 ) << QgsPointXY( 11, 10 ) << QgsPointXY( 11, 11 ) << QgsPointXY( 10, 11 ); polygon << polyline; QgsGeometry ffGeom = QgsGeometry::fromPolygon( polygon ) ; ff.setGeometry( ffGeom ); QgsFeatureList flist; flist << ff; bool resA = mVL->addFeature( ff ); QVERIFY( resA ); // verify it is added in the point locator QgsPointLocator::Match mAddV = loc.nearestVertex( QgsPointXY( 12, 12 ), 999 ); QVERIFY( mAddV.isValid() ); QCOMPARE( mAddV.point(), QgsPointXY( 11, 11 ) ); QgsPointLocator::Match mAddE = loc.nearestEdge( QgsPointXY( 11.1, 10.5 ), 999 ); QVERIFY( mAddE.isValid() ); QCOMPARE( mAddE.point(), QgsPointXY( 11, 10.5 ) ); QgsPointLocator::MatchList mAddA = loc.pointInPolygon( QgsPointXY( 10.8, 10.8 ) ); QVERIFY( mAddA.count() == 1 ); // change geometry QgsGeometry *newGeom = new QgsGeometry( ff.geometry() ); newGeom->moveVertex( 10, 10, 2 ); // change 11,11 to 10,10 mVL->changeGeometry( ff.id(), *newGeom ); delete newGeom; // verify it is changed in the point locator QgsPointLocator::Match mChV = loc.nearestVertex( QgsPointXY( 12, 12 ), 999 ); QVERIFY( mChV.isValid() ); QVERIFY( mChV.point() != QgsPointXY( 11, 11 ) ); // that point does not exist anymore mChV = loc.nearestVertex( QgsPointXY( 9, 9 ), 999 ); QVERIFY( mChV.isValid() ); QVERIFY( mChV.point() == QgsPointXY( 10, 10 ) ); // updated point // delete feature bool resD = mVL->deleteFeature( ff.id() ); QVERIFY( resD ); // verify it is deleted from the point locator QgsPointLocator::Match mDelV = loc.nearestVertex( QgsPointXY( 12, 12 ), 999 ); QVERIFY( mDelV.isValid() ); QCOMPARE( mDelV.point(), QgsPointXY( 1, 1 ) ); mVL->rollBack(); }
void testEdgesInTolerance() { QgsPointLocator loc( mVL ); QgsPointLocator::MatchList lst = loc.edgesInRect( QgsPointXY( 0, 0 ), 2 ); QCOMPARE( lst.count(), 3 ); QgsPointLocator::MatchList lst2 = loc.edgesInRect( QgsPointXY( 0, 0 ), 0.9 ); QCOMPARE( lst2.count(), 1 ); // test match filtering FilterExcludeEdge myFilter( QgsPointXY( 1, 0 ), QgsPointXY( 0, 1 ) ); QgsPointLocator::MatchList lst3 = loc.edgesInRect( QgsPointXY( 0, 0 ), 2, &myFilter ); QCOMPARE( lst3.count(), 2 ); }
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 ) ); }