Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
acebe4c
Port the MARTINI algorithm to java
bchapuis Jun 11, 2024
b034bf2
Fix minor formatting issues
bchapuis Jun 12, 2024
a24f898
use double instead of float values
bchapuis Jun 27, 2024
6104fb9
Format code
bchapuis Jun 27, 2024
ebc0f43
Add hillshade and isolines algorithms
bchapuis Jun 28, 2024
4eb2d23
Compute hillshades and contour
bchapuis Jul 1, 2024
4c0c5bb
Refactor the code and improve javadoc
bchapuis Jul 23, 2024
d1f8069
Improve contour tracer
bchapuis Jul 30, 2024
ba21a24
Do some cleanup
bchapuis Jul 30, 2024
c818573
Improve API
bchapuis Jul 30, 2024
e3994b3
Systematically use SRI
bchapuis Jul 30, 2024
f94eb34
Add Chaikin smoother and improve hillshade and contour server
bchapuis Jul 31, 2024
e4543b2
Improve hillshade demonstration
bchapuis Jul 31, 2024
9ba78e7
Fix sonar issues
bchapuis Jul 31, 2024
80a92db
Fix issues detected by sonar
bchapuis Jul 31, 2024
25cc892
Do some cleaning
bchapuis Jul 31, 2024
a144428
Refactor and clean
bchapuis Aug 2, 2024
65204df
Fix polygonization
bchapuis Aug 2, 2024
7d51799
Fix unit tests
bchapuis Aug 3, 2024
2db80a1
Improve naming
bchapuis Aug 3, 2024
31e2ef7
Do some cleanup
bchapuis Aug 3, 2024
fc95956
Read wkt
bchapuis Aug 3, 2024
533c32f
Format code
bchapuis Aug 3, 2024
2ee536a
Improve hillshade and contour map
bchapuis Aug 5, 2024
ead787e
Improve hillshade and add gdal api
bchapuis Aug 20, 2024
7856a00
Move the gdal classes in a dedicated module
bchapuis Aug 21, 2024
1444236
Avoid falling into the extremes when interpolating
bchapuis Aug 21, 2024
2c4f443
Remove intermediary line merge
bchapuis Aug 21, 2024
73d163c
Add conversion method
bchapuis Aug 21, 2024
6f82ad1
Refactor and cleanup the code
bchapuis Aug 21, 2024
68ff7ea
Clean, format and document
bchapuis Aug 22, 2024
0e0c6fa
Use Apache SIS instead of GDAL to read tiff files
bchapuis Aug 29, 2024
5c4d04c
Remove printstacktrace call
bchapuis Aug 29, 2024
71bc83d
Add failing polygonization test
bchapuis Aug 29, 2024
a4d96ec
Fix polygonization
bchapuis Aug 30, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .run/basemap-dem.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="basemap-dem" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="org.apache.baremaps.cli.Baremaps" />
<module name="baremaps-cli" />
<option name="PROGRAM_PARAMETERS" value="dem serve --path /data/gebco_2024.tif" />
<target name="gdal" />
<extension name="software.aws.toolkits.jetbrains.core.execution.JavaAwsConnectionExtension">
<option name="credential" />
<option name="region" />
<option name="useCurrentConnection" value="false" />
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>
4 changes: 4 additions & 0 deletions baremaps-cli/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ limitations under the License.
<groupId>org.apache.baremaps</groupId>
<artifactId>baremaps-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.baremaps</groupId>
<artifactId>baremaps-dem</artifactId>
</dependency>
<dependency>
<groupId>org.apache.baremaps</groupId>
<artifactId>baremaps-server</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import java.util.concurrent.Callable;
import org.apache.baremaps.cli.Baremaps.VersionProvider;
import org.apache.baremaps.cli.database.Database;
import org.apache.baremaps.cli.dem.DEM;
import org.apache.baremaps.cli.geocoder.Geocoder;
import org.apache.baremaps.cli.iploc.IpLoc;
import org.apache.baremaps.cli.map.Map;
Expand All @@ -42,7 +43,14 @@
name = "baremaps",
description = "A toolkit for producing vector tiles.",
versionProvider = VersionProvider.class,
subcommands = {Workflow.class, Database.class, Map.class, Geocoder.class, IpLoc.class},
subcommands = {
Workflow.class,
Database.class,
Map.class,
Geocoder.class,
IpLoc.class,
DEM.class
},
sortOptions = false)
@SuppressWarnings("squid:S106")
public class Baremaps implements Callable<Integer> {
Expand Down
38 changes: 38 additions & 0 deletions baremaps-cli/src/main/java/org/apache/baremaps/cli/dem/DEM.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* 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.baremaps.cli.dem;



import picocli.CommandLine;
import picocli.CommandLine.Command;

@Command(name = "dem", description = "DEM processing commands.",
subcommands = {
Serve.class,
VectorTileContours.class
},
sortOptions = false)
@SuppressWarnings("squid:S106")
public class DEM implements Runnable {

@Override
public void run() {
CommandLine.usage(this, System.out);
}
}
119 changes: 119 additions & 0 deletions baremaps-cli/src/main/java/org/apache/baremaps/cli/dem/Serve.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
/*
* 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.baremaps.cli.dem;

import static org.apache.baremaps.utils.ObjectMapperUtils.objectMapper;

import com.linecorp.armeria.common.*;
import com.linecorp.armeria.server.Server;
import com.linecorp.armeria.server.annotation.JacksonResponseConverterFunction;
import com.linecorp.armeria.server.cors.CorsService;
import com.linecorp.armeria.server.docs.DocService;
import com.linecorp.armeria.server.file.HttpFile;
import java.nio.file.Path;
import java.util.concurrent.Callable;
import org.apache.baremaps.dem.ElevationUtils;
import org.apache.baremaps.server.BufferedImageResource;
import org.apache.baremaps.server.VectorTileResource;
import org.apache.baremaps.tilestore.raster.*;
import picocli.CommandLine.Command;
import picocli.CommandLine.Option;

@Command(name = "serve", description = "Start a tile server that serves elevation data.")
public class Serve implements Callable<Integer> {

@Option(names = {"--host"}, paramLabel = "HOST", description = "The host of the server.")
private String host = "localhost";

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

@Option(names = {"--path"}, paramLabel = "PATH", description = "The path of a geoTIFF file.")
private Path path;

@Override
public Integer call() throws Exception {
// Initialize the tile stores
var geoTiffReader = new GeoTiffReader(path);
var rasterElevationTileStore = new TerrariumTileStore(geoTiffReader);
var rasterHillshadeTileStore =
new RasterHillshadeTileStore(
rasterElevationTileStore,
ElevationUtils::terrariumToElevation);
var vectorHillshadeTileStore =
new VectorHillshadeTileStore(
geoTiffReader,
ElevationUtils::terrariumToElevation);
var vectorContourTileStore =
new VectorContourTileStore(geoTiffReader);

// Initialize the server
var objectMapper = objectMapper();
var jsonResponseConverter = new JacksonResponseConverterFunction(objectMapper);
var serverBuilder = Server.builder();
serverBuilder.http(port);

// Register the services
serverBuilder.annotatedService(
"/raster/elevation",
new BufferedImageResource(() -> rasterElevationTileStore),
jsonResponseConverter);
serverBuilder.annotatedService(
"/raster/hillshade",
new BufferedImageResource(() -> rasterHillshadeTileStore),
jsonResponseConverter);
serverBuilder.annotatedService(
"/vector/contour",
new VectorTileResource(() -> vectorContourTileStore),
jsonResponseConverter);
serverBuilder.annotatedService(
"/vector/hillshade",
new VectorTileResource(() -> vectorHillshadeTileStore),
jsonResponseConverter);

var index = HttpFile.of(ClassLoader.getSystemClassLoader(), "/dem/index.html");
serverBuilder.service("/", index.asService());

serverBuilder.decorator(CorsService.builderForAnyOrigin()
.allowAllRequestHeaders(true)
.allowRequestMethods(
HttpMethod.GET,
HttpMethod.POST,
HttpMethod.PUT,
HttpMethod.DELETE,
HttpMethod.OPTIONS,
HttpMethod.HEAD)
.allowCredentials()
.exposeHeaders(HttpHeaderNames.LOCATION)
.newDecorator());

serverBuilder.serviceUnder("/docs", new DocService());

serverBuilder.disableServerHeader();
serverBuilder.disableDateHeader();
var server = serverBuilder.build();

var startFuture = server.start();
startFuture.join();

var shutdownFuture = server.closeOnJvmShutdown();
shutdownFuture.join();

return 0;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
/*
* 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.baremaps.cli.dem;



import java.nio.file.Path;
import java.util.List;
import java.util.concurrent.Callable;
import org.apache.baremaps.maplibre.tileset.Tileset;
import org.apache.baremaps.maplibre.tileset.TilesetLayer;
import org.apache.baremaps.openstreetmap.stream.ProgressLogger;
import org.apache.baremaps.openstreetmap.stream.StreamUtils;
import org.apache.baremaps.tilestore.TileCoord;
import org.apache.baremaps.tilestore.TileEntry;
import org.apache.baremaps.tilestore.TileStoreException;
import org.apache.baremaps.tilestore.pmtiles.PMTilesStore;
import org.apache.baremaps.tilestore.raster.*;
import org.apache.baremaps.workflow.WorkflowException;
import org.apache.baremaps.workflow.tasks.ExportVectorTiles;
import org.locationtech.jts.geom.Envelope;
import picocli.CommandLine.Command;
import picocli.CommandLine.Option;

@Command(name = "vector-contours", description = "Generate vector contours from a DEM.")
@SuppressWarnings("squid:S106")
public class VectorTileContours implements Callable<Integer> {

@Option(names = {"--path"}, paramLabel = "PATH", description = "The path of a geoTIFF file.")
private Path path;

@Option(names = {"--repository"}, paramLabel = "REPOSITORY", description = "The tile repository.",
required = true)
private Path repository;

@Option(names = {"--format"}, paramLabel = "FORMAT",
description = "The format of the repository.")
private ExportVectorTiles.Format format = ExportVectorTiles.Format.FILE;


@Override
public Integer call() throws Exception {
var contourLayer = new TilesetLayer();
contourLayer.setId("contours");

var tileset = new Tileset();
tileset.setName("contours");
tileset.setMinzoom(2);
tileset.setMaxzoom(10);
tileset.setCenter(List.of(0d, 0d, 1d));
tileset.setBounds(List.of(-180d, -85.0511d, 180d, 85.0511d));
tileset.setVectorLayers(List.of(contourLayer));

// Initialize the tile stores
try (var geoTiffReader = new GeoTiffReader(path);
var sourceTileStore = new VectorContourTileStore(geoTiffReader);
var targetTileStore = new PMTilesStore(repository, tileset);) {

var envelope = new Envelope(-180, 180, -85.0511, 85.0511);
var count = TileCoord.count(envelope, 0, 10);

var tileCoordIterator =
TileCoord.iterator(envelope, 2, 10);
var tileCoordStream =
StreamUtils.stream(tileCoordIterator).peek(new ProgressLogger<>(count, 1000));


var bufferedTileEntryStream = StreamUtils.bufferInCompletionOrder(tileCoordStream, tile -> {

try {
return new TileEntry<>(tile, sourceTileStore.read(tile));
} catch (TileStoreException e) {
throw new WorkflowException(e);
} finally {
System.out.println("Processing tile " + tile);
}
}, 8);

var partitionedTileEntryStream = StreamUtils.partition(bufferedTileEntryStream, 8);
partitionedTileEntryStream.forEach(batch -> {
try {
targetTileStore.write(batch);
} catch (TileStoreException e) {
throw new WorkflowException(e);
}
});
return 0;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import com.linecorp.armeria.server.file.FileService;
import com.linecorp.armeria.server.file.HttpFile;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.file.Path;
import java.util.concurrent.Callable;
import java.util.function.Supplier;
Expand All @@ -37,8 +38,8 @@
import org.apache.baremaps.maplibre.tileset.Tileset;
import org.apache.baremaps.server.ChangeResource;
import org.apache.baremaps.server.StyleResource;
import org.apache.baremaps.server.TileResource;
import org.apache.baremaps.server.TilesetResource;
import org.apache.baremaps.server.VectorTileResource;
import org.apache.baremaps.tilestore.TileStore;
import org.apache.baremaps.tilestore.postgres.PostgresTileStore;
import org.apache.baremaps.utils.PostgresUtils;
Expand Down Expand Up @@ -96,7 +97,7 @@ public Integer call() throws Exception {
}
};

var tileStoreSupplier = (Supplier<TileStore>) () -> {
var tileStoreSupplier = (Supplier<TileStore<ByteBuffer>>) () -> {
var tileJSON = tilesetSupplier.get();
return new PostgresTileStore(datasource, tileJSON);
};
Expand All @@ -116,7 +117,8 @@ public Integer call() throws Exception {
var jsonResponseConverter = new JacksonResponseConverterFunction(objectMapper);
serverBuilder.annotatedService(new ChangeResource(tilesetPath, stylePath),
jsonResponseConverter);
serverBuilder.annotatedService(new TileResource(tileStoreSupplier), jsonResponseConverter);
serverBuilder.annotatedService("/tiles", new VectorTileResource(tileStoreSupplier),
jsonResponseConverter);
serverBuilder.annotatedService(new StyleResource(styleSupplier), jsonResponseConverter);
serverBuilder.annotatedService(new TilesetResource(tilesetSupplier), jsonResponseConverter);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import com.linecorp.armeria.server.docs.DocService;
import com.linecorp.armeria.server.file.FileService;
import com.linecorp.armeria.server.file.HttpFile;
import java.nio.ByteBuffer;
import java.nio.file.Path;
import java.util.concurrent.Callable;
import java.util.function.Supplier;
Expand All @@ -36,9 +37,9 @@
import org.apache.baremaps.maplibre.style.Style;
import org.apache.baremaps.maplibre.tilejson.TileJSON;
import org.apache.baremaps.server.*;
import org.apache.baremaps.tilestore.TileCache;
import org.apache.baremaps.tilestore.TileStore;
import org.apache.baremaps.tilestore.mbtiles.MBTilesStore;
import org.apache.baremaps.tilestore.vector.VectorTileCache;
import org.apache.baremaps.utils.SqliteUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -83,8 +84,8 @@ public Integer call() throws Exception {

var datasource = SqliteUtils.createDataSource(mbtilesPath, true);
try (var tileStore = new MBTilesStore(datasource);
var tileCache = new TileCache(tileStore, caffeineSpec)) {
var tileStoreSupplier = (Supplier<TileStore>) () -> tileCache;
var tileCache = new VectorTileCache(tileStore, caffeineSpec)) {
var tileStoreSupplier = (Supplier<TileStore<ByteBuffer>>) () -> tileCache;

var style = objectMapper.readValue(configReader.read(stylePath), Style.class);
var styleSupplier = (Supplier<Style>) () -> style;
Expand All @@ -96,7 +97,8 @@ public Integer call() throws Exception {
serverBuilder.http(port);

var jsonResponseConverter = new JacksonResponseConverterFunction(objectMapper);
serverBuilder.annotatedService(new TileResource(tileStoreSupplier), jsonResponseConverter);
serverBuilder.annotatedService("/tiles", new VectorTileResource(tileStoreSupplier),
jsonResponseConverter);
serverBuilder.annotatedService(new StyleResource(styleSupplier), jsonResponseConverter);
serverBuilder.annotatedService(new TileJSONResource(tileJSONSupplier), jsonResponseConverter);

Expand Down
Loading
Loading