Search in sources :

Example 1 with GeoPackage

use of mil.nga.geopackage.GeoPackage in project hale by halestudio.

the class GeopackageApiTest method testLoadFile.

/**
 * Test using the Geopackage API to load a file.
 */
@Test
public void testLoadFile() {
    withTestFile("testdata/util_wastewater_discharge.gpkg", file -> {
        GeoPackage gp = GeoPackageManager.open(file);
        List<String> tables = gp.getFeatureTables();
        assertEquals(1, tables.size());
        String tableName = tables.get(0);
        FeatureDao features = gp.getFeatureDao(tableName);
        // FeatureTable table = features.getTable();
        assertEquals(3193, features.count());
    });
}
Also used : FeatureDao(mil.nga.geopackage.features.user.FeatureDao) GeoPackage(mil.nga.geopackage.GeoPackage) Test(org.junit.Test)

Example 2 with GeoPackage

use of mil.nga.geopackage.GeoPackage in project hale by halestudio.

the class GeopackageInstanceWriter method createTableIfNecessary.

private GeopackageTableType createTableIfNecessary(GeoPackage geoPackage, String tableName, TypeDefinition type, Instance instance, SimpleLog log) throws SQLException {
    if (geoPackage.getFeatureTables().contains(tableName)) {
        // table already exists
        return GeopackageTableType.FEATURE;
    }
    if (geoPackage.getAttributesTables().contains(tableName)) {
        // table already exists
        return GeopackageTableType.ATTRIBUTE;
    }
    // determine if we need a feature or attribute table
    Collection<? extends PropertyDefinition> allProperties = DefinitionUtil.getAllProperties(type).stream().filter(p -> {
        // AugmentedValue
        return p.getPropertyType().getConstraint(HasValueFlag.class).isEnabled() || p.getPropertyType().getConstraint(AugmentedValueFlag.class).isEnabled();
    }).collect(Collectors.toList());
    Optional<? extends PropertyDefinition> geometryProperty = allProperties.stream().filter(property -> {
        return property.getPropertyType().getConstraint(GeometryType.class).isGeometry();
    }).findFirst();
    List<QName> primaryPath = type.getConstraint(PrimaryKey.class).getPrimaryKeyPath();
    String primaryKeyColumn;
    if (primaryPath != null && !primaryPath.isEmpty()) {
        primaryKeyColumn = primaryPath.get(0).getLocalPart();
    } else {
        primaryKeyColumn = null;
    }
    GeopackageTableType tableType;
    if (geometryProperty.isPresent()) {
        // create feature table
        tableType = GeopackageTableType.FEATURE;
        PropertyDefinition geomProp = geometryProperty.get();
        // XXX generally only one geometry column supported?
        GeometryColumns geometryColumns = new GeometryColumns();
        geometryColumns.setId(new TableColumnKey(tableName, geomProp.getName().getLocalPart()));
        geometryColumns.setGeometryType(convertGeometryType(geomProp.getPropertyType().getConstraint(GeometryType.class).getBinding()));
        // not known at that point
        BoundingBox boundingBox = null;
        // determine SRS from GeometryMetadata or sample instance
        long srsId = determineSrsId(geoPackage, geomProp, instance, log);
        List<FeatureColumn> columns = allProperties.stream().map(p -> createFeatureColumn(p, primaryKeyColumn)).collect(Collectors.toList());
        if (primaryKeyColumn == null) {
            // primary key column seems to be always needed (without there
            // were errors reading the data)
            columns.add(FeatureColumn.createPrimaryKeyColumn(findIdName(columns)));
        }
        geoPackage.createFeatureTableWithMetadata(geometryColumns, boundingBox, srsId, columns);
        FeatureDao featureDao = geoPackage.getFeatureDao(tableName);
        String spatialIndexType = getParameter(PARAM_SPATIAL_INDEX_TYPE).as(String.class, DEFAULT_SPATIAL_INDEX_TYPE);
        switch(spatialIndexType.toLowerCase()) {
            case "nga":
                createFeatureTableIndex(geoPackage, featureDao);
                break;
            case "rtree":
                createRTreeIndex(geoPackage, featureDao);
                break;
            case "none":
                // Do nothing
                break;
            default:
                throw new IllegalArgumentException(MessageFormat.format("Unknown or unsupported spatial index type \"{0}\"", spatialIndexType));
        }
    } else {
        // create attributes table
        tableType = GeopackageTableType.ATTRIBUTE;
        List<AttributesColumn> columns = allProperties.stream().map(p -> createAttributeColumn(p, primaryKeyColumn)).collect(Collectors.toList());
        if (primaryKeyColumn == null) {
            // primary key column seems to be always needed (without there
            // were errors reading the data)
            columns.add(AttributesColumn.createPrimaryKeyColumn(findIdName(columns)));
        }
        geoPackage.createAttributesTable(tableName, columns);
    }
    return tableType;
}
Also used : IOProviderConfigurationException(eu.esdihumboldt.hale.common.core.io.IOProviderConfigurationException) CRS(org.geotools.referencing.CRS) AbstractGeoInstanceWriter(eu.esdihumboldt.hale.common.instance.io.impl.AbstractGeoInstanceWriter) ByteReader(mil.nga.sf.util.ByteReader) Date(java.util.Date) PrimaryKey(eu.esdihumboldt.hale.common.schema.model.constraint.type.PrimaryKey) GeoPackageManager(mil.nga.geopackage.manager.GeoPackageManager) FeatureRow(mil.nga.geopackage.features.user.FeatureRow) GeometryProperty(eu.esdihumboldt.hale.common.schema.geometry.GeometryProperty) FeatureTableIndex(mil.nga.geopackage.extension.index.FeatureTableIndex) CRSDefinition(eu.esdihumboldt.hale.common.schema.geometry.CRSDefinition) BigInteger(java.math.BigInteger) WKBWriter(org.locationtech.jts.io.WKBWriter) URI(java.net.URI) JTS(org.geotools.geometry.jts.JTS) FeatureIndexType(mil.nga.geopackage.features.index.FeatureIndexType) Binding(eu.esdihumboldt.hale.common.schema.model.constraint.type.Binding) FeatureIndexManager(mil.nga.geopackage.features.index.FeatureIndexManager) Value(eu.esdihumboldt.hale.common.core.io.Value) GeoPackage(mil.nga.geopackage.GeoPackage) ProgressIndicator(eu.esdihumboldt.hale.common.core.io.ProgressIndicator) SimpleLog(eu.esdihumboldt.hale.common.core.report.SimpleLog) WKTDefinition(eu.esdihumboldt.hale.common.instance.geometry.impl.WKTDefinition) MultiLineString(org.locationtech.jts.geom.MultiLineString) TableColumnKey(mil.nga.geopackage.schema.TableColumnKey) FeatureColumn(mil.nga.geopackage.features.user.FeatureColumn) AugmentedValueFlag(eu.esdihumboldt.hale.common.schema.model.constraint.type.AugmentedValueFlag) GeometryMetadata(eu.esdihumboldt.hale.common.schema.model.constraint.type.GeometryMetadata) Collection(java.util.Collection) GeometryColumns(mil.nga.geopackage.features.columns.GeometryColumns) Set(java.util.Set) Point(org.locationtech.jts.geom.Point) ConversionException(org.springframework.core.convert.ConversionException) Instant(java.time.Instant) IOReporter(eu.esdihumboldt.hale.common.core.io.report.IOReporter) Collectors(java.util.stream.Collectors) InstanceCollection(eu.esdihumboldt.hale.common.instance.model.InstanceCollection) List(java.util.List) HasValueFlag(eu.esdihumboldt.hale.common.schema.model.constraint.type.HasValueFlag) LocalDate(java.time.LocalDate) Polygon(org.locationtech.jts.geom.Polygon) PropertyDefinition(eu.esdihumboldt.hale.common.schema.model.PropertyDefinition) Optional(java.util.Optional) Geometry(org.locationtech.jts.geom.Geometry) QName(javax.xml.namespace.QName) CoordinateReferenceSystem(org.opengis.referencing.crs.CoordinateReferenceSystem) MultiPolygon(org.locationtech.jts.geom.MultiPolygon) UserColumn(mil.nga.geopackage.user.UserColumn) GeoPackageGeometryData(mil.nga.geopackage.geom.GeoPackageGeometryData) BoundingBox(mil.nga.geopackage.BoundingBox) FeatureDao(mil.nga.geopackage.features.user.FeatureDao) GeoPackageDataType(mil.nga.geopackage.db.GeoPackageDataType) SpatialReferenceSystem(mil.nga.geopackage.core.srs.SpatialReferenceSystem) DefinitionUtil(eu.esdihumboldt.hale.common.schema.model.DefinitionUtil) AttributesDao(mil.nga.geopackage.attributes.AttributesDao) MessageFormat(java.text.MessageFormat) SQLException(java.sql.SQLException) IOMessageImpl(eu.esdihumboldt.hale.common.core.io.report.impl.IOMessageImpl) Instance(eu.esdihumboldt.hale.common.instance.model.Instance) GeometryType(eu.esdihumboldt.hale.common.schema.model.constraint.type.GeometryType) SpatialReferenceSystemDao(mil.nga.geopackage.core.srs.SpatialReferenceSystemDao) IOReport(eu.esdihumboldt.hale.common.core.io.report.IOReport) ConversionUtil(eu.esdihumboldt.hale.common.convert.ConversionUtil) IOException(java.io.IOException) UserCoreRow(mil.nga.geopackage.user.UserCoreRow) CodeDefinition(eu.esdihumboldt.hale.common.instance.geometry.impl.CodeDefinition) File(java.io.File) AttributesColumn(mil.nga.geopackage.attributes.AttributesColumn) LineString(org.locationtech.jts.geom.LineString) MathTransform(org.opengis.referencing.operation.MathTransform) AttributesRow(mil.nga.geopackage.attributes.AttributesRow) InstanceAccessor(eu.esdihumboldt.hale.common.instance.groovy.InstanceAccessor) ResourceIterator(eu.esdihumboldt.hale.common.instance.model.ResourceIterator) MultiPoint(org.locationtech.jts.geom.MultiPoint) TypeDefinition(eu.esdihumboldt.hale.common.schema.model.TypeDefinition) GeometryReader(mil.nga.sf.wkb.GeometryReader) GeometryColumns(mil.nga.geopackage.features.columns.GeometryColumns) AugmentedValueFlag(eu.esdihumboldt.hale.common.schema.model.constraint.type.AugmentedValueFlag) QName(javax.xml.namespace.QName) HasValueFlag(eu.esdihumboldt.hale.common.schema.model.constraint.type.HasValueFlag) PrimaryKey(eu.esdihumboldt.hale.common.schema.model.constraint.type.PrimaryKey) FeatureDao(mil.nga.geopackage.features.user.FeatureDao) MultiLineString(org.locationtech.jts.geom.MultiLineString) LineString(org.locationtech.jts.geom.LineString) PropertyDefinition(eu.esdihumboldt.hale.common.schema.model.PropertyDefinition) GeometryType(eu.esdihumboldt.hale.common.schema.model.constraint.type.GeometryType) FeatureColumn(mil.nga.geopackage.features.user.FeatureColumn) TableColumnKey(mil.nga.geopackage.schema.TableColumnKey) BoundingBox(mil.nga.geopackage.BoundingBox) AttributesColumn(mil.nga.geopackage.attributes.AttributesColumn)

