bool LidarPoint::inPolygon(QgsGeometry * thePolygon) const { bool result; QgsGeometry * pointGeom = QgsGeometry::fromPoint( QgsPoint( mX, mY ) ); result = pointGeom->within( thePolygon ); delete pointGeom; return result; }
void QgsPointSample::addSamplePoints( QgsFeature& inputFeature, QgsVectorFileWriter& writer, int nPoints, double minDistance ) { if ( !inputFeature.constGeometry() ) return; const QgsGeometry* geom = inputFeature.constGeometry(); QgsRectangle geomRect = geom->boundingBox(); if ( geomRect.isEmpty() ) { return; } QgsSpatialIndex sIndex; //to check minimum distance QMap< QgsFeatureId, QgsPoint > pointMapForFeature; int nIterations = 0; int maxIterations = nPoints * 200; int points = 0; double randX = 0; double randY = 0; while ( nIterations < maxIterations && points < nPoints ) { randX = (( double )mt_rand() / MD_RAND_MAX ) * geomRect.width() + geomRect.xMinimum(); randY = (( double )mt_rand() / MD_RAND_MAX ) * geomRect.height() + geomRect.yMinimum(); QgsPoint randPoint( randX, randY ); QgsGeometry* ptGeom = QgsGeometry::fromPoint( randPoint ); if ( ptGeom->within( geom ) && checkMinDistance( randPoint, sIndex, minDistance, pointMapForFeature ) ) { //add feature to writer QgsFeature f( mNCreatedPoints ); f.setAttribute( "id", mNCreatedPoints + 1 ); f.setAttribute( "station_id", points + 1 ); f.setAttribute( "stratum_id", inputFeature.id() ); f.setGeometry( ptGeom ); writer.addFeature( f ); sIndex.insertFeature( f ); pointMapForFeature.insert( mNCreatedPoints, randPoint ); ++points; ++mNCreatedPoints; } else { delete ptGeom; } ++nIterations; } }
bool QgsSpatialFilter::evaluate( const QgsFeature& f ) const { if ( !mGeom ) { return true; } QgsGeometry* geom = ( new QgsFeature( f ) )->geometry(); switch ( mSpatialType ) { case BBOX: return geom->intersects( mGeom->boundingBox() ); break; case CONTAINS: return geom->contains( mGeom ); break; case CROSSES: return geom->crosses( mGeom ); break; case DISJOINT: return geom->disjoint( mGeom ); break; case EQUALS: return geom->equals( mGeom ); break; case INTERSECTS: return geom->intersects( mGeom ); break; case OVERLAPS: return geom->overlaps( mGeom ); break; case TOUCHES: return geom->touches( mGeom ); break; case WITHIN: return geom->within( mGeom ); break; case UNKNOWN: default: break; } return false; }