package org.geotoolkit.pending.demo.datamodel.postgis;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Collections;
import org.geotoolkit.coverage.grid.GridCoverage2D;
import org.geotoolkit.coverage.grid.GridCoverageBuilder;
import org.geotoolkit.data.FeatureCollection;
import org.geotoolkit.data.FeatureStore;
import org.geotoolkit.data.query.QueryBuilder;
import org.geotoolkit.db.postgres.PostgresFeatureStore;
import org.apache.sis.feature.builder.FeatureTypeBuilder;
import org.geotoolkit.gui.swing.render2d.JMap2DFrame;
import org.geotoolkit.map.FeatureMapLayer;
import org.geotoolkit.map.MapBuilder;
import org.geotoolkit.map.MapContext;
import org.geotoolkit.style.RandomStyleBuilder;
import org.opengis.coverage.Coverage;
import org.opengis.feature.Feature;
import org.opengis.feature.FeatureType;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.datum.PixelInCell;
import org.apache.sis.referencing.CommonCRS;
/**
* Example of creating a postgresql feature store with a raster geometry.
*
* @author Johann Sorel (Geomatys)
*/
public class PostgisRasterDemo {
public static void main(String[] args) throws Exception {
final CoordinateReferenceSystem crs = CommonCRS.defaultGeographic();
//connect to postgres feature store
final FeatureStore store = new PostgresFeatureStore("localhost", 5432, "table", "public", "user", "password");
//create a feature type with a coverage attribute type
final FeatureTypeBuilder ftb = new FeatureTypeBuilder();
ftb.setName("SpotImages");
ftb.addAttribute(String.class).setName("name");
ftb.addAttribute(Coverage.class).setName("image").setCRS(crs);
FeatureType type = ftb.build();
store.createFeatureType(type);
//type migh be a little different after insertion
type = store.getFeatureType("SpotImages");
//WARNING : if you use a existing table you must ensure that the srid
//constraint is set in the raster_columns view or that the raster
//column comment contains the srid as a comment
//Create an image we will use as a coverage
final BufferedImage image = new BufferedImage(180, 360, BufferedImage.TYPE_INT_ARGB);
final Graphics2D g = image.createGraphics();
g.setColor(Color.BLUE);
g.fillRect(0, 0, 180, 360);
//Create a coverage
final GridCoverageBuilder gcb = new GridCoverageBuilder();
gcb.setName("world");
gcb.setRenderedImage(image);
gcb.setCoordinateReferenceSystem(crs);
gcb.setGridToCRS(-1, 0, 0, 1, +90, -180);
gcb.setPixelAnchor(PixelInCell.CELL_CORNER);
final GridCoverage2D coverage = gcb.getGridCoverage2D();
//Create a feature
final Feature feature = type.newInstance();
feature.setPropertyValue("name","world");
feature.setPropertyValue("image",coverage);
//Save the feature
store.addFeatures(type.getName().toString(), Collections.singletonList(feature));
//Display it
final FeatureCollection col = store.createSession(false).getFeatureCollection(QueryBuilder.all(store.getNames().iterator().next()));
final FeatureMapLayer layer = MapBuilder.createFeatureLayer(col, RandomStyleBuilder.createDefaultRasterStyle());
final MapContext context = MapBuilder.createContext();
context.layers().add(layer);
JMap2DFrame.show(context);
}
}