Example 3 with GeoPackage

use of mil.nga.geopackage.GeoPackage in project hale by halestudio.

the class GeopackageInstanceWriter method execute.

@Override
protected IOReport execute(ProgressIndicator progress, IOReporter reporter) throws IOProviderConfigurationException, IOException {
    progress.begin("Generating Geopackage", ProgressIndicator.UNKNOWN);
    InstanceCollection instances = getInstances();
    GeoPackage geoPackage = null;
    // Connection connection = null;
    try {
        URI loc = getTarget().getLocation();
        File file;
        try {
            file = new File(loc);
        } catch (Exception e) {
            throw new IllegalArgumentException("Only files are supported as data source", e);
        }
        if (file.exists() && file.length() == 0L) {
            // convenience for overwriting empty existing file
            file.delete();
        }
        if (!file.exists()) {
            GeoPackageManager.create(file);
        }
        // open existing file
        geoPackage = GeoPackageManager.open(file, true);
        if (true) /* isWriteUnordered() */
        {
            // write instances as they come in
            writeInstances(geoPackage, instances, progress, reporter);
        } else {
        // write instances based on type order needed for insert
        // (to avoid violating constraints)
        /*
				 * Set<TypeDefinition> sortedSet = getSortedSchemas(
				 * getTargetSchema().getMappingRelevantTypes());
				 * 
				 * for (TypeDefinition td : sortedSet) {
				 * writeInstances(geoPackage, instances.select(new
				 * TypeFilter(td)), progress, reporter); }
				 */
        }
        // connection.commit();
        reporter.setSuccess(true);
    } catch (Exception e) {
        reporter.error(new IOMessageImpl(e.getLocalizedMessage(), e));
        reporter.setSuccess(false);
        reporter.setSummary("Saving instances to GeoPackage failed.");
    // if (connection != null) {
    // try {
    // connection.rollback();
    // } catch (SQLException e1) {
    // reporter.error("Error rolling back transaction", e1);
    // }
    // }
    } finally {
        if (geoPackage != null) {
            geoPackage.close();
        }
        progress.end();
    }
    return reporter;
}
Also used : InstanceCollection(eu.esdihumboldt.hale.common.instance.model.InstanceCollection) IOMessageImpl(eu.esdihumboldt.hale.common.core.io.report.impl.IOMessageImpl) GeoPackage(mil.nga.geopackage.GeoPackage) URI(java.net.URI) File(java.io.File) IOProviderConfigurationException(eu.esdihumboldt.hale.common.core.io.IOProviderConfigurationException) ConversionException(org.springframework.core.convert.ConversionException) SQLException(java.sql.SQLException) IOException(java.io.IOException)

