planetiler/planetiler-core/src/test/java/com/onthegomap/planetiler/geo/TileCoordTest.java

147 wiersze
3.4 KiB
Java

package com.onthegomap.planetiler.geo;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.locationtech.jts.geom.Envelope;
class TileCoordTest {
@ParameterizedTest
@CsvSource({
"0,0,0,0",
"0,1,1,1",
"0,0,1,2",
"1,1,1,3",
"1,0,1,4",
"0,3,2,5",
"0,2,2,6",
"0,1,2,7",
"0,0,2,8",
"1,3,2,9",
"1,2,2,10",
"1,1,2,11",
"1,0,2,12",
"2,3,2,13",
"2,2,2,14",
"2,1,2,15",
"2,0,2,16",
"3,3,2,17",
"3,2,2,18",
"3,1,2,19",
"3,0,2,20",
"0,0,15,357946708",
"0,32767,15,357913941",
"32767,0,15,1431655764",
"32767,32767,15,1431622997"
})
void testTileCoordEncode(int x, int y, int z, int i) {
int encoded = TileCoord.ofXYZ(x, y, z).encoded();
assertEquals(i, encoded);
TileCoord decoded = TileCoord.decode(i);
assertEquals(decoded.x(), x, "x");
assertEquals(decoded.y(), y, "y");
assertEquals(decoded.z(), z, "z");
}
@Test
void testTileSortOrderRespectZ() {
int last = Integer.MIN_VALUE;
for (int z = 0; z <= 15; z++) {
int encoded = TileCoord.ofXYZ(0, 0, z).encoded();
if (encoded < last) {
fail("encoded value for z" + (z - 1) + " (" + last + ") is not less than z" + z + " (" + encoded + ")");
}
last = encoded;
}
}
@ParameterizedTest
@CsvSource({
"0,0,0,0",
"0,0,1,1",
"0,1,1,2",
"1,1,1,3",
"1,0,1,4",
"0,0,2,5",
"1,0,2,6",
"1,1,2,7",
"0,1,2,8",
"0,2,2,9",
"0,3,2,10",
"1,3,2,11",
"1,2,2,12",
"2,2,2,13",
"2,3,2,14",
"3,3,2,15",
"3,2,2,16",
"3,1,2,17",
"2,1,2,18",
"2,0,2,19",
"3,0,2,20"
})
void testTileCoordHilbert(int x, int y, int z, int i) {
int encoded = TileCoord.ofXYZ(x, y, z).hilbertEncoded();
assertEquals(i, encoded);
TileCoord decoded = TileCoord.hilbertDecode(i);
assertEquals(decoded.x(), x, "x");
assertEquals(decoded.y(), y, "y");
assertEquals(decoded.z(), z, "z");
}
@ParameterizedTest
@CsvSource({
"0,0,0,0",
"0,1,1,0",
"1,1,1,0.5",
"0,3,2,0"
})
void testTileProgressOnLevelTMS(int x, int y, int z, double p) {
double progress =
TileOrder.TMS.progressOnLevel(TileCoord.ofXYZ(x, y, z),
TileExtents.computeFromWorldBounds(15, GeoUtils.WORLD_BOUNDS));
assertEquals(p, progress);
}
@ParameterizedTest
@CsvSource({
"0,0,1,0",
"0,1,1,0.25",
"1,1,1,0.5",
"0,0,2,0",
"2,2,2,0.5",
})
void testTileProgressOnLevelHilbert(int x, int y, int z, double p) {
double progress =
TileOrder.HILBERT.progressOnLevel(TileCoord.ofXYZ(x, y, z),
TileExtents.computeFromWorldBounds(15, GeoUtils.WORLD_BOUNDS));
assertEquals(p, progress);
}
@ParameterizedTest
@CsvSource({
"0,0,0,0.5/0/0",
"0,0,1,1.5/42.52556/-90",
"123,123,14,14.5/84.81142/-177.28638",
})
void testDebugUrl(int x, int y, int z, String expected) {
assertEquals(expected, TileCoord.ofXYZ(x, y, z).getDebugUrl("{z}/{lat}/{lon}"));
}
@Test
void testEnvelope() {
assertEquals(new Envelope(
-180, 180,
-85.0511287798066, 85.0511287798066
), TileCoord.ofXYZ(0, 0, 0).getEnvelope());
assertEquals(new Envelope(
0, 180,
-85.0511287798066, 0
), TileCoord.ofXYZ(1, 1, 1).getEnvelope());
}
}