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 16, 2023
1 parent 06fe411 commit f5235a8
Show file tree
Hide file tree
Showing 5 changed files with 122 additions and 3 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 @@ -13,6 +13,7 @@
package org.apache.baremaps.cli.map;

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

import com.fasterxml.jackson.databind.ObjectMapper;
Expand Down Expand Up @@ -71,7 +72,7 @@ public Integer call() throws Exception {
try (var dataSource = PostgresUtils.dataSource(database)) {
// Configure the application
var application = new ResourceConfig().register(CorsFilter.class).register(DevResources.class)
.register(contextResolverFor(objectMapper)).register(new AbstractBinder() {
.register(newContextResolver(objectMapper)).register(new AbstractBinder() {
@Override
protected void configure() {
bind("viewer").to(String.class).named("assets");
Expand Down
100 changes: 100 additions & 0 deletions baremaps-cli/src/main/java/org/apache/baremaps/cli/map/MBTiles.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
/*
* 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 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 org.apache.baremaps.cli.Options;
import org.apache.baremaps.config.ConfigReader;
import org.apache.baremaps.postgres.PostgresUtils;
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.tilestore.postgres.PostgresTileStore;
import org.apache.baremaps.vectortile.tileset.Tileset;
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;

import java.nio.file.Path;
import java.util.concurrent.Callable;

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

@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}, sortOptions = false)
subcommands = {Init.class, Export.class, Serve.class, Dev.class, MBTiles.class}, sortOptions = false)
public class Map implements Runnable {

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
package org.apache.baremaps.cli.map;

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

import com.fasterxml.jackson.databind.ObjectMapper;
Expand Down Expand Up @@ -77,7 +78,7 @@ public Integer call() throws Exception {
// Configure the application
var application =
new ResourceConfig().register(CorsFilter.class).register(ServerResources.class)
.register(contextResolverFor(objectMapper)).register(new AbstractBinder() {
.register(newContextResolver(objectMapper)).register(new AbstractBinder() {
@Override
protected void configure() {
bind(Serve.this.tileset).to(Path.class).named("tileset");
Expand Down

0 comments on commit f5235a8

Please sign in to comment.