/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2008 - 2011, Geomatys
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotoolkit.map;
import java.util.Collection;
import org.geotoolkit.storage.coverage.CoverageReference;
import org.geotoolkit.storage.coverage.DefaultCoverageReference;
import org.geotoolkit.coverage.grid.GridCoverage2D;
import org.geotoolkit.coverage.io.CoverageStoreException;
import org.geotoolkit.data.FeatureCollection;
import org.geotoolkit.factory.FactoryFinder;
import org.geotoolkit.factory.Hints;
import org.geotoolkit.util.NamesExt;
import org.apache.sis.referencing.CommonCRS;
import org.geotoolkit.style.MutableStyle;
import org.geotoolkit.style.MutableStyleFactory;
import org.geotoolkit.style.DefaultStyleFactory;
import org.geotoolkit.style.MutableFeatureTypeStyle;
import org.geotoolkit.style.MutableRule;
import org.geotoolkit.style.RandomStyleBuilder;
import org.geotoolkit.style.StyleConstants;
import org.opengis.filter.FilterFactory;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
/**
* Utility class to create MapLayers, MapContexts and Elevation models from different sources.
* This class is thread safe.
*
* @author Johann Sorel (Geomatys)
* @module
*/
public final class MapBuilder {
private MapBuilder(){}
/**
* Create a Default Mapcontext object using coordinate reference system : CRS:84.
* @return MapContext
*/
public static MapContext createContext(){
return createContext(CommonCRS.WGS84.normalizedGeographic());
}
/**
* Create a Default Mapcontext object with the given coordinate reference system.
* The crs is not used for rendering, it is only used when calling the getEnvelope
* method.
* @param crs : mapcontext CoordinateReferenceSystem
* @return MapContext
*/
public static MapContext createContext(final CoordinateReferenceSystem crs){
return new DefaultMapContext(crs);
}
/**
* Create a Default MapItem object. It can be used to group layers.
* @return MapItem
*/
public static MapItem createItem(){
return new DefaultMapItem();
}
/**
* Create an empty map layer without any datas. It can be useful in different
* kind of applications, like holding a space in the map context for a layer
* when a featurestore is unavailable.
* @return EmptyMapLayer
*/
public static EmptyMapLayer createEmptyMapLayer(){
final Hints hints = new Hints();
hints.put(Hints.STYLE_FACTORY, MutableStyleFactory.class);
final MutableStyleFactory factory = (MutableStyleFactory)FactoryFinder.getStyleFactory(hints);
return new EmptyMapLayer(factory.style());
}
//geometryType
/**
* Create a default collection map layer with a collection.
* The style expect the default geometry property to be named 'Geometry'
*
* @param collection layer data collection
* @param style layer style
* @return CollectionMapLayer
*/
public static CollectionMapLayer createCollectionLayer(final Collection<?> collection){
final MutableStyleFactory sf = new DefaultStyleFactory();
final FilterFactory ff = FactoryFinder.getFilterFactory(null);
final MutableStyle style = sf.style();
final MutableFeatureTypeStyle fts = sf.featureTypeStyle();
final MutableRule rulePoint = sf.rule(StyleConstants.DEFAULT_POINT_SYMBOLIZER);
rulePoint.setFilter(ff.or(
ff.equals(ff.function("geometryType", ff.property("geometry")), ff.literal("Point")),
ff.equals(ff.function("geometryType", ff.property("geometry")), ff.literal("MultiPoint"))
));
final MutableRule ruleLine = sf.rule(StyleConstants.DEFAULT_LINE_SYMBOLIZER);
ruleLine.setFilter(ff.or(
ff.equals(ff.function("geometryType", ff.property("geometry")), ff.literal("LineString")),
ff.equals(ff.function("geometryType", ff.property("geometry")), ff.literal("MultiLineString"))
));
final MutableRule rulePolygon = sf.rule(StyleConstants.DEFAULT_POLYGON_SYMBOLIZER);
rulePolygon.setFilter(ff.or(
ff.equals(ff.function("geometryType", ff.property("geometry")), ff.literal("Polygon")),
ff.equals(ff.function("geometryType", ff.property("geometry")), ff.literal("MultiPolygon"))
));
fts.rules().add(rulePoint);
fts.rules().add(ruleLine);
fts.rules().add(rulePolygon);
style.featureTypeStyles().add(fts);
return createCollectionLayer(collection, style);
}
/**
* Create a default collection map layer with a collection and a style.
* @param collection layer data collection
* @param style layer style
* @return CollectionMapLayer
*/
public static CollectionMapLayer createCollectionLayer(final Collection<?> collection, final MutableStyle style){
return new DefaultCollectionMapLayer(collection, style);
}
/**
* Create a default feature map layer with a feature collection and a style.
* @param collection layer data collection
* @return FeatureMapLayer
*/
public static FeatureMapLayer createFeatureLayer(final FeatureCollection collection){
return new DefaultFeatureMapLayer(collection, RandomStyleBuilder.createDefaultVectorStyle(collection.getFeatureType()));
}
/**
* Create a default feature map layer with a feature collection and a style.
* @param collection layer data collection
* @param style layer style
* @return FeatureMapLayer
*/
public static FeatureMapLayer createFeatureLayer(final FeatureCollection collection, final MutableStyle style){
return new DefaultFeatureMapLayer(collection, style);
}
/**
* Create a default coverage map layer with a gridCoverage, a style and the grid name.
* @param grid GridCoverage2D
* @param style layer style
* @return CoverageMapLayer
*/
public static CoverageMapLayer createCoverageLayer(final GridCoverage2D grid, final MutableStyle style, final String name){
final CoverageReference ref = new DefaultCoverageReference(grid, NamesExt.create(name));
return createCoverageLayer(ref, style);
}
/**
* Create a default coverage map layer with a image input.
* Default style is used.
*
* @param ref input
* @return CoverageMapLayer
*/
public static CoverageMapLayer createCoverageLayer(final Object input){
final CoverageReference reference = new DefaultCoverageReference(input, NamesExt.create("image"));
return createCoverageLayer(reference);
}
/**
* Create a default coverage map layer with a coveragrReference.
* Default style is used.
*
* @param ref CoverageReference
* @return CoverageMapLayer
*/
public static CoverageMapLayer createCoverageLayer(final CoverageReference ref){
return new DefaultCoverageMapLayer(ref, RandomStyleBuilder.createDefaultRasterStyle());
}
/**
* Create a default coverage map layer with a coveragrReference, a style and the grid name.
* @param ref CoverageReference
* @param style layer style
* @return CoverageMapLayer
*/
public static CoverageMapLayer createCoverageLayer(final CoverageReference ref, final MutableStyle style){
return new DefaultCoverageMapLayer(ref, style);
}
/**
* Create a default elevation model based on a grid coverage reader.
*
* @param grid : Coverage reader holding elevation values
* @return ElevationModel
*/
public static ElevationModel createElevationModel(final CoverageReference ref) throws CoverageStoreException {
return createElevationModel(ref, 130, 2, 55);
}
/**
* Create a default elevation model based on a grid coverage reader.
*
* @param grid : Coverage reader holding elevation values
* @param offset : expression used to modified on the fly the elevation value
* @param scale : a multiplication factor to use on the coverage values
* @return ElevationModel
*/
public static ElevationModel createElevationModel(final CoverageReference ref, final double azimuthAngle, final double altitudeAngle, final double altitudeScale) throws CoverageStoreException {
return new ElevationModel(ref, azimuthAngle, altitudeAngle, altitudeScale);
}
}