void TestQgsDistanceArea::collections() { //test measuring for collections QgsDistanceArea myDa; myDa.setSourceAuthId( "EPSG:4030" ); myDa.setEllipsoidalMode( true ); myDa.setEllipsoid( "WGS84" ); //collection of lines, should be sum of line length QgsGeometry lines( QgsGeometryFactory::geomFromWkt( "GeometryCollection( LineString(0 36.53, 5.76 -48.16), LineString(0 25.54, 24.20 36.70) )" ) ); double result = myDa.measureLength( &lines ); QGSCOMPARENEAR( result, 12006159, 1 ); result = myDa.measureArea( &lines ); QVERIFY( qgsDoubleNear( result, 0 ) ); //collection of polygons QgsGeometry polys( QgsGeometryFactory::geomFromWkt( "GeometryCollection( Polygon((0 36.53, 5.76 -48.16, 0 25.54, 0 36.53)), Polygon((10 20, 15 20, 15 10, 10 20)) )" ) ); result = myDa.measureArea( &polys ); QGSCOMPARENEAR( result, 670434859475LL, 1 ); result = myDa.measureLength( &polys ); QVERIFY( qgsDoubleNear( result, 0 ) ); //mixed collection QgsGeometry mixed( QgsGeometryFactory::geomFromWkt( "GeometryCollection( LineString(0 36.53, 5.76 -48.16), LineString(0 25.54, 24.20 36.70), Polygon((0 36.53, 5.76 -48.16, 0 25.54, 0 36.53)), Polygon((10 20, 15 20, 15 10, 10 20)) )" ) ); //measure area specifically result = myDa.measureArea( &mixed ); QGSCOMPARENEAR( result, 670434859475LL, 1 ); //measure length result = myDa.measureLength( &mixed ); QGSCOMPARENEAR( result, 12006159, 1 ); }
void TestQgsMapToPixel::fromScale() { QgsMapToPixel m2p = QgsMapToPixel::fromScale( 0.001, QgsUnitTypes::DistanceMeters, 96.0 ); QGSCOMPARENEAR( m2p.mapUnitsPerPixel(), 0.264583, 0.000001 ); m2p = QgsMapToPixel::fromScale( 0.0001, QgsUnitTypes::DistanceMeters, 96.0 ); QGSCOMPARENEAR( m2p.mapUnitsPerPixel(), 2.645833, 0.000001 ); m2p = QgsMapToPixel::fromScale( 0.001, QgsUnitTypes::DistanceMeters, 72.0 ); QGSCOMPARENEAR( m2p.mapUnitsPerPixel(), 0.352778, 0.000001 ); m2p = QgsMapToPixel::fromScale( 0.001, QgsUnitTypes::DistanceKilometers, 96.0 ); QGSCOMPARENEAR( m2p.mapUnitsPerPixel(), 0.000265, 0.000001 ); }
void TestQgsGeometryUtils::testAngleThreePoints() { QgsPoint p1( 0, 0 ); QgsPoint p2( 1, 0 ); QgsPoint p3( 1, 1 ); QGSCOMPARENEAR( QgsGeometryUtils::angleBetweenThreePoints( p1.x(), p1.y(), p2.x(), p2.y(), p3.x(), p3.y() ), M_PI / 2.0, 0.00000001 ); p3 = QgsPoint( 1, -1 ); QGSCOMPARENEAR( QgsGeometryUtils::angleBetweenThreePoints( p1.x(), p1.y(), p2.x(), p2.y(), p3.x(), p3.y() ), 3 * M_PI / 2.0, 0.00000001 ); p3 = QgsPoint( 2, 0 ); QGSCOMPARENEAR( QgsGeometryUtils::angleBetweenThreePoints( p1.x(), p1.y(), p2.x(), p2.y(), p3.x(), p3.y() ), M_PI, 0.00000001 ); p3 = QgsPoint( 0, 0 ); QGSCOMPARENEAR( QgsGeometryUtils::angleBetweenThreePoints( p1.x(), p1.y(), p2.x(), p2.y(), p3.x(), p3.y() ), 0.0, 0.00000001 ); p3 = QgsPoint( 1, 0 ); //undefined, but want no crash ( void )QgsGeometryUtils::angleBetweenThreePoints( p1.x(), p1.y(), p2.x(), p2.y(), p3.x(), p3.y() ); p2 = QgsPoint( 0, 0 ); ( void )QgsGeometryUtils::angleBetweenThreePoints( p1.x(), p1.y(), p2.x(), p2.y(), p3.x(), p3.y() ); }
void TestQgsHistogram::optimalBinWidth() { QList<double> vals; vals << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10; QgsHistogram h; h.setValues( vals ); QGSCOMPARENEAR( h.optimalBinWidth(), 4.641, 0.001 ); }
void TestQgsDistanceArea::regression13601() { //test regression #13601 QgsDistanceArea calc; calc.setEllipsoidalMode( true ); calc.setEllipsoid( "NONE" ); calc.setSourceCrs( 1108L ); QgsGeometry geom( QgsGeometryFactory::geomFromWkt( "Polygon ((252000 1389000, 265000 1389000, 265000 1385000, 252000 1385000, 252000 1389000))" ) ); QGSCOMPARENEAR( calc.measureArea( &geom ), 52000000, 0.0001 ); }
void TestQgsDistanceArea::regression14675() { //test regression #14675 QgsDistanceArea calc; calc.setEllipsoidalMode( true ); calc.setEllipsoid( "GRS80" ); calc.setSourceCrs( 145L ); QgsGeometry geom( QgsGeometryFactory::geomFromWkt( "Polygon ((917593.5791854317067191 6833700.00807378999888897, 917596.43389983859378844 6833700.67099479306489229, 917599.53056440979707986 6833700.78673478215932846, 917593.5791854317067191 6833700.00807378999888897))" ) ); //lots of tolerance here - the formulas get quite unstable with small areas due to division by very small floats QGSCOMPARENEAR( calc.measureArea( &geom ), 0.83301, 0.02 ); }
void TestQgsDistanceArea::measureUnits() { //test regression #13610 QgsDistanceArea calc; calc.setEllipsoidalMode( false ); calc.setEllipsoid( "NONE" ); calc.setSourceCrs( 254L ); QgsUnitTypes::DistanceUnit units; QgsPoint p1( 1341683.9854275715, 408256.9562717728 ); QgsPoint p2( 1349321.7807031618, 408256.9562717728 ); double result = calc.measureLine( p1, p2, units ); //no OTF, result will be in CRS unit (feet) QCOMPARE( units, QgsUnitTypes::DistanceFeet ); QGSCOMPARENEAR( result, 7637.7952755903825, 0.001 ); calc.setEllipsoidalMode( true ); calc.setEllipsoid( "WGS84" ); result = calc.measureLine( p1, p2, units ); //OTF, result will be in meters QCOMPARE( units, QgsUnitTypes::DistanceMeters ); QGSCOMPARENEAR( result, 2328.0988253106957, 0.001 ); }
//QgsGeometryUtils::sqrDistToLine void TestQgsGeometryUtils::testSqrDistToLine() { // See http://hub.qgis.org/issues/13952#note-26 QgsPoint qp( 771938, 6.95593e+06 ); QgsPoint p1( 771946, 6.95593e+06 ); QgsPoint p2( 771904, 6.95595e+06 ); double rx = 0, ry = 0; double epsilon = 1e-18; double sqrDist = QgsGeometryUtils::sqrDistToLine( qp.x(), qp.y(), p1.x(), p1.y(), p2.x(), p2.y(), rx, ry, epsilon ); QGSCOMPARENEAR( sqrDist, 11.83, 0.01 ); }
void TestQgsStatisticSummary::individualStatCalculations() { //tests calculation of statistics one at a time, to make sure statistic calculations are not //dependent on each other QList<double> values; values << 4 << 4 << 2 << 3 << 3 << 3 << 5 << 5 << 8 << 8; QFETCH( int, statInt ); QgsStatisticalSummary::Statistic stat = ( QgsStatisticalSummary::Statistic ) statInt; QFETCH( double, expected ); //start with a summary which calculates NO statistics QgsStatisticalSummary s( QgsStatisticalSummary::Statistics( 0 ) ); //set it to calculate just a single statistic s.setStatistics( stat ); QCOMPARE( s.statistics(), stat ); s.calculate( values ); QGSCOMPARENEAR( s.statistic( stat ), expected, 0.00001 ); //also test using values added one-at-a-time QgsStatisticalSummary s2( QgsStatisticalSummary::Statistics( 0 ) ); s2.setStatistics( stat ); s2.addValue( 4 ); s2.addValue( 4 ); s2.addValue( 2 ); s2.addValue( 3 ); s2.addValue( 3 ); s2.addValue( 3 ) ; s2.addValue( 5 ) ; s2.addValue( 5 ) ; s2.addValue( 8 ); s2.addValue( 8 ); s2.finalize(); QCOMPARE( s2.statistics(), stat ); //make sure stat has a valid display name QVERIFY( !QgsStatisticalSummary::displayName( stat ).isEmpty() ); }
void TestQgsDistanceArea::measureAreaAndUnits() { QgsDistanceArea da; da.setSourceCrs( 3452 ); da.setEllipsoidalMode( false ); da.setEllipsoid( "NONE" ); QgsCoordinateReferenceSystem daCRS; daCRS.createFromSrsId( da.sourceCrsId() ); QgsPolyline ring; ring << QgsPoint( 0, 0 ) << QgsPoint( 1, 0 ) << QgsPoint( 1, 1 ) << QgsPoint( 2, 1 ) << QgsPoint( 2, 2 ) << QgsPoint( 0, 2 ) << QgsPoint( 0, 0 ); QgsPolygon poly; poly << ring; QgsGeometry polygon( QgsGeometry::fromPolygon( poly ) ); // We check both the measured area AND the units, in case the logic regarding // ellipsoids and units changes in future double area = da.measureArea( &polygon ); QgsUnitTypes::AreaUnit units = da.areaUnits(); QgsDebugMsg( QString( "measured %1 in %2" ).arg( area ).arg( QgsUnitTypes::toString( units ) ) ); QVERIFY(( qgsDoubleNear( area, 3.0, 0.00000001 ) && units == QgsUnitTypes::AreaSquareDegrees ) || ( qgsDoubleNear( area, 37176087091.5, 0.1 ) && units == QgsUnitTypes::AreaSquareMeters ) ); da.setEllipsoid( "WGS84" ); area = da.measureArea( &polygon ); units = da.areaUnits(); QgsDebugMsg( QString( "measured %1 in %2" ).arg( area ).arg( QgsUnitTypes::toString( units ) ) ); QVERIFY(( qgsDoubleNear( area, 3.0, 0.00000001 ) && units == QgsUnitTypes::AreaSquareDegrees ) || ( qgsDoubleNear( area, 37176087091.5, 0.1 ) && units == QgsUnitTypes::AreaSquareMeters ) ); da.setEllipsoidalMode( true ); area = da.measureArea( &polygon ); units = da.areaUnits(); QgsDebugMsg( QString( "measured %1 in %2" ).arg( area ).arg( QgsUnitTypes::toString( units ) ) ); // should always be in Meters Squared QGSCOMPARENEAR( area, 37416879192.9, 0.1 ); QCOMPARE( units, QgsUnitTypes::AreaSquareMeters ); // test converting the resultant area area = da.convertAreaMeasurement( area, QgsUnitTypes::AreaSquareMiles ); QGSCOMPARENEAR( area, 14446.7378, 0.001 ); // now try with a source CRS which is in feet ring.clear(); ring << QgsPoint( 1850000, 4423000 ) << QgsPoint( 1851000, 4423000 ) << QgsPoint( 1851000, 4424000 ) << QgsPoint( 1852000, 4424000 ) << QgsPoint( 1852000, 4425000 ) << QgsPoint( 1851000, 4425000 ) << QgsPoint( 1850000, 4423000 ); poly.clear(); poly << ring; polygon = QgsGeometry::fromPolygon( poly ); da.setSourceCrs( 27469 ); da.setEllipsoidalMode( false ); // measurement should be in square feet area = da.measureArea( &polygon ); units = da.areaUnits(); QgsDebugMsg( QString( "measured %1 in %2" ).arg( area ).arg( QgsUnitTypes::toString( units ) ) ); QGSCOMPARENEAR( area, 2000000, 0.001 ); QCOMPARE( units, QgsUnitTypes::AreaSquareFeet ); // test converting the resultant area area = da.convertAreaMeasurement( area, QgsUnitTypes::AreaSquareYards ); QGSCOMPARENEAR( area, 222222.2222, 0.001 ); da.setEllipsoidalMode( true ); // now should be in Square Meters again area = da.measureArea( &polygon ); units = da.areaUnits(); QgsDebugMsg( QString( "measured %1 in %2" ).arg( area ).arg( QgsUnitTypes::toString( units ) ) ); QGSCOMPARENEAR( area, 184149.37, 1.0 ); QCOMPARE( units, QgsUnitTypes::AreaSquareMeters ); // test converting the resultant area area = da.convertAreaMeasurement( area, QgsUnitTypes::AreaSquareYards ); QgsDebugMsg( QString( "measured %1 in sq yrds" ).arg( area ) ); QGSCOMPARENEAR( area, 220240.8172549, 0.00001 ); }
void TestQgsStatisticSummary::stats() { //note - we test everything twice, once using the statistics calculated by passing //a list of values and once using the statistics calculated by passing values //one-at-a-time QgsStatisticalSummary s( QgsStatisticalSummary::All ); QgsStatisticalSummary s2( QgsStatisticalSummary::All ); QList<double> values; values << 4 << 2 << 3 << 2 << 5 << 8; s.calculate( values ); s2.addValue( 4 ); s2.addValue( 2 ); s2.addValue( 3 ); s2.addValue( 2 ); s2.addValue( 5 ); s2.addValue( 8 ); s2.finalize(); QCOMPARE( s.count(), 6 ); QCOMPARE( s2.count(), 6 ); QCOMPARE( s.sum(), 24.0 ); QCOMPARE( s2.sum(), 24.0 ); QCOMPARE( s.mean(), 4.0 ); QCOMPARE( s2.mean(), 4.0 ); QGSCOMPARENEAR( s.stDev(), 2.0816, 0.0001 ); QGSCOMPARENEAR( s2.stDev(), 2.0816, 0.0001 ); QGSCOMPARENEAR( s.sampleStDev(), 2.2803, 0.0001 ); QGSCOMPARENEAR( s2.sampleStDev(), 2.2803, 0.0001 ); QCOMPARE( s.min(), 2.0 ); QCOMPARE( s2.min(), 2.0 ); QCOMPARE( s.max(), 8.0 ); QCOMPARE( s2.max(), 8.0 ); QCOMPARE( s.range(), 6.0 ); QCOMPARE( s2.range(), 6.0 ); QCOMPARE( s.median(), 3.5 ); QCOMPARE( s2.median(), 3.5 ); values << 9; s.calculate( values ); s2.addValue( 9 ); s2.finalize(); QCOMPARE( s.median(), 4.0 ); QCOMPARE( s2.median(), 4.0 ); values << 4 << 5 << 8 << 12 << 12 << 12; s.calculate( values ); s2.addValue( 4 ); s2.addValue( 5 ) ; s2.addValue( 8 ); s2.addValue( 12 ); s2.addValue( 12 ); s2.addValue( 12 ); s2.finalize(); QCOMPARE( s.variety(), 7 ); QCOMPARE( s2.variety(), 7 ); QCOMPARE( s.minority(), 3.0 ); QCOMPARE( s2.minority(), 3.0 ); QCOMPARE( s.majority(), 12.0 ); QCOMPARE( s2.majority(), 12.0 ); //test quartiles. lots of possibilities here, involving odd/even/divisible by 4 counts values.clear(); values << 7 << 15 << 36 << 39 << 40 << 41; s.calculate( values ); s2.reset(); s2.addValue( 7 ); s2.addValue( 15 ); s2.addValue( 36 ); s2.addValue( 39 ); s2.addValue( 40 ); s2.addValue( 41 ); s2.finalize(); QCOMPARE( s.median(), 37.5 ); QCOMPARE( s2.median(), 37.5 ); QCOMPARE( s.firstQuartile(), 15.0 ); QCOMPARE( s2.firstQuartile(), 15.0 ); QCOMPARE( s.thirdQuartile(), 40.0 ); QCOMPARE( s2.thirdQuartile(), 40.0 ); QCOMPARE( s.interQuartileRange(), 25.0 ); QCOMPARE( s2.interQuartileRange(), 25.0 ); values.clear(); values << 7 << 15 << 36 << 39 << 40 << 41 << 43 << 49; s.calculate( values ); s2.reset(); s2.addValue( 7 ); s2.addValue( 15 ); s2.addValue( 36 ); s2.addValue( 39 ); s2.addValue( 40 ); s2.addValue( 41 ) ; s2.addValue( 43 ); s2.addValue( 49 ); s2.finalize(); QCOMPARE( s.median(), 39.5 ); QCOMPARE( s2.median(), 39.5 ); QCOMPARE( s.firstQuartile(), 25.5 ); QCOMPARE( s2.firstQuartile(), 25.5 ); QCOMPARE( s.thirdQuartile(), 42.0 ); QCOMPARE( s2.thirdQuartile(), 42.0 ); QCOMPARE( s.interQuartileRange(), 16.5 ); QCOMPARE( s2.interQuartileRange(), 16.5 ); values.clear(); values << 6 << 7 << 15 << 36 << 39 << 40 << 41 << 42 << 43 << 47 << 49; s.calculate( values ); s2.reset(); s2.addValue( 6 ); s2.addValue( 7 ); s2.addValue( 15 ); s2.addValue( 36 ); s2.addValue( 39 ); s2.addValue( 40 ); s2.addValue( 41 ); s2.addValue( 42 ); s2.addValue( 43 ); s2.addValue( 47 ); s2.addValue( 49 ); s2.finalize(); QCOMPARE( s.median(), 40.0 ); QCOMPARE( s2.median(), 40.0 ); QCOMPARE( s.firstQuartile(), 25.5 ); QCOMPARE( s2.firstQuartile(), 25.5 ); QCOMPARE( s.thirdQuartile(), 42.5 ); QCOMPARE( s2.thirdQuartile(), 42.5 ); QCOMPARE( s.interQuartileRange(), 17.0 ); QCOMPARE( s2.interQuartileRange(), 17.0 ); values.clear(); values << 6 << 7 << 15 << 36 << 39 << 40 << 41 << 42 << 43 << 47 << 49 << 50 << 58; s.calculate( values ); s2.addValue( 50 ); s2.addValue( 58 ); s2.finalize(); QCOMPARE( s.median(), 41.0 ); QCOMPARE( s2.median(), 41.0 ); QCOMPARE( s.firstQuartile(), 36.0 ); QCOMPARE( s2.firstQuartile(), 36.0 ); QCOMPARE( s.thirdQuartile(), 47.0 ); QCOMPARE( s2.thirdQuartile(), 47.0 ); QCOMPARE( s.interQuartileRange(), 11.0 ); QCOMPARE( s2.interQuartileRange(), 11.0 ); }