// override // Creates an image. osg::Image* createImage(const TileKey& key, ProgressCallback* progress ) { if ( !_imageLayer.valid() || !_featureSource.valid() ) return 0L; // fetch the image for this key: GeoImage image = _imageLayer->createImage(key, progress); if ( !image.valid() ) return 0L; // fetch a set of features for this key. The features are in their // own SRS, so we need to transform: const SpatialReference* featureSRS = _featureSource->getFeatureProfile()->getSRS(); GeoExtent extentInFeatureSRS = key.getExtent().transform( featureSRS ); // assemble a spatial query. It helps if your features have a spatial index. Query query; query.bounds() = extentInFeatureSRS.bounds(); //query.expression() = ... // SQL expression compatible with data source osg::ref_ptr<FeatureCursor> cursor = _featureSource->createFeatureCursor(query); // create a new image to return. osg::Image* output = new osg::Image(); //output->allocateImage(128, 128, 1, GL_RGB, GL_UNSIGNED_BYTE); // do your magic here. return output; }
/** * Gets all the features that intersect the extent */ void getFeatures(const GeoExtent& extent, FeatureList& features) { GeoExtent localExtent = extent.transform( _featureSource->getFeatureProfile()->getSRS() ); Query query; query.bounds() = localExtent.bounds(); if (localExtent.intersects( _featureSource->getFeatureProfile()->getExtent())) { osg::ref_ptr< FeatureCursor > cursor = _featureSource->createFeatureCursor( query ); if (cursor) { cursor->fill( features ); } } }