Example 4 with GeoPackage

use of mil.nga.geopackage.GeoPackage in project hale by halestudio.

the class GeopackageSchemaReader method loadFromSource.

@Override
protected Schema loadFromSource(ProgressIndicator progress, IOReporter reporter) throws IOProviderConfigurationException, IOException {
    progress.begin("Read Geopackage schema", ProgressIndicator.UNKNOWN);
    try {
        URI loc = getSource().getLocation();
        File file;
        try {
            file = new File(loc);
        } catch (Exception e) {
            throw new IllegalArgumentException("Only files are supported as data source", e);
        }
        GeoPackage gpkg = GeoPackageManager.open(file, true);
        Schema schema = new GeopackageSchemaBuilder().buildSchema(gpkg, loc);
        reporter.setSuccess(true);
        return schema;
    } catch (Exception e) {
        reporter.setSuccess(false);
        reporter.error("Error loading schema", e);
        return null;
    } finally {
        progress.end();
    }
}
Also used : Schema(eu.esdihumboldt.hale.common.schema.model.Schema) GeoPackage(mil.nga.geopackage.GeoPackage) URI(java.net.URI) File(java.io.File) IOProviderConfigurationException(eu.esdihumboldt.hale.common.core.io.IOProviderConfigurationException) IOException(java.io.IOException)

