Skip to content

Commit

Permalink
Add mbtiles command
Browse files Browse the repository at this point in the history
  • Loading branch information
bchapuis committed Jun 23, 2023
1 parent 03d8457 commit b297ed1
Show file tree
Hide file tree
Showing 6 changed files with 129 additions and 12 deletions.
17 changes: 17 additions & 0 deletions .run/basemap-mbtiles.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="basemap-mbtiles" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="org.apache.baremaps.cli.Baremaps" />
<module name="baremaps-cli" />
<option name="PROGRAM_PARAMETERS" value="map mbtiles --mbtiles $USER_HOME$/Datasets/Baremaps/tiles.mbtiles --tileset tileset.js --style style.js" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/basemap" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="org.apache.baremaps.server.ogcapi.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,13 @@

package org.apache.baremaps.benchmarks;

import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import org.apache.baremaps.tilestore.TileCoord;
import org.apache.baremaps.tilestore.TileStoreException;
Expand All @@ -33,22 +35,27 @@
@Fork(value = 1, warmups = 1)
public class MBTilesBenchmark {

public Random random = new Random(0);
public SecureRandom random = new SecureRandom();

@Param({"10", "100", "1000"})
public int iterations;

private Path file;

private MBTiles mbTiles;

@Setup
public void setup() throws IOException, TileStoreException {
var sqliteFile = File.createTempFile("baremaps", ".sqlite");
sqliteFile.deleteOnExit();
var sqliteDataSource = ExportVectorTiles.createDataSource(sqliteFile.toPath());
mbTiles = new MBTiles(sqliteDataSource);
file = Files.createTempFile(Paths.get("."), "baremaps", ".mbtiles");
mbTiles = new MBTiles(ExportVectorTiles.createDataSource(file));
mbTiles.initializeDatabase();
}

@TearDown
public void tearDown() throws IOException, TileStoreException {
Files.delete(file);
}

@Benchmark
@BenchmarkMode(Mode.SingleShotTime)
public void writeMBTiles(MBTilesBenchmark benchmark) throws TileStoreException {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/*
* Licensed 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.baremaps.cli.map;

import static io.servicetalk.data.jackson.jersey.ServiceTalkJacksonSerializerFeature.newContextResolver;
import static org.apache.baremaps.utils.ObjectMapperUtils.objectMapper;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.benmanes.caffeine.cache.CaffeineSpec;
import io.servicetalk.http.netty.HttpServers;
import io.servicetalk.http.router.jersey.HttpJerseyRouterBuilder;
import java.nio.file.Path;
import java.util.concurrent.Callable;
import org.apache.baremaps.cli.Options;
import org.apache.baremaps.server.CorsFilter;
import org.apache.baremaps.server.ServerResources;
import org.apache.baremaps.tilestore.TileCache;
import org.apache.baremaps.tilestore.TileStore;
import org.apache.baremaps.workflow.tasks.ExportVectorTiles;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.server.ResourceConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import picocli.CommandLine.Command;
import picocli.CommandLine.Mixin;
import picocli.CommandLine.Option;

@Command(name = "mbtiles", description = "Start a mbtiles server with caching capabilities.")
public class MBTiles implements Callable<Integer> {

private static final Logger logger = LoggerFactory.getLogger(MBTiles.class);

@Mixin
private Options options;

@Option(names = {"--cache"}, paramLabel = "CACHE", description = "The caffeine cache directive.")
private String cache = "";

@Option(names = {"--mbtiles"}, paramLabel = "MBTILES", description = "The mbtiles file.",
required = true)
private Path mbtiles;

@Option(names = {"--tilejson"}, paramLabel = "TILEJSON", description = "The tileJSON file.",
required = true)
private Path tileset;

@Option(names = {"--style"}, paramLabel = "STYLE", description = "The style file.",
required = true)
private Path style;

@Option(names = {"--port"}, paramLabel = "PORT", description = "The port of the server.")
private int port = 9000;

@Override
public Integer call() throws Exception {
var objectMapper = objectMapper();
var caffeineSpec = CaffeineSpec.parse(cache);
var datasource = ExportVectorTiles.createDataSource(mbtiles);

var tileStore = new org.apache.baremaps.tilestore.mbtiles.MBTiles(datasource);
var tileCache = new TileCache(tileStore, caffeineSpec);

// Configure the application
var application =
new ResourceConfig().register(CorsFilter.class).register(ServerResources.class)
.register(newContextResolver(objectMapper)).register(new AbstractBinder() {
@Override
protected void configure() {
bind(tileset).to(Path.class).named("tileset");
bind(style).to(Path.class).named("style");
bind(tileCache).to(TileStore.class);
bind(objectMapper).to(ObjectMapper.class);
}
});

var httpService = new HttpJerseyRouterBuilder().buildBlockingStreaming(application);
var serverContext = HttpServers.forPort(port).listenBlockingStreamingAndAwait(httpService);

logger.info("Listening on {}", serverContext.listenAddress());

serverContext.awaitShutdown();
return 0;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import picocli.CommandLine.Command;

@Command(name = "map", description = "Map commands.",
subcommands = {Init.class, Export.class, Serve.class, Dev.class, StyleCommand.class},
subcommands = {Init.class, Export.class, Serve.class, Dev.class, StyleCommand.class, MBTiles.class},
sortOptions = false)
public class Map implements Runnable {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -239,11 +239,13 @@ protected String tileEnvelope(TileCoord tileCoord) {
}

/** This operation is not supported. */
@Override
public void put(TileCoord tileCoord, ByteBuffer blob) {
throw new UnsupportedOperationException("The postgis tile store is read only");
}

/** This operation is not supported. */
@Override
public void delete(TileCoord tileCoord) {
throw new UnsupportedOperationException("The postgis tile store is read only");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,12 +86,10 @@ private TileStore sourceTileStore(Tileset tileset, DataSource datasource) {
private TileStore targetTileStore(Tileset source) throws TileStoreException, IOException {
if (mbtiles) {
Files.deleteIfExists(repository);

var dataSource = createDataSource(repository);
var tilesStore = new MBTiles(dataSource);
tilesStore.initializeDatabase();
tilesStore.writeMetadata(metadata(source));

return tilesStore;
} else {
return new FileTileStore(repository);
Expand Down Expand Up @@ -162,8 +160,7 @@ public static DataSource createDataSource(Path path) {
var hikariConfig = new HikariConfig();
hikariConfig.setDataSource(sqliteDataSource);
hikariConfig.setMaximumPoolSize(1);
var hikariDataSource = new HikariDataSource(hikariConfig);

return hikariDataSource;
return new HikariDataSource(hikariConfig);
}
}

0 comments on commit b297ed1

Please sign in to comment.