This is an automated email from the ASF dual-hosted git repository. bchapuis pushed a commit to branch gdal in repository https://gitbox.apache.org/repos/asf/incubator-baremaps.git
commit 41407c56da500852a2d61d34f29b171491ae619f Author: Bertil Chapuis <[email protected]> AuthorDate: Sun Apr 23 11:03:36 2023 +0200 Improve tile store --- .run/ContourTileStore.run.xml | 16 +++ .../apache/baremaps/raster/ContourTileStore.java | 116 ++++++++++++--------- .../main/java/org/apache/baremaps/raster/Main.java | 35 +++---- .../org/apache/baremaps/tilestore/TileCoord.java | 4 +- 4 files changed, 100 insertions(+), 71 deletions(-) diff --git a/.run/ContourTileStore.run.xml b/.run/ContourTileStore.run.xml new file mode 100644 index 00000000..307d971d --- /dev/null +++ b/.run/ContourTileStore.run.xml @@ -0,0 +1,16 @@ +<component name="ProjectRunConfigurationManager"> + <configuration default="false" name="ContourTileStore" type="Application" factoryName="Application" nameIsGenerated="true"> + <option name="MAIN_CLASS_NAME" value="org.apache.baremaps.raster.ContourTileStore" /> + <module name="baremaps-core" /> + <option name="VM_PARAMETERS" value="-Djava.library.path=$PROJECT_DIR$/../../osgeo/gdal/build/swig/java" /> + <extension name="coverage"> + <pattern> + <option name="PATTERN" value="org.apache.baremaps.raster.*" /> + <option name="ENABLED" value="true" /> + </pattern> + </extension> + <method v="2"> + <option name="Make" enabled="true" /> + </method> + </configuration> +</component> \ No newline at end of file diff --git a/baremaps-core/src/main/java/org/apache/baremaps/raster/ContourTileStore.java b/baremaps-core/src/main/java/org/apache/baremaps/raster/ContourTileStore.java index a352fa20..9e2b093b 100644 --- a/baremaps-core/src/main/java/org/apache/baremaps/raster/ContourTileStore.java +++ b/baremaps-core/src/main/java/org/apache/baremaps/raster/ContourTileStore.java @@ -12,73 +12,79 @@ package org.apache.baremaps.raster; -import java.net.URL; import java.nio.ByteBuffer; -import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; import java.util.Vector; +import java.util.stream.IntStream; +import java.util.stream.LongStream; + import org.apache.baremaps.database.tile.Tile; import org.apache.baremaps.database.tile.TileStore; import org.apache.baremaps.database.tile.TileStoreException; +import org.apache.baremaps.openstreetmap.utils.GeometryUtils; +import org.apache.baremaps.openstreetmap.utils.ProjectionTransformer; +import org.gdal.gdal.Dataset; +import org.gdal.gdal.WarpOptions; import org.gdal.gdal.gdal; import org.gdal.gdalconst.gdalconstConstants; import org.gdal.ogr.FieldDefn; import org.gdal.ogr.ogr; import org.gdal.osr.SpatialReference; +import org.locationtech.jts.geom.util.GeometryTransformer; +import org.locationtech.proj4j.ProjCoordinate; -public class ContourTileStore implements TileStore { - @Override - public ByteBuffer read(Tile tile) throws TileStoreException { - var file = Paths.get(String.format("%s/%s/%s.tif", tile.z(), tile.x(), tile.y())); - var source = String.format("https://s3.amazonaws.com/elevation-tiles-prod/geotiff/%s", file); - - try { - Files.deleteIfExists(file); - Files.createDirectories(file.getParent()); - Files.createFile(file); - try (var stream = new URL(source).openStream()) { - Files.copy(stream, file); - } - } catch (Exception e) { - e.printStackTrace(); - } - - var dataset = gdal.Open(file.toString(), gdalconstConstants.GA_ReadOnly); - - dataset.GetGeoTransform(); - dataset.GetRasterXSize(); - dataset.GetRasterYSize(); - - - var band = dataset.GetRasterBand(1); - - band.ReadRaster_Direct(0, 0, 100, 100); - - var wkt = dataset.GetProjection(); - var srs = new SpatialReference(wkt); - - var driver = ogr.GetDriverByName("Memory"); - var dataSource = driver.CreateDataSource("memory_name"); +public class ContourTileStore implements TileStore, AutoCloseable { - var layer = dataSource.CreateLayer("contour", srs, ogr.wkbLineString); + static { + gdal.AllRegister(); + ogr.RegisterAll(); + } - var field = new FieldDefn("ID", ogr.OFTInteger); - field.SetWidth(8); - layer.CreateField(field, 0); - field.delete(); + private final Dataset sourceDataset; - gdal.ContourGenerateEx(band, layer, new Vector<>(List.of( - "LEVEL_INTERVAL=" + 10))); + public ContourTileStore() { + var dem = Paths.get("examples/contour/dem.xml").toAbsolutePath().toString(); + sourceDataset = gdal.Open(dem, gdalconstConstants.GA_ReadOnly); + } - for (int i = 0; i < layer.GetFeatureCount(); i++) { - var feature = layer.GetFeature(i); - var geometry = feature.GetGeometryRef(); - // System.out.println(geometry.ExportToWkt()); - } + @Override + public ByteBuffer read(Tile tile) throws TileStoreException { + var sourceBand = sourceDataset.GetRasterBand(1); + var envelope = tile.envelope(); + + // Warp the raster to the requested extent + var rasterOptions = new WarpOptions(new Vector<>(List.of( + "-of", "MEM", + "-te", Double.toString(envelope.getMinX()), Double.toString(envelope.getMinY()), Double.toString(envelope.getMaxX()), Double.toString(envelope.getMaxY()), + "-te_srs", "EPSG:4326"))); + var rasterDataset = gdal.Warp("", new Dataset[]{sourceDataset}, rasterOptions); + var rasterBand = rasterDataset.GetRasterBand(1); + + // Generate the contours + //var wkt = rasterDataset.GetProjection(); + //var srs = new SpatialReference(wkt); + var srs = new SpatialReference("EPSG:4326"); + var vectorDriver = ogr.GetDriverByName("Memory"); + var vectorDataSource = vectorDriver.CreateDataSource("vector"); + var vectorLayer = vectorDataSource.CreateLayer("vector", srs, ogr.wkbLineString); + gdal.ContourGenerateEx(rasterBand, vectorLayer, new Vector<>(List.of("LEVEL_INTERVAL=" + 10))); + + // return the contours + var geometries = LongStream.range(0, vectorLayer.GetFeatureCount()) + .mapToObj(vectorLayer::GetFeature) + .map(feature -> feature.GetGeometryRef()) + .map(geometry -> GeometryUtils.deserialize(geometry.ExportToWkb())) + .toList(); + + var transformer = GeometryUtils.coordinateTransform(4326, 3857); + var min = transformer.transform(new ProjCoordinate(envelope.getMinX(), envelope.getMinY()), new ProjCoordinate()); + var max = transformer.transform(new ProjCoordinate(envelope.getMaxX(), envelope.getMaxY()), new ProjCoordinate()); + + rasterBand.delete(); + rasterDataset.delete(); + sourceBand.delete(); - dataSource.delete(); - dataset.delete(); return null; } @@ -91,4 +97,16 @@ public class ContourTileStore implements TileStore { public void delete(Tile tile) throws TileStoreException { throw new UnsupportedOperationException(); } + + @Override + public void close() throws Exception { + sourceDataset.delete(); + } + + public static void main(String[] args) throws Exception { + var store = new ContourTileStore(); + store.read(new Tile(8492, 5792, 14).parent()); + } + + } diff --git a/baremaps-core/src/main/java/org/apache/baremaps/raster/Main.java b/baremaps-core/src/main/java/org/apache/baremaps/raster/Main.java index 4e37b4d5..f447f5c5 100644 --- a/baremaps-core/src/main/java/org/apache/baremaps/raster/Main.java +++ b/baremaps-core/src/main/java/org/apache/baremaps/raster/Main.java @@ -26,17 +26,15 @@ import org.gdal.osr.SpatialReference; public class Main { public static void main(String[] args) { - - // var sourceFilename = Paths.get("examples/contour/liecthenstein-aster-dem-v2-3857.tif") - // .toAbsolutePath().toString(); - // var hillshadeFilename = - // Paths.get("examples/contour/liecthenstein-aster-dem-v2-3857-hillshade.tif").toAbsolutePath() - // .toString(); - // var outputFilename = Paths.get("examples/contour/liecthenstein-aster-dem-v2-3857.shp") - // .toAbsolutePath().toString(); - // var warpFilename = Paths.get("examples/contour/liecthenstein-aster-dem-v2-3857-warp.tif") - // .toAbsolutePath().toString(); - + var sourceFilename = Paths.get("examples/contour/liecthenstein-aster-dem-v2-3857.tif") + .toAbsolutePath().toString(); + var hillshadeFilename = + Paths.get("examples/contour/liecthenstein-aster-dem-v2-3857-hillshade.tif").toAbsolutePath() + .toString(); + var outputFilename = Paths.get("examples/contour/liecthenstein-aster-dem-v2-3857.shp") + .toAbsolutePath().toString(); + var warpFilename = Paths.get("examples/contour/liecthenstein-aster-dem-v2-3857-warp.tif") + .toAbsolutePath().toString(); var dem = Paths.get("examples/contour/dem.xml") .toAbsolutePath().toString(); @@ -44,15 +42,15 @@ public class Main { gdal.AllRegister(); ogr.RegisterAll(); - planetContour("https://s3.amazonaws.com/elevation-tiles-prod/geotiff/%s/%s/%s.tif"); + planetContour(); - // hillshade(sourceFilename, 1, hillshadeFilename, 45d, 315d); - // contourEx(hillshadeFilename, 1, outputFilename, 50, 0); - // warp(sourceFilename, warpFilename); - // shadow(hillshadeFilename, outputFilename); + hillshade(sourceFilename, 1, hillshadeFilename, 45d, 315d); + contourEx(hillshadeFilename, 1, outputFilename, 50, 0); + warp(sourceFilename, warpFilename); + shadow(hillshadeFilename, outputFilename); } - public static void planetContour(String source) { + public static void planetContour() { var file = Paths.get(String.format("%s/%s/%s.tif", 14, 8514, 5816)); var url = String.format("https://s3.amazonaws.com/elevation-tiles-prod/geotiff/%s", file); System.out.println(url); @@ -69,7 +67,6 @@ public class Main { e.printStackTrace(); } - var dataset = gdal.Open(file.toString(), gdalconstConstants.GA_ReadOnly); var band = dataset.GetRasterBand(1); @@ -231,10 +228,8 @@ public class Main { dataSource.delete(); dataset.delete(); - } - public static void hillshade(String source, Integer sourceBand, String target, Double azimuth, Double altitude) { var options = new Vector<>(List.of( diff --git a/baremaps-core/src/main/java/org/apache/baremaps/tilestore/TileCoord.java b/baremaps-core/src/main/java/org/apache/baremaps/tilestore/TileCoord.java index a9dbf97e..1953e634 100644 --- a/baremaps-core/src/main/java/org/apache/baremaps/tilestore/TileCoord.java +++ b/baremaps-core/src/main/java/org/apache/baremaps/tilestore/TileCoord.java @@ -198,8 +198,8 @@ public final class TileCoord implements Comparable<TileCoord> { public Envelope envelope() { double x1 = tile2lon(x, z); double x2 = tile2lon(x + 1, z); - double y1 = tile2lat(y + 1, z); - double y2 = tile2lat(y, z); + double y1 = tile2lat(y, z); + double y2 = tile2lat(y + 1, z); return new Envelope(x1, x2, y1, y2); }
