void writeLayers( List<Theme> themes, Set<TileMatrixSet> matrixSets ) throws XMLStreamException { for ( Theme t : themes ) { for ( Layer l : Themes.getAllLayers( t ) ) { if ( l instanceof TileLayer ) { exportLayer( matrixSets, (TileLayer) l ); } } } }
/** * @param t * @return all themes contained in this theme and subthemes */ public static List<Theme> getAllThemes( Theme t ) { List<Theme> list = new ArrayList<Theme>(); list.addAll( t.getThemes() ); for ( Theme c : t.getThemes() ) { list.addAll( getAllThemes( c ) ); } return list; }
themeMap.put( thm.getLayerMetadata().getName(), thm ); for ( org.deegree.layer.Layer l : Themes.getAllLayers( thm ) ) { newLayers.put( l.getMetadata().getName(), l ); for ( Theme theme : Themes.getAllThemes( thm ) ) { themeMap.put( theme.getLayerMetadata().getName(), theme );
@Override public Theme build() { List<String> storeIds = config.getLayerStoreId(); Map<String, LayerStore> stores = new LinkedHashMap<String, LayerStore>( storeIds.size() ); for ( String id : storeIds ) { LayerStore store = workspace.getResource( LayerStoreProvider.class, id ); if ( store == null ) { LOG.warn( "Layer store with id {} is not available.", id ); continue; } stores.put( id, store ); } ThemeType root = config.getTheme(); Theme theme; if ( root == null ) { theme = buildAutoTheme( stores ); } else { theme = buildTheme( root, root.getLayer(), root.getTheme(), stores ); } if ( theme == null ) { throw new ResourceInitException( "Root theme contains no layers and no themes." ); } aggregateSpatialMetadata( theme ); return theme; }
public static void aggregateSpatialMetadata( Theme theme ) { // TODO price question is, bottom up or top down inheritance? Possibly a combined approach is desirable (top // down inheritance for configured theme values, bottom up for envelopes from layers or so) SpatialMetadata curSmd = theme.getLayerMetadata().getSpatialMetadata(); Envelope env = curSmd.getEnvelope(); List<ICRS> crs = new ArrayList<ICRS>(); if ( curSmd.getCoordinateSystems() != null ) { crs.addAll( curSmd.getCoordinateSystems() ); } for ( Theme t : theme.getThemes() ) { env = aggregateFromTheme( t, env, crs ); } for ( Layer l : theme.getLayers() ) { env = aggregateFromLayer( l, env, crs ); } theme.getLayerMetadata().setSpatialMetadata( new SpatialMetadata( env, crs ) ); }
private static Envelope aggregateFromTheme( Theme t, Envelope env, List<ICRS> crs ) { aggregateSpatialMetadata( t ); SpatialMetadata smd = t.getLayerMetadata().getSpatialMetadata(); if ( smd.getEnvelope() != null ) { if ( env == null ) { env = smd.getEnvelope(); } else { env = env.merge( smd.getEnvelope() ); } } if ( smd.getCoordinateSystems() != null ) { addAllUncontained( crs, smd.getCoordinateSystems() ); } return env; }
private void getFeatureTypes( Collection<FeatureType> types, String name ) { for ( org.deegree.layer.Layer l : Themes.getAllLayers( themeMap.get( name ) ) ) { types.addAll( l.getMetadata().getFeatureTypes() ); } }
@Override public Theme build() { try { String id = cfg.getRemoteWMSId(); String lid = cfg.getLayerStoreId(); LayerStore store = workspace.getResource( LayerStoreProvider.class, lid ); if ( store == null ) { throw new ResourceInitException( "The layer store with id " + lid + " was not available." ); } RemoteOWS ows = workspace.getResource( RemoteOWSProvider.class, id ); if ( !( ows instanceof RemoteWMS ) ) { throw new ResourceInitException( "The remote OWS store with id " + id + " was not of type WMS or was not available." ); } WMSClient client = ( (RemoteWMS) ows ).getClient(); Tree<LayerMetadata> tree = client.getLayerTree(); Theme theme = buildTheme( tree, store ); aggregateSpatialMetadata( theme ); return theme; } catch ( Exception e ) { throw new ResourceInitException( "Could not parse remote WMS theme config.", e ); } }
TileHandler( List<Theme> themes ) { layers = new HashMap<String, TileLayer>(); for ( Theme theme : themes ) { for ( Layer l : Themes.getAllLayers( theme ) ) { if ( l instanceof TileLayer ) { layers.put( l.getMetadata().getName(), ( (TileLayer) l ) ); } } } }
/** * @param t * @return all layers contained in this theme and subthemes */ public static List<Layer> getAllLayers( Theme t ) { List<Layer> list = new ArrayList<Layer>(); if ( t == null ) { return list; } list.addAll( t.getLayers() ); for ( Theme c : t.getThemes() ) { list.addAll( getAllLayers( c ) ); } return list; }
FeatureInfoHandler( FeatureInfoFormatsType conf, ResourceLocation<?> location, Workspace workspace, List<Theme> themes ) throws ResourceInitException { featureInfoManager = FeatureInfoManagerBuilder.buildFeatureInfoManager( conf, location, workspace ); layers = new HashMap<String, TileLayer>(); for ( Theme theme : themes ) { for ( Layer l : Themes.getAllLayers( theme ) ) { if ( l instanceof TileLayer ) { layers.put( l.getMetadata().getName(), ( (TileLayer) l ) ); } } } }
private SpatialMetadata mergeSpatialMetadata( List<Theme> themes ) { if ( themes.isEmpty() ) return null; SpatialMetadata smd = new SpatialMetadata(); for ( Theme t : themes ) { for ( org.deegree.layer.Layer l : Themes.getAllLayers( t ) ) { smd.merge( l.getMetadata().getSpatialMetadata() ); } } return smd; }
final List<Layer> layers = Themes.getAllLayers( theme ); if ( layers != null ) { for ( final Layer layer : layers ) {
private void writeThemes( XMLStreamWriter writer, List<Theme> themes ) throws XMLStreamException { if ( themes.size() == 1 ) { themeWriter.writeTheme( writer, themes.get( 0 ) ); } else { // synthetic root layer needed writer.writeStartElement( "Layer" ); writeElement( writer, "Title", "Root" ); // TODO think about a push approach instead of a pull approach LayerMetadata lmd = null; for ( Theme t : themes ) { for ( org.deegree.layer.Layer l : Themes.getAllLayers( t ) ) { if ( lmd == null ) { lmd = l.getMetadata(); } else { lmd.merge( l.getMetadata() ); } } } if ( lmd != null ) { SpatialMetadata smd = lmd.getSpatialMetadata(); writeSrsAndEnvelope( writer, smd.getCoordinateSystems(), smd.getEnvelope() ); } for ( Theme t : themes ) { themeWriter.writeTheme( writer, t ); } writer.writeEndElement(); } }
private List<LayerData> checkStyleValidAndBuildLayerDataList( org.deegree.protocol.wms.ops.GetMap gm, List<String> headers, double scale, ListIterator<LayerQuery> queryIter ) throws OWSException { List<LayerData> layerDataList = new ArrayList<LayerData>(); for ( LayerRef lr : gm.getLayers() ) { LayerQuery query = queryIter.next(); List<Layer> layers = getAllLayers( themeMap.get( lr.getName() ) ); assertStyleApplicableForAtLeastOneLayer( layers, query.getStyle(), lr.getName() ); for ( org.deegree.layer.Layer layer : layers ) { if ( layer.getMetadata().getScaleDenominators().first > scale || layer.getMetadata().getScaleDenominators().second < scale ) { continue; } if ( layer.isStyleApplicable( query.getStyle() ) ) { layerDataList.add( layer.mapQuery( query, headers ) ); } } } return layerDataList; }
private String getFirstMetadataSetId( final Theme theme ) { if ( theme.getLayerMetadata().getMetadataId() != null ) { return theme.getLayerMetadata().getMetadataId(); } for ( final Layer layer : getAllLayers( theme ) ) { if ( layer.getMetadata().getMetadataId() != null ) { return layer.getMetadata().getMetadataId(); } } return null; }
for ( LayerRef n : gfi.getQueryLayers() ) { LayerQuery query = queryIter.next(); for ( org.deegree.layer.Layer l : Themes.getAllLayers( themeMap.get( n.getName() ) ) ) { if ( l.getMetadata().getScaleDenominators().first > scale || l.getMetadata().getScaleDenominators().second < scale ) {
private LayerQuery buildQuery( StyleRef style, LayerRef lr, MapOptionsMaps options, List<MapOptions> mapOptions, OperatorFilter f, org.deegree.protocol.wms.ops.GetMap gm ) { for ( org.deegree.layer.Layer l : Themes.getAllLayers( themeMap.get( lr.getName() ) ) ) { insertMissingOptions( l.getMetadata().getName(), options, l.getMetadata().getMapOptions(), defaultLayerOptions ); mapOptions.add( options.get( l.getMetadata().getName() ) ); } LayerQuery query = new LayerQuery( gm.getBoundingBox(), gm.getWidth(), gm.getHeight(), style, f, gm.getParameterMap(), gm.getDimensions(), gm.getPixelSize(), options, gm.getQueryBox() ); return query; }
/** * Returns the combined layer metadata for the given theme/sublayers. * * @see LayerMetadata#merge(LayerMetadata) * * @param theme * must not be <code>null</code> * @return combined layer metadata, never <code>null</code> */ LayerMetadata merge( final Theme theme ) { final LayerMetadata themeMetadata = theme.getLayerMetadata(); LayerMetadata layerMetadata = new LayerMetadata( null, null, null ); int queryable = 0; boolean opaque = false; int cascaded = 0; for ( final Layer l : Themes.getAllLayers( theme ) ) { queryable |= analyseQueryable( l.getMetadata() ); if ( checkIfOpaque( l.getMetadata() ) ) opaque = true; if ( checkIfLargerCascadedValue( cascaded, l.getMetadata() ) ) cascaded = l.getMetadata().getCascaded(); layerMetadata.merge( l.getMetadata() ); } themeMetadata.merge( layerMetadata ); adjustMapOptions( themeMetadata, queryable, opaque, cascaded ); return themeMetadata; }