Skip to content

Commit 8851b46

Browse files
authored
3dtiles provider (#423)
1 parent 76bae22 commit 8851b46

File tree

71 files changed

+5602
-60
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+5602
-60
lines changed

xtraplatform-tiles/src/main/java/de/ii/xtraplatform/tiles/app/TileProviderFeatures.java

Lines changed: 8 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import de.ii.xtraplatform.base.domain.LogContext;
1818
import de.ii.xtraplatform.base.domain.LogContext.MARKER;
1919
import de.ii.xtraplatform.base.domain.LogContext.MdcCloseable;
20+
import de.ii.xtraplatform.base.domain.MapStreams;
2021
import de.ii.xtraplatform.base.domain.resiliency.OptionalVolatileCapability;
2122
import de.ii.xtraplatform.base.domain.resiliency.VolatileRegistry;
2223
import de.ii.xtraplatform.base.domain.util.Tuple;
@@ -52,6 +53,7 @@
5253
import de.ii.xtraplatform.tiles.domain.TileGenerationParameters;
5354
import de.ii.xtraplatform.tiles.domain.TileGenerationSchema;
5455
import de.ii.xtraplatform.tiles.domain.TileGenerator;
56+
import de.ii.xtraplatform.tiles.domain.TileMatrixPartitions;
5557
import de.ii.xtraplatform.tiles.domain.TileMatrixSetBase;
5658
import de.ii.xtraplatform.tiles.domain.TileMatrixSetLimits;
5759
import de.ii.xtraplatform.tiles.domain.TileMatrixSetRepository;
@@ -91,7 +93,6 @@
9193
import java.util.concurrent.atomic.AtomicInteger;
9294
import java.util.function.BiFunction;
9395
import java.util.function.Consumer;
94-
import java.util.stream.Collector;
9596
import java.util.stream.Collectors;
9697
import java.util.stream.Stream;
9798
import org.slf4j.Logger;
@@ -333,10 +334,10 @@ private TileStore getTileStore(
333334
.computeIfAbsent(
334335
cache.getStorage(),
335336
storage -> {
336-
Optional<TileStorePartitions> partitions =
337+
Optional<TileMatrixPartitions> partitions =
337338
cache.getStorage() == Storage.PER_JOB
338339
? Optional.of(
339-
new TileStorePartitions(
340+
new TileMatrixPartitions(
340341
seeding().get().getOptions().getEffectiveJobSize()))
341342
: Optional.empty();
342343

@@ -480,20 +481,6 @@ private Map<String, Range<Integer>> capCacheRanges(
480481
.collect(MapStreams.toMap());
481482
}
482483

483-
interface MapStreams {
484-
static <T, U> Collector<Map.Entry<T, U>, ?, Map<T, U>> toMap() {
485-
return Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue);
486-
}
487-
488-
static <T, U> Collector<Map.Entry<T, U>, ?, Map<T, U>> toUnmodifiableMap() {
489-
return Collectors.toUnmodifiableMap(Map.Entry::getKey, Map.Entry::getValue);
490-
}
491-
492-
static <T, U> Collector<Map.Entry<T, U>, ?, ImmutableMap<T, U>> toImmutableMap() {
493-
return ImmutableMap.toImmutableMap(Map.Entry::getKey, Map.Entry::getValue);
494-
}
495-
}
496-
497484
static String clean(String id) {
498485
return id.replace("-tiles", "").replace("tiles-", "");
499486
}
@@ -648,14 +635,14 @@ public Map<String, Map<String, Set<TileMatrixSetLimits>>> getCoverage(
648635
if (!sourcedTilesets.isEmpty()) {
649636
for (TileCache cache : generatorCaches) {
650637
if (cache.isSeeded()) {
651-
mergeCoverageInto(cache.getCoverage(sourcedTilesets), coverage);
638+
TileSeeding.mergeCoverageInto(cache.getCoverage(sourcedTilesets), coverage);
652639
}
653640
}
654641
}
655642
if (!combinedTilesets.isEmpty()) {
656643
for (TileCache cache : combinerCaches) {
657644
if (cache.isSeeded()) {
658-
mergeCoverageInto(cache.getCoverage(combinedTilesets), coverage);
645+
TileSeeding.mergeCoverageInto(cache.getCoverage(combinedTilesets), coverage);
659646
}
660647
}
661648
}
@@ -672,12 +659,12 @@ public Map<String, Map<String, Set<TileMatrixSetLimits>>> getRasterCoverage(
672659

673660
for (TileCache cache : generatorCaches) {
674661
if (cache.isSeeded()) {
675-
mergeCoverageInto(cache.getRasterCoverage(validTilesets), coverage);
662+
TileSeeding.mergeCoverageInto(cache.getRasterCoverage(validTilesets), coverage);
676663
}
677664
}
678665
for (TileCache cache : combinerCaches) {
679666
if (cache.isSeeded()) {
680-
mergeCoverageInto(cache.getRasterCoverage(validTilesets), coverage);
667+
TileSeeding.mergeCoverageInto(cache.getRasterCoverage(validTilesets), coverage);
681668
}
682669
}
683670

@@ -790,24 +777,6 @@ public Map<String, String> getRasterStorageInfo(
790777
return result;
791778
}
792779

793-
private static void mergeCoverageInto(
794-
Map<String, Map<String, Set<TileMatrixSetLimits>>> source,
795-
Map<String, Map<String, Set<TileMatrixSetLimits>>> target) {
796-
source.forEach(
797-
(tileset, tms) -> {
798-
if (!target.containsKey(tileset)) {
799-
target.put(tileset, new LinkedHashMap<>());
800-
}
801-
tms.forEach(
802-
(tmsId, limits) -> {
803-
if (!target.get(tileset).containsKey(tmsId)) {
804-
target.get(tileset).put(tmsId, new LinkedHashSet<>());
805-
}
806-
target.get(tileset).get(tmsId).addAll(limits);
807-
});
808-
});
809-
}
810-
811780
@Override
812781
public void setupSeeding(TileSeedingJobSet jobSet) throws IOException {
813782
for (Tuple<TileCache, String> cache : getCaches(jobSet)) {

xtraplatform-tiles/src/main/java/de/ii/xtraplatform/tiles/app/TileSeedingJobCreator.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import de.ii.xtraplatform.jobs.domain.JobResult;
1717
import de.ii.xtraplatform.jobs.domain.JobSet;
1818
import de.ii.xtraplatform.tiles.domain.TileGenerationParameters;
19+
import de.ii.xtraplatform.tiles.domain.TileMatrixPartitions;
1920
import de.ii.xtraplatform.tiles.domain.TileMatrixSetLimits;
2021
import de.ii.xtraplatform.tiles.domain.TileProvider;
2122
import de.ii.xtraplatform.tiles.domain.TileSeedingJob;
@@ -136,8 +137,8 @@ public JobResult process(Job job, JobSet jobSet, Consumer<Job> pushJob) {
136137
tileProvider.seeding().get().getCoverage(seedingJobSet.getTileSetParameters());
137138
Map<String, Map<String, Set<TileMatrixSetLimits>>> rasterCoverage =
138139
tileProvider.seeding().get().getRasterCoverage(seedingJobSet.getTileSetParameters());
139-
TileStorePartitions tileStorePartitions =
140-
new TileStorePartitions(
140+
TileMatrixPartitions tileStorePartitions =
141+
new TileMatrixPartitions(
141142
tileProvider.seeding().get().getOptions().getEffectiveJobSize());
142143

143144
Map<String, List<String>> rasterForVector =

xtraplatform-tiles/src/main/java/de/ii/xtraplatform/tiles/app/TileStoreMbTiles.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import de.ii.xtraplatform.tiles.domain.MbtilesMetadata;
1616
import de.ii.xtraplatform.tiles.domain.MbtilesTileset;
1717
import de.ii.xtraplatform.tiles.domain.TileGenerationSchema;
18+
import de.ii.xtraplatform.tiles.domain.TileMatrixPartitions;
1819
import de.ii.xtraplatform.tiles.domain.TileMatrixSetBase;
1920
import de.ii.xtraplatform.tiles.domain.TileMatrixSetLimits;
2021
import de.ii.xtraplatform.tiles.domain.TileMatrixSetRepository;
@@ -64,7 +65,7 @@ static TileStore readWrite(
6465
Map<String, Map<String, TileGenerationSchema>> tileSchemas,
6566
Map<String, Set<String>> tileMatrixSets,
6667
Optional<TileMatrixSetRepository> tileMatrixSetRepository,
67-
Optional<TileStorePartitions> partitions,
68+
Optional<TileMatrixPartitions> partitions,
6869
boolean seeded) {
6970
Map<String, MbtilesTileset> tileSets = new ConcurrentHashMap<>();
7071
try {
@@ -99,7 +100,7 @@ static TileStore readWrite(
99100
private final ResourceStore rootStore;
100101
private final Map<String, Map<String, TileGenerationSchema>> tileSchemas;
101102
private final Map<String, MbtilesTileset> tileSets;
102-
private final Optional<TileStorePartitions> partitions;
103+
private final Optional<TileMatrixPartitions> partitions;
103104
// the tile matrix set is only necessary for writable MBTiles files,
104105
// i.e., caches that are used for seeding
105106
private final Optional<TileMatrixSetRepository> tileMatrixSetRepository;
@@ -109,7 +110,7 @@ private TileStoreMbTiles(
109110
ResourceStore rootStore,
110111
Map<String, MbtilesTileset> tileSets,
111112
Map<String, Map<String, TileGenerationSchema>> tileSchemas,
112-
Optional<TileStorePartitions> partitions,
113+
Optional<TileMatrixPartitions> partitions,
113114
Optional<TileMatrixSetRepository> tileMatrixSetRepository) {
114115
this.providerId = providerId;
115116
this.rootStore = rootStore;
@@ -433,7 +434,7 @@ private static MbtilesTileset createTileSet(
433434
String tileset,
434435
String tileMatrixSet,
435436
List<VectorLayer> vectorLayers,
436-
Optional<TileStorePartitions> partitions,
437+
Optional<TileMatrixPartitions> partitions,
437438
boolean isRaster,
438439
boolean seeded)
439440
throws IOException {

xtraplatform-tiles/src/main/java/de/ii/xtraplatform/tiles/app/TileStoreMulti.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import de.ii.xtraplatform.tiles.domain.Cache;
1717
import de.ii.xtraplatform.tiles.domain.Cache.Storage;
1818
import de.ii.xtraplatform.tiles.domain.TileGenerationSchema;
19+
import de.ii.xtraplatform.tiles.domain.TileMatrixPartitions;
1920
import de.ii.xtraplatform.tiles.domain.TileMatrixSetBase;
2021
import de.ii.xtraplatform.tiles.domain.TileMatrixSetLimits;
2122
import de.ii.xtraplatform.tiles.domain.TileMatrixSetRepository;
@@ -55,7 +56,7 @@ public class TileStoreMulti implements TileStore, TileStore.Staging {
5556
private final Map<String, Map<String, List<TileMatrixSetLimits>>> dirty;
5657
private final Map<String, Set<String>> tileMatrixSets;
5758
private final Optional<TileMatrixSetRepository> tileMatrixSetRepository;
58-
private final Optional<TileStorePartitions> partitions;
59+
private final Optional<TileMatrixPartitions> partitions;
5960
private Tuple<TileStore, ResourceStore> staging;
6061

6162
public TileStoreMulti(
@@ -65,7 +66,7 @@ public TileStoreMulti(
6566
Map<String, Map<String, TileGenerationSchema>> tileSchemas,
6667
Map<String, Set<String>> tileMatrixSets,
6768
Optional<TileMatrixSetRepository> tileMatrixSetRepository,
68-
Optional<TileStorePartitions> partitions) {
69+
Optional<TileMatrixPartitions> partitions) {
6970
this.cacheStore = cacheStore;
7071
this.storage = storage;
7172
this.tileSetName = tileSetName;

xtraplatform-tiles/src/main/java/de/ii/xtraplatform/tiles/app/TileWalkerImpl.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,29 @@ public void walkTilesetsAndLimits(
104104
}
105105
}
106106

107+
@Override
108+
public void walkTilesetsAndLimits(
109+
Set<String> tilesets,
110+
Map<String, Map<String, Range<Integer>>> tmsRanges,
111+
Map<String, Optional<BoundingBox>> boundingBoxes,
112+
Map<String, Map<String, TileMatrixSetBase>> customTileMatrixSets,
113+
LimitsVisitor limitsVisitor)
114+
throws IOException {
115+
for (Map.Entry<String, Map<String, Range<Integer>>> entry : tmsRanges.entrySet()) {
116+
String tileset = entry.getKey();
117+
118+
if (tilesets.contains(tileset)) {
119+
Map<String, Range<Integer>> ranges = entry.getValue();
120+
Optional<BoundingBox> boundingBox = boundingBoxes.get(tileset);
121+
122+
if (boundingBox.isPresent()) {
123+
walkLimits(
124+
tileset, ranges, boundingBox.get(), customTileMatrixSets.get(tileset), limitsVisitor);
125+
}
126+
}
127+
}
128+
}
129+
107130
@Override
108131
public void walkTileSeedingJob(
109132
TileSeedingJob job,
@@ -176,6 +199,26 @@ private void walkLimits(
176199
}
177200
}
178201

202+
private void walkLimits(
203+
String tileset,
204+
Map<String, Range<Integer>> tmsRanges,
205+
BoundingBox boundingBox,
206+
Map<String, TileMatrixSetBase> customTileMatrixSets,
207+
LimitsVisitor limitsVisitor)
208+
throws IOException {
209+
for (Map.Entry<String, Range<Integer>> entry : tmsRanges.entrySet()) {
210+
TileMatrixSetBase tileMatrixSet = customTileMatrixSets.get(entry.getKey());
211+
BoundingBox bbox = getBbox(boundingBox, tileMatrixSet);
212+
213+
List<? extends TileMatrixSetLimits> allLimits =
214+
tileMatrixSet.getLimitsList(MinMax.of(entry.getValue()), bbox);
215+
216+
for (TileMatrixSetLimits limits : allLimits) {
217+
limitsVisitor.visit(tileset, tileMatrixSet, limits);
218+
}
219+
}
220+
}
221+
179222
private BoundingBox getBbox(BoundingBox boundingBox, TileMatrixSetBase tileMatrixSet) {
180223
return Objects.equals(boundingBox.getEpsgCrs(), tileMatrixSet.getCrs())
181224
? boundingBox

xtraplatform-tiles/src/main/java/de/ii/xtraplatform/tiles/domain/MbtilesTileset.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import de.ii.xtraplatform.base.domain.LogContext;
2222
import de.ii.xtraplatform.tiles.app.FeatureEncoderMVT;
2323
import de.ii.xtraplatform.tiles.app.SqlHelper;
24-
import de.ii.xtraplatform.tiles.app.TileStorePartitions;
2524
import java.io.ByteArrayOutputStream;
2625
import java.io.IOException;
2726
import java.io.InputStream;
@@ -91,7 +90,7 @@ public void release() {}
9190
private final Path tilesetPath;
9291
private final Mutex mutex;
9392
private final MbtilesMetadata metadata;
94-
private final Optional<TileStorePartitions> partitions;
93+
private final Optional<TileMatrixPartitions> partitions;
9594
private final boolean numericTileIds;
9695
private final String tileMapTable;
9796
private final String tileBlobsTable;
@@ -103,7 +102,7 @@ public MbtilesTileset(Path tilesetPath, boolean isRaster) {
103102
public MbtilesTileset(
104103
Path tilesetPath,
105104
MbtilesMetadata metadata,
106-
Optional<TileStorePartitions> partitions,
105+
Optional<TileMatrixPartitions> partitions,
107106
boolean isRaster,
108107
boolean seeded)
109108
throws IOException {
@@ -119,7 +118,7 @@ public MbtilesTileset(
119118
private MbtilesTileset(
120119
Path tilesetPath,
121120
MbtilesMetadata metadata,
122-
Optional<TileStorePartitions> partitions,
121+
Optional<TileMatrixPartitions> partitions,
123122
boolean isRaster,
124123
boolean mustExist,
125124
Mutex mutex) {

xtraplatform-tiles/src/main/java/de/ii/xtraplatform/tiles/domain/MinMax.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ static MinMax of(Range<Integer> range) {
2626
.build();
2727
}
2828

29+
static MinMax of(int min, int max) {
30+
return new ImmutableMinMax.Builder().min(min).max(max).build();
31+
}
32+
2933
int getMin();
3034

3135
int getMax();

xtraplatform-tiles/src/main/java/de/ii/xtraplatform/tiles/domain/TileCache.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,33 @@ default Map<String, Map<String, Set<TileMatrixSetLimits>>> getCoverage(
149149
return coverage;
150150
}
151151

152+
default Map<String, Map<String, Set<TileMatrixSetLimits>>> getCoverage(
153+
Map<String, TileGenerationParameters> tilesets,
154+
TileWalker tileWalker,
155+
Map<String, Map<String, Range<Integer>>> tmsRanges,
156+
Map<String, Map<String, TileMatrixSetBase>> customTileMatrixSets)
157+
throws IOException {
158+
Map<String, Optional<BoundingBox>> boundingBoxes = getBoundingBoxes(tilesets);
159+
Map<String, Map<String, Set<TileMatrixSetLimits>>> coverage = new LinkedHashMap<>();
160+
161+
tileWalker.walkTilesetsAndLimits(
162+
tilesets.keySet(),
163+
tmsRanges,
164+
boundingBoxes,
165+
customTileMatrixSets,
166+
(tileset, tms, limits) -> {
167+
if (!coverage.containsKey(tileset)) {
168+
coverage.put(tileset, new LinkedHashMap<>());
169+
}
170+
if (!coverage.get(tileset).containsKey(tms.getId())) {
171+
coverage.get(tileset).put(tms.getId(), new LinkedHashSet<>());
172+
}
173+
coverage.get(tileset).get(tms.getId()).add(limits);
174+
});
175+
176+
return coverage;
177+
}
178+
152179
default Map<String, Optional<BoundingBox>> getBoundingBoxes(
153180
Map<String, TileGenerationParameters> tilesets) {
154181
return tilesets.entrySet().stream()

xtraplatform-tiles/src/main/java/de/ii/xtraplatform/tiles/app/TileStorePartitions.java renamed to xtraplatform-tiles/src/main/java/de/ii/xtraplatform/tiles/domain/TileMatrixPartitions.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,17 @@
55
* License, v. 2.0. If a copy of the MPL was not distributed with this
66
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
77
*/
8-
package de.ii.xtraplatform.tiles.app;
8+
package de.ii.xtraplatform.tiles.domain;
99

10-
import de.ii.xtraplatform.tiles.domain.ImmutableTileSubMatrix;
11-
import de.ii.xtraplatform.tiles.domain.TileMatrixSetLimits;
12-
import de.ii.xtraplatform.tiles.domain.TileSubMatrix;
1310
import java.util.LinkedHashSet;
1411
import java.util.Set;
1512

16-
public class TileStorePartitions {
13+
public class TileMatrixPartitions {
1714
final int maxTilesPerPartition;
1815
final int singlePartitionLevel;
1916
final int singleRowCol;
2017

21-
public TileStorePartitions(int maxTilesPerPartition) {
18+
public TileMatrixPartitions(int maxTilesPerPartition) {
2219
this.maxTilesPerPartition = maxTilesPerPartition;
2320
this.singleRowCol = (int) Math.sqrt(maxTilesPerPartition);
2421
this.singlePartitionLevel = (int) (Math.log(singleRowCol) / Math.log(2));

xtraplatform-tiles/src/main/java/de/ii/xtraplatform/tiles/domain/TileMatrixSet.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import de.ii.xtraplatform.crs.domain.CrsTransformationException;
1313
import de.ii.xtraplatform.crs.domain.CrsTransformerFactory;
1414
import de.ii.xtraplatform.crs.domain.EpsgCrs;
15+
import de.ii.xtraplatform.tiles.app.TileMatrixSetImpl;
1516
import java.math.BigDecimal;
1617
import java.math.RoundingMode;
1718
import java.net.URI;
@@ -24,6 +25,10 @@
2425
/** This class provides derived information from a tile matrix set. */
2526
public interface TileMatrixSet extends TileMatrixSetBase {
2627

28+
static TileMatrixSet custom(TileMatrixSetData data) {
29+
return new TileMatrixSetImpl(data);
30+
}
31+
2732
Logger LOGGER = LoggerFactory.getLogger(TileMatrixSet.class);
2833

2934
/**

0 commit comments

Comments
 (0)