FilterContext ScriptFilter::push( FeatureList& input, FilterContext& context ) { if ( !isSupported() ) { OE_WARN << "ScriptFilter support not enabled" << std::endl; return context; } if (!_engine.valid()) { OE_WARN << "No scripting engine\n"; return context; } bool ok = true; for( FeatureList::iterator i = input.begin(); i != input.end(); ) { if ( push( i->get(), context ) ) { ++i; } else { i = input.erase(i); } } return context; }
FilterContext BufferFilter::push( FeatureList& input, FilterContext& context ) { if ( !isSupported() ) { OE_WARN << "BufferFilter support not enabled - please compile osgEarth with GEOS" << std::endl; return context; } //OE_NOTICE << "Buffer: input = " << input.size() << " features" << std::endl; for( FeatureList::iterator i = input.begin(); i != input.end(); ) { Feature* feature = i->get(); if ( !feature || !feature->getGeometry() ) continue; osg::ref_ptr<Symbology::Geometry> output; Symbology::BufferParameters params; params._capStyle = _capStyle == Stroke::LINECAP_ROUND ? Symbology::BufferParameters::CAP_ROUND : _capStyle == Stroke::LINECAP_SQUARE ? Symbology::BufferParameters::CAP_SQUARE : _capStyle == Stroke::LINECAP_FLAT ? Symbology::BufferParameters::CAP_FLAT : Symbology::BufferParameters::CAP_SQUARE; params._cornerSegs = _numQuadSegs; if ( feature->getGeometry()->buffer( _distance.value(), output, params ) ) { feature->setGeometry( output.get() ); ++i; } else { i = input.erase( i ); OE_DEBUG << LC << "feature " << feature->getFID() << " yielded no geometry" << std::endl; } } return context; }
bool FeatureGridder::cullFeatureListToCell( int i, FeatureList& features ) const { bool success = true; int inCount = features.size(); Bounds b; if ( getCellBounds( i, b ) ) { if ( _policy.cullingTechnique() == GriddingPolicy::CULL_BY_CENTROID ) { for( FeatureList::iterator f_i = features.begin(); f_i != features.end(); ) { bool keepFeature = false; Feature* feature = f_i->get(); Symbology::Geometry* featureGeom = feature->getGeometry(); if ( featureGeom ) { osg::Vec3d centroid = featureGeom->getBounds().center(); if ( b.contains( centroid.x(), centroid.y() ) ) { keepFeature = true; } } if ( keepFeature ) ++f_i; else f_i = features.erase( f_i ); } } else // CULL_BY_CROPPING (requires GEOS) { #ifdef OSGEARTH_HAVE_GEOS // create the intersection polygon: osg::ref_ptr<Symbology::Polygon> poly = new Symbology::Polygon( 4 ); poly->push_back( osg::Vec3d( b.xMin(), b.yMin(), 0 )); poly->push_back( osg::Vec3d( b.xMax(), b.yMin(), 0 )); poly->push_back( osg::Vec3d( b.xMax(), b.yMax(), 0 )); poly->push_back( osg::Vec3d( b.xMin(), b.yMax(), 0 )); for( FeatureList::iterator f_i = features.begin(); f_i != features.end(); ) { bool keepFeature = false; Feature* feature = f_i->get(); Symbology::Geometry* featureGeom = feature->getGeometry(); if ( featureGeom ) { osg::ref_ptr<Symbology::Geometry> croppedGeometry; if ( featureGeom->crop( poly.get(), croppedGeometry ) ) { feature->setGeometry( croppedGeometry.get() ); keepFeature = true; } } if ( keepFeature ) ++f_i; else f_i = features.erase( f_i ); } #endif // OSGEARTH_HAVE_GEOS } } OE_INFO << LC << "Grid cell " << i << ": bounds=" << b.xMin() << "," << b.yMin() << " => " << b.xMax() << "," << b.yMax() << "; in=" << inCount << "; out=" << features.size() << std::endl; return success; }
FilterContext CropFilter::push( FeatureList& input, FilterContext& context ) { if ( !context.extent().isSet() ) { OE_WARN << LC << "Extent is not set (and is required)" << std::endl; return context; } const GeoExtent& extent = *context.extent(); GeoExtent newExtent( extent.getSRS() ); if ( _method == METHOD_CENTROID ) { for( FeatureList::iterator i = input.begin(); i != input.end(); ) { bool keepFeature = false; Feature* feature = i->get(); Geometry* featureGeom = feature->getGeometry(); if ( featureGeom && featureGeom->isValid() ) { Bounds bounds = featureGeom->getBounds(); if ( bounds.isValid() ) { osg::Vec3d centroid = bounds.center(); if ( extent.contains( centroid.x(), centroid.y() ) ) { keepFeature = true; newExtent.expandToInclude( bounds.xMin(), bounds.yMin() ); } } } if ( keepFeature ) ++i; else i = input.erase( i ); } } else // METHOD_CROPPING (requires GEOS) { #ifdef OSGEARTH_HAVE_GEOS // create the intersection polygon: osg::ref_ptr<Symbology::Polygon> poly; for( FeatureList::iterator i = input.begin(); i != input.end(); ) { bool keepFeature = false; Feature* feature = i->get(); Symbology::Geometry* featureGeom = feature->getGeometry(); if ( featureGeom && featureGeom->isValid() ) { // test for trivial acceptance: const Bounds bounds = featureGeom->getBounds(); if ( !bounds.isValid() ) { //nop } else if ( extent.contains( bounds ) ) { keepFeature = true; newExtent.expandToInclude( bounds ); } // then move on to the cropping operation: else { if ( !poly.valid() ) { poly = new Symbology::Polygon(); poly->push_back( osg::Vec3d( extent.xMin(), extent.yMin(), 0 )); poly->push_back( osg::Vec3d( extent.xMax(), extent.yMin(), 0 )); poly->push_back( osg::Vec3d( extent.xMax(), extent.yMax(), 0 )); poly->push_back( osg::Vec3d( extent.xMin(), extent.yMax(), 0 )); } osg::ref_ptr<Geometry> croppedGeometry; if ( featureGeom->crop( poly.get(), croppedGeometry ) ) { if ( croppedGeometry->isValid() ) { feature->setGeometry( croppedGeometry.get() ); keepFeature = true; newExtent.expandToInclude( croppedGeometry->getBounds() ); } } } } if ( keepFeature ) ++i; else i = input.erase( i ); } #else // OSGEARTH_HAVE_GEOS OE_WARN << "CropFilter - METHOD_CROPPING not available - please compile osgEarth with GEOS" << std::endl; return context; #endif } FilterContext newContext = context; newContext.extent() = newExtent; return newContext; }