package org.geoserver.wps.sextante; import java.io.IOException; import org.geotools.data.DataStore; import org.geotools.feature.AttributeTypeBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.feature.type.AttributeDescriptor; import org.opengis.feature.type.AttributeType; import org.opengis.feature.type.GeometryDescriptor; import org.opengis.feature.type.GeometryType; import org.opengis.referencing.crs.CoordinateReferenceSystem; import com.vividsolutions.jts.geom.MultiLineString; import com.vividsolutions.jts.geom.MultiPolygon; import com.vividsolutions.jts.geom.Point; import es.unex.sextante.dataObjects.IVectorLayer; public abstract class DatastoreVectorLayerFactory implements GTVectorLayerFactory { public DatastoreVectorLayerFactory() { super(); } public IVectorLayer create(String sName, int iShapeType, Class<?>[] fields, String[] sFields, String filename, Object crs) { try { if (!(crs instanceof CoordinateReferenceSystem)) { crs = DefaultGeographicCRS.WGS84; } SimpleFeatureType featureType = buildFeatureType(sName, iShapeType, fields, sFields, (CoordinateReferenceSystem) crs); DataStore mds = createDatastore(filename, featureType); mds.createSchema(featureType); return createLayer(mds, sName, crs); } catch (Exception e) { throw new RuntimeException(e); } } protected IVectorLayer createLayer(DataStore dataStore, String sName, Object crs) throws IOException { GTVectorLayer layer = GTVectorLayer.createLayer(dataStore, sName, (CoordinateReferenceSystem) crs); layer.setName(sName); return layer; } protected abstract DataStore createDatastore(String m_sFilename, SimpleFeatureType m_FeatureType) throws IOException; private static GeometryDescriptor toGeometryAttribute(int shapeType, CoordinateReferenceSystem crs, AttributeTypeBuilder builder) { Class<?> s[] = { Point.class, MultiLineString.class, MultiPolygon.class }; GeometryType buildGeometryType = builder.crs(crs).binding(s[shapeType]).buildGeometryType(); return builder.buildDescriptor("geom", buildGeometryType); } public static SimpleFeatureType buildFeatureType(String sName, int iShapeType, Class<?>[] fields, String[] sFields, CoordinateReferenceSystem crs) { SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder(); builder.setName(sName); AttributeTypeBuilder attBuilder = new AttributeTypeBuilder(); builder.add(toGeometryAttribute(iShapeType, crs,attBuilder)); builder.setDefaultGeometry("geom"); for (int i = 0; i < sFields.length; i++) { AttributeType type = attBuilder.binding(fields[i]).buildType(); AttributeDescriptor descriptor = attBuilder.buildDescriptor(sFields[i], type); builder.add(descriptor); } return builder.buildFeatureType(); } }