/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.wps.sextante;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import org.geotools.data.DefaultTransaction;
import org.geotools.data.FeatureSource;
import org.geotools.data.FileDataStore;
import org.geotools.data.FileDataStoreFinder;
import org.geotools.data.Transaction;
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.shapefile.ShapefileDataStoreFactory;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.data.simple.SimpleFeatureStore;
import org.geotools.feature.FeatureCollection;
import org.geotools.feature.DefaultFeatureCollection;
import org.geotools.feature.simple.SimpleFeatureBuilder;
import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.feature.type.AttributeType;
import org.opengis.feature.type.FeatureType;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.MultiLineString;
import com.vividsolutions.jts.geom.MultiPoint;
import com.vividsolutions.jts.geom.MultiPolygon;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.Polygon;
import es.unex.sextante.core.Sextante;
import es.unex.sextante.dataObjects.AbstractVectorLayer;
import es.unex.sextante.dataObjects.IFeature;
import es.unex.sextante.dataObjects.IFeatureIterator;
import es.unex.sextante.dataObjects.IVectorLayer;
import es.unex.sextante.dataObjects.vectorFilters.IVectorLayerFilter;
import es.unex.sextante.outputs.FileOutputChannel;
import es.unex.sextante.outputs.IOutputChannel;
public class GTVectorLayer
extends
AbstractVectorLayer {
private FeatureSource m_FeatureSource;
private DefaultFeatureCollection m_FeatureCollection;
private String m_sName;
private String m_sFilename;
private int m_iShapeType;
private Class[] m_Types;
private String[] m_sFields;
private Object m_CRS;
private SimpleFeatureType m_SFT;
public void create(final FeatureSource fs) {
m_FeatureSource = fs;
try {
final FeatureType ft = fs.getSchema();
final Class<?> type = ft.getGeometryDescriptor().getType().getBinding();
if (type.isAssignableFrom(Polygon.class) || type.isAssignableFrom(MultiPolygon.class)) {
m_iShapeType = IVectorLayer.SHAPE_TYPE_POLYGON;
}
else if (type.isAssignableFrom(LineString.class) || type.isAssignableFrom(MultiLineString.class)) {
m_iShapeType = IVectorLayer.SHAPE_TYPE_LINE;
}
else {
m_iShapeType = IVectorLayer.SHAPE_TYPE_POINT;
}
}
catch (final Exception e) {
Sextante.addErrorToLog(e);
m_iShapeType = IVectorLayer.SHAPE_TYPE_POLYGON;
}
try {
final SimpleFeatureType ft = (SimpleFeatureType) fs.getSchema();
m_CRS = ft.getCoordinateReferenceSystem();
m_sFields = new String[ft.getAttributeCount() - 1];
m_Types = new Class[ft.getAttributeCount() - 1];
for (int j = 0; j < m_sFields.length; j++) {
final AttributeType at = ft.getType(j + 1);
m_sFields[j] = at.getName().getLocalPart();
m_Types[j] = at.getBinding();
}
}
catch (final Exception e) {
Sextante.addErrorToLog(e);
}
}
public void create(final String name,
final int shapeType,
final Class[] types,
final String[] fields,
final String filename,
final Object crs) {
try {
m_sName = name;
m_sFilename = filename;
m_iShapeType = shapeType;
m_Types = types;
m_sFields = fields;
m_CRS = crs;
m_FeatureCollection = new DefaultFeatureCollection();
final SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();
builder.setName("Location");
builder.setCRS((CoordinateReferenceSystem) m_CRS);
if (m_iShapeType == IVectorLayer.SHAPE_TYPE_POINT) {
builder.add("geom", MultiPoint.class);
}
else if (m_iShapeType == IVectorLayer.SHAPE_TYPE_LINE) {
builder.add("geom", MultiLineString.class);
}
else {
builder.add("geom", MultiPolygon.class);
}
for (int i = 0; i < m_sFields.length; i++) {
builder.add(m_sFields[i], m_Types[i]);
}
m_SFT = builder.buildFeatureType();
}
catch (final Exception e) {
//TODO:handle this
}
}
@Override
public void addFeature(final Geometry g,
final Object[] attributes) {
Geometry geom;
final GeometryFactory gf = new GeometryFactory();
if (g instanceof Point) {
geom = gf.createMultiPoint(new Point[] { (Point) g });
}
else if (g instanceof Polygon) {
geom = gf.createMultiPolygon(new Polygon[] { (Polygon) g });
}
else if (g instanceof LineString) {
geom = gf.createMultiLineString(new LineString[] { (LineString) g });
}
else {
geom = g;
}
final SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(m_SFT);
featureBuilder.add(geom);
featureBuilder.addAll(attributes);
final SimpleFeature feature = featureBuilder.buildFeature(null);
m_FeatureCollection.add(feature);
}
@Override
public void addFeature(final IFeature feature) {
addFeature(feature.getGeometry(), feature.getRecord().getValues());
}
@Override
public void addFilter(final IVectorLayerFilter filter) {
// TODO Auto-generated method stub
}
@Override
public boolean canBeEdited() {
return true;
}
@Override
public int getFieldCount() {
return m_sFields.length;
}
@Override
public String getFieldName(final int index) {
return m_sFields[index];
}
@Override
public Class getFieldType(final int index) {
return m_Types[index];
}
@Override
public int getShapeType() {
return m_iShapeType;
}
@Override
public IFeatureIterator iterator() {
if (m_FeatureSource != null) {
FeatureCollection fc;
try {
fc = m_FeatureSource.getFeatures();
}
catch (final IOException e) {
return null;
}
return new GTFeatureIterator(fc);
}
else {
return null;
}
}
@Override
public Object getCRS() {
return m_CRS;
}
@Override
public void close() {
// TODO Auto-generated method stub
}
@Override
public void free() {
// TODO Auto-generated method stub
}
@Override
public Object getBaseDataObject() {
if (m_FeatureCollection != null) {
return m_FeatureCollection;
}
else {
return m_FeatureSource;
}
}
@Override
public String getName() {
return m_sName;
}
@Override
public IOutputChannel getOutputChannel() {
return new FileOutputChannel(m_sFilename);
}
@Override
public void open() {
try {
if (m_FeatureCollection != null) {
postProcess();
}
if (m_sFilename != null) {
final FileDataStore store = FileDataStoreFinder.getDataStore(new File(m_sFilename));
final SimpleFeatureSource featureSource = store.getFeatureSource();
create(featureSource);
}
}
catch (final Exception e) {
e.printStackTrace();
}
}
@Override
public void postProcess() {}
@Override
public void setName(final String name) {
m_sName = name;
}
}