Example 5 with GeoPackage

use of mil.nga.geopackage.GeoPackage in project hale by halestudio.

the class GeopackageInstanceReader method execute.

@Override
protected IOReport execute(ProgressIndicator progress, IOReporter reporter) throws IOProviderConfigurationException, IOException {
    progress.begin("Inspecting GeoPackage", ProgressIndicator.UNKNOWN);
    try {
        Map<String, String> queryFilters = new HashMap<>();
        String queryFiltersParam = getParameter(PARAM_QUERY_FILTER).as(String.class, null);
        if (StringUtils.hasText(queryFiltersParam)) {
            Set<String> queryFiltersByTable = new HashSet<>(Arrays.asList(StringUtils.delimitedListToStringArray(queryFiltersParam, "||")));
            for (String queryFilterRaw : queryFiltersByTable) {
                String[] rawSplit = StringUtils.split(queryFilterRaw, "|");
                if (rawSplit.length == 2) {
                    queryFilters.put(rawSplit[0].toUpperCase(), rawSplit[1]);
                }
            }
        }
        URI loc = getSource().getLocation();
        File file;
        try {
            file = new File(loc);
        } catch (Exception e) {
            throw new IllegalArgumentException("Only files are supported as data source", e);
        }
        GeoPackage gpkg = GeoPackageManager.open(file, true);
        Map<TypeDefinition, InstanceCollection> collections = new HashMap<>();
        // try to load each feature table
        for (String table : gpkg.getFeatureTables()) {
            TypeDefinition type = findType(table);
            if (type == null) {
                reporter.warn("For feature table {0} no matching schema type could be identified", table);
            } else {
                FeatureDao features = gpkg.getFeatureDao(table);
                String where = null;
                if (queryFilters.containsKey(table.toUpperCase())) {
                    where = queryFilters.get(table.toUpperCase());
                }
                collections.put(type, new GeopackageFeatureCollection(features, type, where));
            }
        }
        // try to load each attribute table
        for (String table : gpkg.getAttributesTables()) {
            TypeDefinition type = findType(table);
            if (type == null) {
                reporter.warn("For attribute table {0} no matching schema type could be identified", table);
            } else {
                AttributesDao attributes = gpkg.getAttributesDao(table);
                collections.put(type, new GeopackageFeatureCollection(attributes, type));
            }
        }
        collection = new PerTypeInstanceCollection(collections);
        reporter.setSuccess(true);
    } catch (Exception e) {
        reporter.error(new IOMessageImpl("Error configuring database connection", e));
        reporter.setSuccess(false);
    } finally {
        progress.end();
    }
    return reporter;
}
Also used : HashMap(java.util.HashMap) GeopackageFeatureCollection(eu.esdihumboldt.hale.io.geopackage.internal.GeopackageFeatureCollection) PerTypeInstanceCollection(eu.esdihumboldt.hale.common.instance.model.ext.impl.PerTypeInstanceCollection) InstanceCollection(eu.esdihumboldt.hale.common.instance.model.InstanceCollection) IOMessageImpl(eu.esdihumboldt.hale.common.core.io.report.impl.IOMessageImpl) FeatureDao(mil.nga.geopackage.features.user.FeatureDao) GeoPackage(mil.nga.geopackage.GeoPackage) URI(java.net.URI) IOProviderConfigurationException(eu.esdihumboldt.hale.common.core.io.IOProviderConfigurationException) IOException(java.io.IOException) TypeDefinition(eu.esdihumboldt.hale.common.schema.model.TypeDefinition) AttributesDao(mil.nga.geopackage.attributes.AttributesDao) File(java.io.File) PerTypeInstanceCollection(eu.esdihumboldt.hale.common.instance.model.ext.impl.PerTypeInstanceCollection) HashSet(java.util.HashSet)

