package org.geotoolkit.pending.demo.tree; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.StandardOpenOption; import java.util.HashMap; import java.util.Map; import org.apache.sis.geometry.GeneralEnvelope; import org.geotoolkit.index.tree.ChannelTreeElementMapper; import org.opengis.geometry.Envelope; import org.opengis.referencing.crs.CoordinateReferenceSystem; /** * Create a FileTreeElementMapper adapted for Tree demo. * * @author Remi Marechal (Geomatys). */ final class DemoFileTreeElementMapper extends ChannelTreeElementMapper<Envelope>{ final private CoordinateReferenceSystem crs; final private int dimension; DemoFileTreeElementMapper(File output, final CoordinateReferenceSystem crs) throws IOException { super(Files.newByteChannel(output.toPath(), StandardOpenOption.CREATE, StandardOpenOption.READ, StandardOpenOption.WRITE), (crs.getCoordinateSystem().getDimension()*2*Double.SIZE) /8); this.crs = crs; this.dimension = crs.getCoordinateSystem().getDimension(); } @Override protected void writeObject(Envelope Object) throws IOException { /* * To store element on hard drive we use a Databuffer where all * databuffer working has been already manage. * User should just write element what he need to define a data, from databuffer from superclass as below. * * In this case, we travel all dimensions from envelope coordinate system and we write envelope coordinates. */ for (int d = 0; d < dimension; d++) { super.byteBuffer.putDouble(Object.getMinimum(d)); super.byteBuffer.putDouble(Object.getMaximum(d)); } /* * In our case Envelope is just define by its coordinates and its crs but * user may want store other information as he need. */ } @Override protected Envelope readObject() throws IOException { /* * Same operation as writing action in reversed order. */ GeneralEnvelope resultEnvelop = new GeneralEnvelope(crs); for (int d = 0; d < dimension; d++) { final double mind = super.byteBuffer.getDouble(); final double maxd = super.byteBuffer.getDouble(); resultEnvelop.setRange(d, mind, maxd); } return resultEnvelop; } @Override protected boolean areEquals(Envelope objectA, Envelope objectB) { /* * In some case equals method is not in accordance with equality pertinence asked by user. * User may redefine equal made. */ return objectA.equals(objectB); } @Override public Envelope getEnvelope(Envelope object) throws IOException { return object; } @Override public Map<Integer, Envelope> getFullMap() throws IOException { return new HashMap<>(); } }