All Downloads are FREE. Search and download functionalities are using the official Maven repository.

au.gov.amsa.gt.ShapefileCreator Maven / Gradle / Ivy

The newest version!
package au.gov.amsa.gt;

import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.geotools.data.DataUtilities;
import org.geotools.data.DefaultTransaction;
import org.geotools.data.Transaction;
import org.geotools.data.collection.ListFeatureCollection;
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.shapefile.ShapefileDataStoreFactory;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.data.simple.SimpleFeatureStore;
import org.geotools.feature.SchemaException;
import org.geotools.feature.simple.SimpleFeatureBuilder;
import org.geotools.geometry.jts.JTSFactoryFinder;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;

import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.GeometryFactory;

final class ShapefileCreator {

    public static void createPolygon(List coords, File output) {
        List features = new ArrayList<>();

        final SimpleFeatureType type = createFeatureType();
        // final SimpleFeatureType type = BasicFeatureTypes.POLYGON;
        GeometryFactory gf = JTSFactoryFinder.getGeometryFactory();
        SimpleFeatureBuilder f = new SimpleFeatureBuilder(type);

        f.add(gf.createPolygon(coords.toArray(new Coordinate[] {})));
        SimpleFeature feature = f.buildFeature(null);
        features.add(feature);
        saveFeaturesToShapefile(features, type, output);
    }

    private static SimpleFeatureType createFeatureType() {
        try {
            final SimpleFeatureType type = DataUtilities.createType("Region",
                    "the_geom:Polygon:srid=4326");
            return type;
        } catch (SchemaException e) {
            throw new RuntimeException(e);
        }
    }

    private static void saveFeaturesToShapefile(List features,
            final SimpleFeatureType type, File output) {
        try {
            ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();

            Map params = new HashMap();
            params.put("url", output.toURI().toURL());
            params.put("create spatial index", Boolean.TRUE);

            ShapefileDataStore newDataStore = (ShapefileDataStore) dataStoreFactory
                    .createNewDataStore(params);

            // type is used as a template to describe the file contents
            newDataStore.createSchema(type);

            // Write the features to the shapefile
            Transaction transaction = new DefaultTransaction("create");

            String typeName = newDataStore.getTypeNames()[0];
            SimpleFeatureSource featureSource = newDataStore.getFeatureSource(typeName);
            // SimpleFeatureType shapeType = featureSource.getSchema();
            /*
             * The Shapefile format has a couple limitations: - "the_geom" is
             * always first, and used for the geometry attribute name -
             * "the_geom" must be of type Point, MultiPoint, MuiltiLineString,
             * MultiPolygon - Attribute names are limited in length - Not all
             * data types are supported (example Timestamp represented as Date)
             * 
             * Each data store has different limitations so check the resulting
             * SimpleFeatureType.
             */
            // System.out.println("SHAPE:" + shapeType);

            if (featureSource instanceof SimpleFeatureStore) {
                SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource;
                /*
                 * SimpleFeatureStore has a method to add features from a
                 * SimpleFeatureCollection object, so we use the
                 * ListFeatureCollection class to wrap our list of features.
                 */
                SimpleFeatureCollection collection = new ListFeatureCollection(type, features);
                featureStore.setTransaction(transaction);
                try {
                    featureStore.addFeatures(collection);
                    transaction.commit();
                } catch (IOException | RuntimeException e) {
                    e.printStackTrace();
                    transaction.rollback();
                } finally {
                    transaction.close();
                }
            } else {
                throw new RuntimeException(typeName + " does not support read/write access");
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy