package com.rgi.suite.cli.tilestoreadapter;
import com.rgi.common.Range;
import com.rgi.common.coordinate.CoordinateReferenceSystem;
import com.rgi.common.tile.scheme.TileScheme;
import com.rgi.common.tile.scheme.ZoomTimesTwo;
import com.rgi.store.tiles.TileHandle;
import com.rgi.store.tiles.TileStoreException;
import com.rgi.store.tiles.TileStoreReader;
import com.rgi.store.tiles.TileStoreWriter;
import com.rgi.store.tiles.geopackage.GeoPackageReader;
import com.rgi.store.tiles.geopackage.GeoPackageWriter;
import com.rgi.suite.cli.HeadlessOptions;
import com.rgi.suite.cli.HeadlessUtils;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* Created by matthew.moran on 7/13/15.
*/
public class GPKGTileStoreAdapter implements HeadlessTileStoreAdapter
{
/**
* @param tileStoreReader - tile store reader to get the zoom scheme from
* @return tilescheme from the reader
* @throws TileStoreException
*/
private TileScheme getRelativeZoomTimesTwoTileScheme(final TileStoreReader tileStoreReader) throws
TileStoreException
{
final Set<Integer> zoomLevels = tileStoreReader.getZoomLevels();
if(zoomLevels.isEmpty())
{
throw new TileStoreException(
"Input tile store contains no zoom levels");
}
final Range<Integer> zoomLevelRange = new Range<>(zoomLevels, Integer::compare);
final List<TileHandle> tiles =
tileStoreReader.stream(zoomLevelRange.getMinimum()).collect(Collectors.toList());
final Range<Integer> columnRange = new Range<>(tiles,
tile -> tile.getColumn(), Integer::compare);
final Range<Integer> rowRange = new Range<>(tiles,
tile -> tile.getRow(), Integer::compare);
final int minZoomLevelMatrixWidth = columnRange.getMaximum()
- columnRange.getMinimum() + 1;
final int minZoomLevelMatrixHeight = rowRange.getMaximum()
- rowRange.getMinimum() + 1;
return new ZoomTimesTwo(zoomLevelRange.getMinimum(),
zoomLevelRange.getMaximum(), minZoomLevelMatrixWidth,
minZoomLevelMatrixHeight);
}
@Override
public TileStoreReader getReader(final HeadlessOptions opts) throws TileStoreException
{
return new GeoPackageReader(opts.getInputFile(), opts.getTileSetNameIn());
}
@Override
public TileStoreWriter getWriter(final HeadlessOptions opts, final TileStoreReader reader) throws
TileStoreException
{
final CoordinateReferenceSystem crs = new CoordinateReferenceSystem(
"EPSG",
opts.getOutputSrs());
return new GeoPackageWriter(opts.getOutputFile(),
crs,
opts.getTileSetNameOut(),
opts.getTileSetNameOut(),
opts.getTileSetDescription(),
reader.getBounds(),//always whole world (lame)
this.getRelativeZoomTimesTwoTileScheme(reader),
opts.getImageFormat(),
HeadlessUtils.getImageWriteParameter(opts.getCompressionQuality(),
opts.getCompressionType(),
opts.getImageFormat()));
}
}