Aggregations

GeoPackage (mil.nga.geopackage.GeoPackage)5 IOProviderConfigurationException (eu.esdihumboldt.hale.common.core.io.IOProviderConfigurationException)4 File (java.io.File)4 IOException (java.io.IOException)4 URI (java.net.URI)4 IOMessageImpl (eu.esdihumboldt.hale.common.core.io.report.impl.IOMessageImpl)3 InstanceCollection (eu.esdihumboldt.hale.common.instance.model.InstanceCollection)3 FeatureDao (mil.nga.geopackage.features.user.FeatureDao)3 TypeDefinition (eu.esdihumboldt.hale.common.schema.model.TypeDefinition)2 SQLException (java.sql.SQLException)2 ConversionException (org.springframework.core.convert.ConversionException)2 ConversionUtil (eu.esdihumboldt.hale.common.convert.ConversionUtil)1 ProgressIndicator (eu.esdihumboldt.hale.common.core.io.ProgressIndicator)1 Value (eu.esdihumboldt.hale.common.core.io.Value)1 IOReport (eu.esdihumboldt.hale.common.core.io.report.IOReport)1 IOReporter (eu.esdihumboldt.hale.common.core.io.report.IOReporter)1 SimpleLog (eu.esdihumboldt.hale.common.core.report.SimpleLog)1 CodeDefinition (eu.esdihumboldt.hale.common.instance.geometry.impl.CodeDefinition)1 WKTDefinition (eu.esdihumboldt.hale.common.instance.geometry.impl.WKTDefinition)1 InstanceAccessor (eu.esdihumboldt.hale.common.instance.groovy.InstanceAccessor)1