blob: d0e93bb4ea45e83b1b55b189db53cd62dcde995a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.sis.storage.sql.postgis;
import java.sql.ResultSet;
import java.io.InputStream;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.apache.sis.storage.sql.feature.BinaryEncoding;
import org.apache.sis.storage.sql.feature.InfoStatements;
import org.apache.sis.storage.sql.feature.ValueGetter;
import org.apache.sis.coverage.grid.GridCoverage;
/**
* Reader of rasters encoded in Well Known Binary (WKB) format.
* At the time of writing this class, raster WKB is a PostGIS-specific format.
*
* <h2>Multi-threading</h2>
* {@code RasterGetter} instances shall be thread-safe.
*
* @author Martin Desruisseaux (Geomatys)
*
* @see org.apache.sis.storage.sql.feature.GeometryGetter
*/
final class RasterGetter extends ValueGetter<GridCoverage> {
/**
* The Coordinate Reference System if {@link InfoStatements} cannot map the SRID.
* This is {@code null} if there is no default.
*/
private final CoordinateReferenceSystem defaultCRS;
/**
* The way binary data are encoded in the raster column.
*/
private final BinaryEncoding encoding;
/**
* Creates a new reader. The same instance can be reused for parsing an arbitrary
* amount of rasters sharing the same default CRS.
*
* @param defaultCRS the CRS to use if none can be mapped from the SRID, or {@code null} if none.
* @param encoding the way binary data are encoded in the raster column.
*/
RasterGetter(final CoordinateReferenceSystem defaultCRS, final BinaryEncoding encoding) {
super(GridCoverage.class);
this.defaultCRS = defaultCRS;
this.encoding = encoding;
}
/**
* Gets the value in the column at specified index.
* The given result set must have its cursor position on the line to read.
* This method does not modify the cursor position.
*
* @param stmts prepared statements for fetching CRS from SRID, or {@code null} if none.
* @param source the result set from which to get the value.
* @param columnIndex index of the column in which to get the value.
* @return raster value in the given column. May be {@code null}.
* @throws Exception if an error occurred. May be an SQL error, a WKB parsing error, <i>etc.</i>
*/
@Override
public GridCoverage getValue(final InfoStatements stmts, final ResultSet source, final int columnIndex) throws Exception {
InputStream stream = source.getBinaryStream(columnIndex);
if (stream != null && stmts instanceof ExtendedInfo) {
stream = encoding.decode(stream);
final RasterReader reader = ((ExtendedInfo) stmts).getRasterReader();
reader.defaultCRS = defaultCRS;
return reader.readAsCoverage(reader.channel(stream));
}
return null;
}
}