package org.geotoolkit.pending.demo.rendering.reliefShadow;
import java.io.File;
import java.net.URL;
import javax.imageio.ImageReader;
import javax.measure.Unit;
import org.apache.sis.geometry.GeneralEnvelope;
import org.geotoolkit.storage.coverage.CoverageReference;
import org.geotoolkit.coverage.filestore.FileCoverageStore;
import org.geotoolkit.coverage.io.GridCoverageReader;
import org.geotoolkit.factory.FactoryFinder;
import org.geotoolkit.gui.swing.render2d.JMap2DFrame;
import org.geotoolkit.image.io.XImageIO;
import org.geotoolkit.map.CoverageMapLayer;
import org.geotoolkit.map.ElevationModel;
import org.geotoolkit.map.MapBuilder;
import org.geotoolkit.map.MapContext;
import org.geotoolkit.pending.demo.Demos;
import org.apache.sis.referencing.CommonCRS;
import org.apache.sis.measure.Units;
import org.geotoolkit.style.DefaultStyleFactory;
import org.geotoolkit.style.MutableStyle;
import org.geotoolkit.style.MutableStyleFactory;
import static org.geotoolkit.style.StyleConstants.DEFAULT_DESCRIPTION;
import static org.geotoolkit.style.StyleConstants.LITERAL_ONE_FLOAT;
import org.opengis.filter.FilterFactory;
import org.opengis.filter.expression.Expression;
import org.opengis.referencing.cs.AxisDirection;
import org.opengis.style.ChannelSelection;
import org.opengis.style.ColorMap;
import org.opengis.style.ContrastEnhancement;
import org.opengis.style.Description;
import org.opengis.style.OverlapBehavior;
import org.opengis.style.RasterSymbolizer;
import org.opengis.style.ShadedRelief;
import org.opengis.style.Symbolizer;
/**
* Show how to use {@link ElevationModel} to add shadow on image in renderer.
*
* @author Remi Marechal (Geomatys).
*/
public class ReliefShadowDemo {
public static final MutableStyleFactory SF = new DefaultStyleFactory();
protected static final FilterFactory FF = FactoryFinder.getFilterFactory(null);
/**
* Create {@link GridCoverageReader} which will be return by {@link ElevationModel} to read DEM.
*/
public static void main(String[] args) throws Exception {
Demos.init();
//Relief path of Digital Elevation Model (DEM).
URL reliefURL = ReliefShadowDemo.class.getResource("/data/coverage/cloudsRelief.tiff");
File reliefPath = new File(reliefURL.toURI());
ImageReader covPath = XImageIO.getReaderByFormatName("tiff-wf", reliefPath, Boolean.FALSE, false);
covPath.setInput(reliefPath);
FileCoverageStore store = new FileCoverageStore(reliefPath.toURL(), "AUTO");
final CoverageReference ref = store.getCoverageReference(store.getNames().iterator().next());
// final GridCoverageReader demGCR = CoverageIO.createSimpleReader(covPath);
/*
* Coverage which will be shadowed.
*/
// final File input = new File(ReliefShadowDemo.class.getResource("/data/coverage/clouds.jpg").toURI());
// final FileCoverageStore store = new FileCoverageStore(input.toURL(), "JPEG");
// final Name name = store.getNames().iterator().next();
// final CoverageReference ref = store.getCoverageReference(name);
// final GridCoverageReader reader = CoverageIO.createSimpleReader(input);
// final GridCoverage2D grid = (GridCoverage2D) reader.read(0, null);
File cloudFile = new File(ReliefShadowDemo.class.getResource("/data/coverage/clouds.jpg").toURI());
//create a mapcontext
final MapContext context = MapBuilder.createContext();
final CoverageMapLayer cl = MapBuilder.createCoverageLayer(cloudFile);
final double azimuth = 45;
final double altitude = 2;
final double scale = 0.4;
final ElevationModel elevModel = new ElevationModel(ref, azimuth, altitude, scale, AxisDirection.UP);
/*
* Define Elevation Model object to get informations necessary to compute shadow on coverage.
*/
cl.setElevationModel(elevModel);
MutableStyle style = customRaster();
cl.setStyle(style);
final GeneralEnvelope env = new GeneralEnvelope(CommonCRS.WGS84.normalizedGeographic());
env.setEnvelope(-180, -90, 180, 90);
context.setAreaOfInterest(env);
context.layers().add(cl);
JMap2DFrame.show(context);
}
/*
* Define style.
*/
public static MutableStyle customRaster() {
final String name = "mySymbol";
final Description desc = DEFAULT_DESCRIPTION;
final String geometry = null; //use the default geometry of the feature
final Unit unit = Units.POINT;
final Expression opacity = LITERAL_ONE_FLOAT;
final ChannelSelection channels = null;
final OverlapBehavior overlap = null;
final ColorMap colormap = null;
final ContrastEnhancement enhance = null;
/*
* Define if we want shadow.
* First argument define in percent the dimming of shadow pixel value.
* Second argument define if we want increase sunny pixel value.
*/
final ShadedRelief relief = SF.shadedRelief(FF.literal(10),true);
final Symbolizer outline = null;
final RasterSymbolizer symbol = SF.rasterSymbolizer(
name,(String)null,desc,unit,opacity,
channels,overlap,colormap,enhance,relief,outline);
final MutableStyle style = SF.style(symbol);
return style;
}
}