package org.geotoolkit.pending.demo.processing;
import org.geotoolkit.coverage.xmlstore.XMLCoverageStoreFactory;
import java.awt.Dimension;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Collections;
import javax.imageio.ImageIO;
import javax.imageio.spi.ImageReaderSpi;
import javax.imageio.spi.ImageWriterSpi;
import org.geotoolkit.coverage.filestore.*;
import org.geotoolkit.util.NamesExt;
import org.apache.sis.geometry.GeneralEnvelope;
import org.geotoolkit.gui.swing.ProgressWindow;
import org.geotoolkit.image.jai.Registry;
import org.geotoolkit.map.CoverageMapLayer;
import org.geotoolkit.map.MapBuilder;
import org.geotoolkit.map.MapContext;
import org.geotoolkit.pending.demo.Demos;
import org.geotoolkit.process.ProcessDescriptor;
import org.geotoolkit.process.ProcessFinder;
import org.apache.sis.storage.DataStoreException;
import org.geotoolkit.storage.DataStores;
import org.geotoolkit.storage.coverage.CoverageReference;
import org.geotoolkit.storage.coverage.CoverageStore;
import org.geotoolkit.style.DefaultStyleFactory;
import org.geotoolkit.style.MutableStyleFactory;
import org.opengis.util.GenericName;
import org.opengis.parameter.ParameterValueGroup;
import org.apache.sis.referencing.CommonCRS;
/**
* Create a pyramid from a MapContext.
*/
public class MapTilingDemo {
public static final MutableStyleFactory SF = new DefaultStyleFactory();
public static void main(String[] args) throws Throwable {
Demos.init();
//reset values, only allow pure java readers
for(String jn : ImageIO.getReaderFormatNames()){
if(jn.toLowerCase().contains("png")){
Registry.setNativeCodecAllowed(jn, ImageReaderSpi.class, false);
}
}
//reset values, only allow pure java writers
for(String jn : ImageIO.getWriterFormatNames()){
if(jn.toLowerCase().contains("png")){
Registry.setNativeCodecAllowed(jn, ImageWriterSpi.class, false);
}
}
//create a map context
final MapContext context = openData();
//get the description of the process we want
final ProcessDescriptor desc = ProcessFinder.getProcessDescriptor("engine2d", "mapcontextpyramid");
System.out.println(desc.getInputDescriptor());
//create a coverage store where the pyramid wil be stored
final XMLCoverageStoreFactory factory = new XMLCoverageStoreFactory();
final CoverageStore store = (CoverageStore) factory.create(Collections.singletonMap(
"path", new URL("file:/media/terra/GIS_DATA/wmts_bluemarble")));
final GenericName name = NamesExt.create("bluemarble");
final CoverageReference ref = store.create(name);
//set the input parameters
final ParameterValueGroup input = desc.getInputDescriptor().createValue();
// Envelope env = context.getBounds();
final GeneralEnvelope env = new GeneralEnvelope(CommonCRS.defaultGeographic());
env.setRange(0, -180, +180);
env.setRange(1, -90, 90);
final int nbscale = 20;
double[] scales = new double[nbscale];
scales[0] = env.getSpan(0) / 256 ;
for(int i=1;i<nbscale;i++){
scales[i] = scales[i-1] /2;
}
input.parameter("context").setValue(context);
input.parameter("extent").setValue(env);
input.parameter("tilesize").setValue(new Dimension(256, 256));
input.parameter("scales").setValue(scales);
input.parameter("container").setValue(ref);
final org.geotoolkit.process.Process p = desc.createProcess(input);
//use a small predefined dialog
final ProgressWindow pw = new ProgressWindow(null);
p.addListener(pw);
//get the result
final ParameterValueGroup result = p.call();
// //display the tiled image
// context.layers().clear();
// for(final Name n : store.getNames()){
// final CoverageReference covref = store.getCoverageReference(n);
// final MapLayer layer = MapBuilder.createCoverageLayer(
// covref,
// new DefaultStyleFactory().style(StyleConstants.DEFAULT_RASTER_SYMBOLIZER),
// n.getLocalPart());
//
// //display the generated pyramid
// final PyramidalModel model = (PyramidalModel) covref;
// System.out.println(model.getPyramidSet());
//
// layer.setDescription(SF.description(n.getLocalPart(), n.getLocalPart()));
// context.layers().add(layer);
// }
//
// JMap2DFrame.show(context);
}
private static MapContext openData() throws DataStoreException, URISyntaxException {
final ParameterValueGroup params = FileCoverageStoreFactory.PARAMETERS_DESCRIPTOR.createValue();
params.parameter(FileCoverageStoreFactory.PATH.getName().getCode()).setValue(new URI("file:/home/jsorel/temp/bluemarble/bluemarble"));
final CoverageStore store = (CoverageStore) DataStores.open(params);
final MapContext context = MapBuilder.createContext();
for(GenericName n : store.getNames()){
final CoverageMapLayer layer = MapBuilder.createCoverageLayer(store.getCoverageReference(n));
context.layers().add(layer);
}
return context;
}
}