This is an automated email from the ASF dual-hosted git repository.
bchapuis pushed a commit to branch pmtiles
in repository https://gitbox.apache.org/repos/asf/incubator-baremaps.git
The following commit(s) were added to refs/heads/pmtiles by this push:
new 4f4f4448 Format code
4f4f4448 is described below
commit 4f4f44489c5bb4dbc2111099929e0400b7b9033e
Author: Bertil Chapuis <[email protected]>
AuthorDate: Wed Sep 6 00:09:17 2023 +0200
Format code
---
.../apache/baremaps/tilestore/pmtiles/PMTiles.java | 476 +++++++++++----------
.../baremaps/tilestore/pmtiles/PMTilesTest.java | 289 +++++++------
2 files changed, 393 insertions(+), 372 deletions(-)
diff --git
a/baremaps-core/src/main/java/org/apache/baremaps/tilestore/pmtiles/PMTiles.java
b/baremaps-core/src/main/java/org/apache/baremaps/tilestore/pmtiles/PMTiles.java
index f773c7eb..3ec6d62e 100644
---
a/baremaps-core/src/main/java/org/apache/baremaps/tilestore/pmtiles/PMTiles.java
+++
b/baremaps-core/src/main/java/org/apache/baremaps/tilestore/pmtiles/PMTiles.java
@@ -1,261 +1,271 @@
+/*
+ * 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.tilestore.pmtiles;
import com.google.common.math.LongMath;
-
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
public class PMTiles {
- public static long toNum(long low, long high) {
- return high * 0x100000000L + low;
- }
+ public static long toNum(long low, long high) {
+ return high * 0x100000000L + low;
+ }
- public static long readVarintRemainder(long l, ByteBuffer buf) {
- long h, b;
- b = buf.get() & 0xff;
- h = (b & 0x70) >> 4;
- if (b < 0x80) {
- return toNum(l, h);
- }
- b = buf.get() & 0xff;
- h |= (b & 0x7f) << 3;
- if (b < 0x80) {
- return toNum(l, h);
- }
- b = buf.get() & 0xff;
- h |= (b & 0x7f) << 10;
- if (b < 0x80) {
- return toNum(l, h);
- }
- b = buf.get() & 0xff;
- h |= (b & 0x7f) << 17;
- if (b < 0x80) {
- return toNum(l, h);
- }
- b = buf.get() & 0xff;
- h |= (b & 0x7f) << 24;
- if (b < 0x80) {
- return toNum(l, h);
- }
- b = buf.get() & 0xff;
- h |= (b & 0x01) << 31;
- if (b < 0x80) {
- return toNum(l, h);
- }
- throw new RuntimeException("Expected varint not more than 10 bytes");
+ public static long readVarintRemainder(long l, ByteBuffer buf) {
+ long h, b;
+ b = buf.get() & 0xff;
+ h = (b & 0x70) >> 4;
+ if (b < 0x80) {
+ return toNum(l, h);
+ }
+ b = buf.get() & 0xff;
+ h |= (b & 0x7f) << 3;
+ if (b < 0x80) {
+ return toNum(l, h);
+ }
+ b = buf.get() & 0xff;
+ h |= (b & 0x7f) << 10;
+ if (b < 0x80) {
+ return toNum(l, h);
}
+ b = buf.get() & 0xff;
+ h |= (b & 0x7f) << 17;
+ if (b < 0x80) {
+ return toNum(l, h);
+ }
+ b = buf.get() & 0xff;
+ h |= (b & 0x7f) << 24;
+ if (b < 0x80) {
+ return toNum(l, h);
+ }
+ b = buf.get() & 0xff;
+ h |= (b & 0x01) << 31;
+ if (b < 0x80) {
+ return toNum(l, h);
+ }
+ throw new RuntimeException("Expected varint not more than 10 bytes");
+ }
- public static long readVarint(ByteBuffer buf) {
- long val, b;
- b = buf.get() & 0xff;
- val = b & 0x7f;
- if (b < 0x80) {
- return val;
- }
- b = buf.get() & 0xff;
- val |= (b & 0x7f) << 7;
- if (b < 0x80) {
- return val;
- }
- b = buf.get() & 0xff;
- val |= (b & 0x7f) << 14;
- if (b < 0x80) {
- return val;
- }
- b = buf.get() & 0xff;
- val |= (b & 0x7f) << 21;
- if (b < 0x80) {
- return val;
- }
- val |= (b & 0x0f) << 28;
- return readVarintRemainder(val, buf);
+ public static long readVarint(ByteBuffer buf) {
+ long val, b;
+ b = buf.get() & 0xff;
+ val = b & 0x7f;
+ if (b < 0x80) {
+ return val;
+ }
+ b = buf.get() & 0xff;
+ val |= (b & 0x7f) << 7;
+ if (b < 0x80) {
+ return val;
}
+ b = buf.get() & 0xff;
+ val |= (b & 0x7f) << 14;
+ if (b < 0x80) {
+ return val;
+ }
+ b = buf.get() & 0xff;
+ val |= (b & 0x7f) << 21;
+ if (b < 0x80) {
+ return val;
+ }
+ val |= (b & 0x0f) << 28;
+ return readVarintRemainder(val, buf);
+ }
- public static void rotate(long n, long[] xy, long rx, long ry) {
- if (ry == 0) {
- if (rx == 1) {
- xy[0] = n - 1 - xy[0];
- xy[1] = n - 1 - xy[1];
- }
- long t = xy[0];
- xy[0] = xy[1];
- xy[1] = t;
- }
+ public static void rotate(long n, long[] xy, long rx, long ry) {
+ if (ry == 0) {
+ if (rx == 1) {
+ xy[0] = n - 1 - xy[0];
+ xy[1] = n - 1 - xy[1];
+ }
+ long t = xy[0];
+ xy[0] = xy[1];
+ xy[1] = t;
}
+ }
- public static long[] idOnLevel(int z, long pos) {
- long n = LongMath.pow(2, z);
- long rx, ry, t = pos;
- long[] xy = new long[]{0, 0};
- long s = 1;
- while (s < n) {
- rx = 1 & (t / 2);
- ry = 1 & (t ^ rx);
- rotate(s, xy, rx, ry);
- xy[0] += s * rx;
- xy[1] += s * ry;
- t = t / 4;
- s *= 2;
- }
- return new long[]{z, xy[0], xy[1]};
+ public static long[] idOnLevel(int z, long pos) {
+ long n = LongMath.pow(2, z);
+ long rx, ry, t = pos;
+ long[] xy = new long[] {0, 0};
+ long s = 1;
+ while (s < n) {
+ rx = 1 & (t / 2);
+ ry = 1 & (t ^ rx);
+ rotate(s, xy, rx, ry);
+ xy[0] += s * rx;
+ xy[1] += s * ry;
+ t = t / 4;
+ s *= 2;
}
+ return new long[] {z, xy[0], xy[1]};
+ }
- private static long[] tzValues = new long[]{
- 0, 1, 5, 21, 85, 341, 1365, 5461, 21845, 87381, 349525, 1398101,
5592405,
- 22369621, 89478485, 357913941, 1431655765, 5726623061L,
22906492245L,
- 91625968981L, 366503875925L, 1466015503701L, 5864062014805L,
23456248059221L,
- 93824992236885L, 375299968947541L, 1501199875790165L,
- };
+ private static long[] tzValues = new long[] {
+ 0, 1, 5, 21, 85, 341, 1365, 5461, 21845, 87381, 349525, 1398101, 5592405,
+ 22369621, 89478485, 357913941, 1431655765, 5726623061L, 22906492245L,
+ 91625968981L, 366503875925L, 1466015503701L, 5864062014805L,
23456248059221L,
+ 93824992236885L, 375299968947541L, 1501199875790165L,
+ };
- public static long zxyToTileId(int z, long x, long y) {
- if (z > 26) {
- throw new RuntimeException("Tile zoom level exceeds max safe
number limit (26)");
- }
- if (x > Math.pow(2, z) - 1 || y > Math.pow(2, z) - 1) {
- throw new RuntimeException("tile x/y outside zoom level bounds");
- }
- long acc = tzValues[z];
- long n = LongMath.pow(2, z);
- long rx = 0;
- long ry = 0;
- long d = 0;
- long[] xy = new long[]{x, y};
- long s = n / 2;
- while (s > 0) {
- rx = (xy[0] & s) > 0 ? 1 : 0;
- ry = (xy[1] & s) > 0 ? 1 : 0;
- d += s * s * ((3 * rx) ^ ry);
- rotate(s, xy, rx, ry);
- s = s / 2;
- }
- return acc + d;
+ public static long zxyToTileId(int z, long x, long y) {
+ if (z > 26) {
+ throw new RuntimeException("Tile zoom level exceeds max safe number
limit (26)");
}
-
- public static long[] tileIdToZxy(long i) {
- long acc = 0;
- for (int z = 0; z < 27; z++) {
- long numTiles = (0x1L << z) * (0x1L << z);
- if (acc + numTiles > i) {
- return idOnLevel(z, i - acc);
- }
- acc += numTiles;
- }
- throw new RuntimeException("Tile zoom level exceeds max safe number
limit (26)");
+ if (x > Math.pow(2, z) - 1 || y > Math.pow(2, z) - 1) {
+ throw new RuntimeException("tile x/y outside zoom level bounds");
}
-
- enum Compression {
- Unknown,
- None,
- Gzip,
- Brotli,
- Zstd,
+ long acc = tzValues[z];
+ long n = LongMath.pow(2, z);
+ long rx = 0;
+ long ry = 0;
+ long d = 0;
+ long[] xy = new long[] {x, y};
+ long s = n / 2;
+ while (s > 0) {
+ rx = (xy[0] & s) > 0 ? 1 : 0;
+ ry = (xy[1] & s) > 0 ? 1 : 0;
+ d += s * s * ((3 * rx) ^ ry);
+ rotate(s, xy, rx, ry);
+ s = s / 2;
}
+ return acc + d;
+ }
- enum TileType {
- Unknown,
- Mvt,
- Png,
- Jpeg,
- Webp,
- Avif,
+ public static long[] tileIdToZxy(long i) {
+ long acc = 0;
+ for (int z = 0; z < 27; z++) {
+ long numTiles = (0x1L << z) * (0x1L << z);
+ if (acc + numTiles > i) {
+ return idOnLevel(z, i - acc);
+ }
+ acc += numTiles;
}
+ throw new RuntimeException("Tile zoom level exceeds max safe number limit
(26)");
+ }
- public record Header(
- int specVersion,
- long rootDirectoryOffset,
- long rootDirectoryLength,
- long jsonMetadataOffset,
- long jsonMetadataLength,
- long leafDirectoryOffset,
- long leafDirectoryLength,
- long tileDataOffset,
- long tileDataLength,
- long numAddressedTiles,
- long numTileEntries,
- long numTileContents,
- boolean clustered,
- Compression internalCompression,
- Compression tileCompression,
- TileType tileType,
- int minZoom,
- int maxZoom,
- double minLon,
- double minLat,
- double maxLon,
- double maxLat,
- int centerZoom,
- double centerLon,
- double centerLat,
- String etag
- ) {}
+ enum Compression {
+ Unknown,
+ None,
+ Gzip,
+ Brotli,
+ Zstd,
+ }
- public static Header bytesToHeader(ByteBuffer buf, String etag) {
- buf.order(ByteOrder.LITTLE_ENDIAN);
- return new Header(
- buf.get(7),
- buf.getLong(8),
- buf.getLong(16),
- buf.getLong(24),
- buf.getLong(32),
- buf.getLong(40),
- buf.getLong(48),
- buf.getLong(56),
- buf.getLong(64),
- buf.getLong(72),
- buf.getLong(80),
- buf.getLong(88),
- buf.get(96) == 1,
- Compression.values()[buf.get(97)],
- Compression.values()[buf.get(98)],
- TileType.values()[buf.get(99)],
- buf.get(100),
- buf.get(101),
- (double) buf.getInt(102) / 10000000,
- (double) buf.getInt(106) / 10000000,
- (double) buf.getInt(110) / 10000000,
- (double) buf.getInt(114) / 10000000,
- buf.get(118),
- (double) buf.getInt(119) / 10000000,
- (double) buf.getInt(123) / 10000000,
- etag
- );
- }
+ enum TileType {
+ Unknown,
+ Mvt,
+ Png,
+ Jpeg,
+ Webp,
+ Avif,
+ }
- public static void headerToBytes(Header header, ByteBuffer buf) {
- buf.order(ByteOrder.LITTLE_ENDIAN);
- buf.put(0, (byte) 0x4d);
- buf.put(1, (byte) 0x42);
- buf.put(2, (byte) 0x54);
- buf.put(3, (byte) 0x42);
- buf.put(4, (byte) 0x49);
- buf.put(5, (byte) 0x4e);
- buf.put(6, (byte) 0x41);
- buf.put(7, (byte) header.specVersion);
- buf.putLong(8, header.rootDirectoryOffset);
- buf.putLong(16, header.rootDirectoryLength);
- buf.putLong(24, header.jsonMetadataOffset);
- buf.putLong(32, header.jsonMetadataLength);
- buf.putLong(40, header.leafDirectoryOffset);
- buf.putLong(48, header.leafDirectoryLength);
- buf.putLong(56, header.tileDataOffset);
- buf.putLong(64, header.tileDataLength);
- buf.putLong(72, header.numAddressedTiles);
- buf.putLong(80, header.numTileEntries);
- buf.putLong(88, header.numTileContents);
- buf.put(96, (byte) (header.clustered ? 1 : 0));
- buf.put(97, (byte) header.internalCompression.ordinal());
- buf.put(98, (byte) header.tileCompression.ordinal());
- buf.put(99, (byte) header.tileType.ordinal());
- buf.put(100, (byte) header.minZoom);
- buf.put(101, (byte) header.maxZoom);
- buf.putInt(102, (int) (header.minLon * 10000000));
- buf.putInt(106, (int) (header.minLat * 10000000));
- buf.putInt(110, (int) (header.maxLon * 10000000));
- buf.putInt(114, (int) (header.maxLat * 10000000));
- buf.put(118, (byte) header.centerZoom);
- buf.putInt(119, (int) (header.centerLon * 10000000));
- buf.putInt(123, (int) (header.centerLat * 10000000));
- }
+ public record Header(
+ int specVersion,
+ long rootDirectoryOffset,
+ long rootDirectoryLength,
+ long jsonMetadataOffset,
+ long jsonMetadataLength,
+ long leafDirectoryOffset,
+ long leafDirectoryLength,
+ long tileDataOffset,
+ long tileDataLength,
+ long numAddressedTiles,
+ long numTileEntries,
+ long numTileContents,
+ boolean clustered,
+ Compression internalCompression,
+ Compression tileCompression,
+ TileType tileType,
+ int minZoom,
+ int maxZoom,
+ double minLon,
+ double minLat,
+ double maxLon,
+ double maxLat,
+ int centerZoom,
+ double centerLon,
+ double centerLat,
+ String etag) {
+ }
+
+ public static Header bytesToHeader(ByteBuffer buf, String etag) {
+ buf.order(ByteOrder.LITTLE_ENDIAN);
+ return new Header(
+ buf.get(7),
+ buf.getLong(8),
+ buf.getLong(16),
+ buf.getLong(24),
+ buf.getLong(32),
+ buf.getLong(40),
+ buf.getLong(48),
+ buf.getLong(56),
+ buf.getLong(64),
+ buf.getLong(72),
+ buf.getLong(80),
+ buf.getLong(88),
+ buf.get(96) == 1,
+ Compression.values()[buf.get(97)],
+ Compression.values()[buf.get(98)],
+ TileType.values()[buf.get(99)],
+ buf.get(100),
+ buf.get(101),
+ (double) buf.getInt(102) / 10000000,
+ (double) buf.getInt(106) / 10000000,
+ (double) buf.getInt(110) / 10000000,
+ (double) buf.getInt(114) / 10000000,
+ buf.get(118),
+ (double) buf.getInt(119) / 10000000,
+ (double) buf.getInt(123) / 10000000,
+ etag);
+ }
+
+ public static void headerToBytes(Header header, ByteBuffer buf) {
+ buf.order(ByteOrder.LITTLE_ENDIAN);
+ buf.put(0, (byte) 0x50);
+ buf.put(1, (byte) 0x4D);
+ buf.put(2, (byte) 0x54);
+ buf.put(3, (byte) 0x69);
+ buf.put(4, (byte) 0x6C);
+ buf.put(5, (byte) 0x65);
+ buf.put(6, (byte) 0x73);
+ buf.put(7, (byte) header.specVersion);
+ buf.putLong(8, header.rootDirectoryOffset);
+ buf.putLong(16, header.rootDirectoryLength);
+ buf.putLong(24, header.jsonMetadataOffset);
+ buf.putLong(32, header.jsonMetadataLength);
+ buf.putLong(40, header.leafDirectoryOffset);
+ buf.putLong(48, header.leafDirectoryLength);
+ buf.putLong(56, header.tileDataOffset);
+ buf.putLong(64, header.tileDataLength);
+ buf.putLong(72, header.numAddressedTiles);
+ buf.putLong(80, header.numTileEntries);
+ buf.putLong(88, header.numTileContents);
+ buf.put(96, (byte) (header.clustered ? 1 : 0));
+ buf.put(97, (byte) header.internalCompression.ordinal());
+ buf.put(98, (byte) header.tileCompression.ordinal());
+ buf.put(99, (byte) header.tileType.ordinal());
+ buf.put(100, (byte) header.minZoom);
+ buf.put(101, (byte) header.maxZoom);
+ buf.putInt(102, (int) (header.minLon * 10000000));
+ buf.putInt(106, (int) (header.minLat * 10000000));
+ buf.putInt(110, (int) (header.maxLon * 10000000));
+ buf.putInt(114, (int) (header.maxLat * 10000000));
+ buf.put(118, (byte) header.centerZoom);
+ buf.putInt(119, (int) (header.centerLon * 10000000));
+ buf.putInt(123, (int) (header.centerLat * 10000000));
+ }
}
diff --git
a/baremaps-core/src/test/java/org/apache/baremaps/tilestore/pmtiles/PMTilesTest.java
b/baremaps-core/src/test/java/org/apache/baremaps/tilestore/pmtiles/PMTilesTest.java
index 3eda409b..1fdf7129 100644
---
a/baremaps-core/src/test/java/org/apache/baremaps/tilestore/pmtiles/PMTilesTest.java
+++
b/baremaps-core/src/test/java/org/apache/baremaps/tilestore/pmtiles/PMTilesTest.java
@@ -1,161 +1,172 @@
+/*
+ * 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.tilestore.pmtiles;
+import static org.junit.jupiter.api.Assertions.*;
+
import com.google.common.math.LongMath;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.file.Files;
import org.apache.baremaps.testing.TestFiles;
import org.apache.baremaps.tilestore.pmtiles.PMTiles.Compression;
import org.apache.baremaps.tilestore.pmtiles.PMTiles.TileType;
import org.junit.jupiter.api.Test;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.file.Files;
-
-import static org.junit.jupiter.api.Assertions.*;
-
class PMTilesTest {
- @Test
- void varint() {
- var b = ByteBuffer.wrap(new byte[]{
- (byte) 0, (byte) 1,
- (byte) 127, (byte) 0xe5,
- (byte) 0x8e, (byte) 0x26
- });
- assertEquals(PMTiles.readVarint(b), 0);
- assertEquals(PMTiles.readVarint(b), 1);
- assertEquals(PMTiles.readVarint(b), 127);
- assertEquals(PMTiles.readVarint(b), 624485);
- b = ByteBuffer.wrap(new byte[]{
- (byte) 0xff, (byte) 0xff,
- (byte) 0xff, (byte) 0xff,
- (byte) 0xff, (byte) 0xff,
- (byte) 0xff, (byte) 0x0f,
- });
- assertEquals(PMTiles.readVarint(b), 9007199254740991L);
- }
+ @Test
+ void varint() {
+ var b = ByteBuffer.wrap(new byte[] {
+ (byte) 0, (byte) 1,
+ (byte) 127, (byte) 0xe5,
+ (byte) 0x8e, (byte) 0x26
+ });
+ assertEquals(PMTiles.readVarint(b), 0);
+ assertEquals(PMTiles.readVarint(b), 1);
+ assertEquals(PMTiles.readVarint(b), 127);
+ assertEquals(PMTiles.readVarint(b), 624485);
+ b = ByteBuffer.wrap(new byte[] {
+ (byte) 0xff, (byte) 0xff,
+ (byte) 0xff, (byte) 0xff,
+ (byte) 0xff, (byte) 0xff,
+ (byte) 0xff, (byte) 0x0f,
+ });
+ assertEquals(PMTiles.readVarint(b), 9007199254740991L);
+ }
- @Test
- void zxyToTileId() {
- assertEquals(PMTiles.zxyToTileId(0, 0, 0), 0);
- assertEquals(PMTiles.zxyToTileId(1, 0, 0), 1);
- assertEquals(PMTiles.zxyToTileId(1, 0, 1), 2);
- assertEquals(PMTiles.zxyToTileId(1, 1, 1), 3);
- assertEquals(PMTiles.zxyToTileId(1, 1, 0), 4);
- assertEquals(PMTiles.zxyToTileId(2, 0, 0), 5);
- }
+ @Test
+ void zxyToTileId() {
+ assertEquals(PMTiles.zxyToTileId(0, 0, 0), 0);
+ assertEquals(PMTiles.zxyToTileId(1, 0, 0), 1);
+ assertEquals(PMTiles.zxyToTileId(1, 0, 1), 2);
+ assertEquals(PMTiles.zxyToTileId(1, 1, 1), 3);
+ assertEquals(PMTiles.zxyToTileId(1, 1, 0), 4);
+ assertEquals(PMTiles.zxyToTileId(2, 0, 0), 5);
+ }
- @Test
- void tileIdToZxy() {
- assertArrayEquals(PMTiles.tileIdToZxy(0), new long[]{0, 0, 0});
- assertArrayEquals(PMTiles.tileIdToZxy(1), new long[]{1, 0, 0});
- assertArrayEquals(PMTiles.tileIdToZxy(2), new long[]{1, 0, 1});
- assertArrayEquals(PMTiles.tileIdToZxy(3), new long[]{1, 1, 1});
- assertArrayEquals(PMTiles.tileIdToZxy(4), new long[]{1, 1, 0});
- assertArrayEquals(PMTiles.tileIdToZxy(5), new long[]{2, 0, 0});
- }
+ @Test
+ void tileIdToZxy() {
+ assertArrayEquals(PMTiles.tileIdToZxy(0), new long[] {0, 0, 0});
+ assertArrayEquals(PMTiles.tileIdToZxy(1), new long[] {1, 0, 0});
+ assertArrayEquals(PMTiles.tileIdToZxy(2), new long[] {1, 0, 1});
+ assertArrayEquals(PMTiles.tileIdToZxy(3), new long[] {1, 1, 1});
+ assertArrayEquals(PMTiles.tileIdToZxy(4), new long[] {1, 1, 0});
+ assertArrayEquals(PMTiles.tileIdToZxy(5), new long[] {2, 0, 0});
+ }
- @Test
- void aLotOfTiles() {
- for (int z = 0; z < 9; z++) {
- for (long x = 0; x < 1 << z; x++) {
- for (long y = 0; y < 1 << z; y++) {
- var result = PMTiles.tileIdToZxy(PMTiles.zxyToTileId(z, x,
y));
- if (result[0] != z || result[1] != x || result[2] != y) {
- fail("roundtrip failed");
- }
- }
- }
+ @Test
+ void aLotOfTiles() {
+ for (int z = 0; z < 9; z++) {
+ for (long x = 0; x < 1 << z; x++) {
+ for (long y = 0; y < 1 << z; y++) {
+ var result = PMTiles.tileIdToZxy(PMTiles.zxyToTileId(z, x, y));
+ if (result[0] != z || result[1] != x || result[2] != y) {
+ fail("roundtrip failed");
+ }
}
+ }
}
+ }
- @Test
- void tileExtremes() {
- for (var z = 0; z < 27; z++) {
- var dim = LongMath.pow(2, z) - 1;
- var tl = PMTiles.tileIdToZxy(PMTiles.zxyToTileId(z, 0, 0));
- assertArrayEquals(new long[]{z, 0, 0}, tl);
- var tr = PMTiles.tileIdToZxy(PMTiles.zxyToTileId(z, dim, 0));
- assertArrayEquals(new long[]{z, dim, 0}, tr);
- var bl = PMTiles.tileIdToZxy(PMTiles.zxyToTileId(z, 0, dim));
- assertArrayEquals(new long[]{z, 0, dim}, bl);
- var br = PMTiles.tileIdToZxy(PMTiles.zxyToTileId(z, dim, dim));
- assertArrayEquals(new long[]{z, dim, dim}, br);
- }
+ @Test
+ void tileExtremes() {
+ for (var z = 0; z < 27; z++) {
+ var dim = LongMath.pow(2, z) - 1;
+ var tl = PMTiles.tileIdToZxy(PMTiles.zxyToTileId(z, 0, 0));
+ assertArrayEquals(new long[] {z, 0, 0}, tl);
+ var tr = PMTiles.tileIdToZxy(PMTiles.zxyToTileId(z, dim, 0));
+ assertArrayEquals(new long[] {z, dim, 0}, tr);
+ var bl = PMTiles.tileIdToZxy(PMTiles.zxyToTileId(z, 0, dim));
+ assertArrayEquals(new long[] {z, 0, dim}, bl);
+ var br = PMTiles.tileIdToZxy(PMTiles.zxyToTileId(z, dim, dim));
+ assertArrayEquals(new long[] {z, dim, dim}, br);
}
+ }
- @Test
- void invalidTiles() {
- assertThrows(RuntimeException.class, () ->
PMTiles.tileIdToZxy(9007199254740991L));
- assertThrows(RuntimeException.class, () -> PMTiles.zxyToTileId(27, 0,
0));
- assertThrows(RuntimeException.class, () -> PMTiles.zxyToTileId(0, 1,
1));
- }
+ @Test
+ void invalidTiles() {
+ assertThrows(RuntimeException.class, () ->
PMTiles.tileIdToZxy(9007199254740991L));
+ assertThrows(RuntimeException.class, () -> PMTiles.zxyToTileId(27, 0, 0));
+ assertThrows(RuntimeException.class, () -> PMTiles.zxyToTileId(0, 1, 1));
+ }
- @Test
- void bytesToHeader() throws IOException {
- var file = TestFiles.resolve("pmtiles/test_fixture_1.pmtiles");
- try (var channel = Files.newByteChannel(file)) {
- var buffer = ByteBuffer.allocate(127);
- channel.read(buffer);
- buffer.flip();
- var header = PMTiles.bytesToHeader(buffer, "1");
- assertEquals(header.rootDirectoryOffset(), 127);
- assertEquals(header.rootDirectoryLength(), 25);
- assertEquals(header.jsonMetadataOffset(), 152);
- assertEquals(header.jsonMetadataLength(), 247);
- assertEquals(header.leafDirectoryOffset(), 0);
- assertEquals(header.leafDirectoryLength(), 0);
- assertEquals(header.tileDataOffset(), 399);
- assertEquals(header.tileDataLength(), 69);
- assertEquals(header.numAddressedTiles(), 1);
- assertEquals(header.numTileEntries(), 1);
- assertEquals(header.numTileContents(), 1);
- assertFalse(header.clustered());
- assertEquals(header.internalCompression(), Compression.Gzip);
- assertEquals(header.tileCompression(), Compression.Gzip);
- assertEquals(header.tileType(), TileType.Mvt);
- assertEquals(header.minZoom(), 0);
- assertEquals(header.maxZoom(), 0);
- assertEquals(header.minLon(), 0);
- assertEquals(header.minLat(), 0);
- assertEquals(Math.round(header.maxLon()), 1);
- assertEquals(Math.round(header.maxLat()), 1);
- }
+ @Test
+ void bytesToHeader() throws IOException {
+ var file = TestFiles.resolve("pmtiles/test_fixture_1.pmtiles");
+ try (var channel = Files.newByteChannel(file)) {
+ var buffer = ByteBuffer.allocate(127);
+ channel.read(buffer);
+ buffer.flip();
+ var header = PMTiles.bytesToHeader(buffer, "1");
+ assertEquals(header.rootDirectoryOffset(), 127);
+ assertEquals(header.rootDirectoryLength(), 25);
+ assertEquals(header.jsonMetadataOffset(), 152);
+ assertEquals(header.jsonMetadataLength(), 247);
+ assertEquals(header.leafDirectoryOffset(), 0);
+ assertEquals(header.leafDirectoryLength(), 0);
+ assertEquals(header.tileDataOffset(), 399);
+ assertEquals(header.tileDataLength(), 69);
+ assertEquals(header.numAddressedTiles(), 1);
+ assertEquals(header.numTileEntries(), 1);
+ assertEquals(header.numTileContents(), 1);
+ assertFalse(header.clustered());
+ assertEquals(header.internalCompression(), Compression.Gzip);
+ assertEquals(header.tileCompression(), Compression.Gzip);
+ assertEquals(header.tileType(), TileType.Mvt);
+ assertEquals(header.minZoom(), 0);
+ assertEquals(header.maxZoom(), 0);
+ assertEquals(header.minLon(), 0);
+ assertEquals(header.minLat(), 0);
+ assertEquals(Math.round(header.maxLon()), 1);
+ assertEquals(Math.round(header.maxLat()), 1);
}
+ }
- @Test
- void headerToBytes() throws IOException {
- var etag = "1";
- var buffer = ByteBuffer.allocate(127);
- var header = new PMTiles.Header(
- 127,
- 25,
- 152,
- 247,
- 0,
- 0,
- 399,
- 69,
- 1,
- 1,
- 1,
- 10,
- false,
- Compression.Gzip,
- Compression.Gzip,
- TileType.Mvt,
- 0,
- 0,
- 0,
- 1,
- 1,
- 0,
- 0,
- 0,
- 0,
- etag);
- PMTiles.headerToBytes(header, buffer);
- var header2 = PMTiles.bytesToHeader(buffer, etag);
- assertEquals(header, header2);
- }
+ @Test
+ void headerToBytes() throws IOException {
+ var etag = "1";
+ var buffer = ByteBuffer.allocate(127);
+ var header = new PMTiles.Header(
+ 127,
+ 25,
+ 152,
+ 247,
+ 0,
+ 0,
+ 399,
+ 69,
+ 1,
+ 1,
+ 1,
+ 10,
+ false,
+ Compression.Gzip,
+ Compression.Gzip,
+ TileType.Mvt,
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ etag);
+ PMTiles.headerToBytes(header, buffer);
+ var header2 = PMTiles.bytesToHeader(buffer, etag);
+ assertEquals(header, header2);
+ }
-}
\ No newline at end of file
+}