From e3cf293078dc4fd878dd4358ab4e74ee78611c5b Mon Sep 17 00:00:00 2001 From: Mike Barry Date: Sun, 25 Apr 2021 07:42:13 -0400 Subject: [PATCH] vector tile encoder --- scripts/generate-protobuf.sh | 4 + .../com/onthegomap/flatmap/Arguments.java | 1 + .../com/onthegomap/flatmap/LayerFeature.java | 15 + .../com/onthegomap/flatmap/MbtilesWriter.java | 17 +- .../onthegomap/flatmap/RenderedFeature.java | 2 +- .../com/onthegomap/flatmap/VectorTile.java | 8 - .../onthegomap/flatmap/VectorTileEncoder.java | 538 ++ .../collections/MergeSortFeatureMap.java | 51 +- .../flatmap/{ => geo}/GeoUtils.java | 15 +- .../com/onthegomap/flatmap/geo/TileCoord.java | 97 + .../flatmap/reader/NaturalEarthReader.java | 2 +- .../flatmap/reader/OpenStreetMapReader.java | 2 +- src/main/java/vector_tile/VectorTile.java | 5837 +++++++++++++++++ src/main/resources/vector_tile.proto | 79 + .../flatmap/VectorTileEncoderTest.java | 145 + .../collections/MergeSortFeatureMapTest.java | 32 + .../reader/NaturalEarthReaderTest.java | 2 +- .../flatmap/reader/ShapefileReaderTest.java | 2 +- 18 files changed, 6805 insertions(+), 44 deletions(-) create mode 100755 scripts/generate-protobuf.sh create mode 100644 src/main/java/com/onthegomap/flatmap/LayerFeature.java delete mode 100644 src/main/java/com/onthegomap/flatmap/VectorTile.java create mode 100644 src/main/java/com/onthegomap/flatmap/VectorTileEncoder.java rename src/main/java/com/onthegomap/flatmap/{ => geo}/GeoUtils.java (91%) create mode 100644 src/main/java/com/onthegomap/flatmap/geo/TileCoord.java create mode 100644 src/main/java/vector_tile/VectorTile.java create mode 100644 src/main/resources/vector_tile.proto create mode 100644 src/test/java/com/onthegomap/flatmap/VectorTileEncoderTest.java create mode 100644 src/test/java/com/onthegomap/flatmap/collections/MergeSortFeatureMapTest.java diff --git a/scripts/generate-protobuf.sh b/scripts/generate-protobuf.sh new file mode 100755 index 00000000..6c6aa6d5 --- /dev/null +++ b/scripts/generate-protobuf.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -ex + +protoc --java_out=src/main/java/ src/main/resources/vector_tile.proto diff --git a/src/main/java/com/onthegomap/flatmap/Arguments.java b/src/main/java/com/onthegomap/flatmap/Arguments.java index 746b67ed..257dea37 100644 --- a/src/main/java/com/onthegomap/flatmap/Arguments.java +++ b/src/main/java/com/onthegomap/flatmap/Arguments.java @@ -1,5 +1,6 @@ package com.onthegomap.flatmap; +import com.onthegomap.flatmap.geo.GeoUtils; import com.onthegomap.flatmap.monitoring.Stats; import java.io.File; import java.time.Duration; diff --git a/src/main/java/com/onthegomap/flatmap/LayerFeature.java b/src/main/java/com/onthegomap/flatmap/LayerFeature.java new file mode 100644 index 00000000..6d875700 --- /dev/null +++ b/src/main/java/com/onthegomap/flatmap/LayerFeature.java @@ -0,0 +1,15 @@ +package com.onthegomap.flatmap; + +import java.util.Map; + +public record LayerFeature( + boolean hasGroup, + long group, + int zorder, + Map attrs, + byte geomType, + int[] commands, + long id +) { + +} diff --git a/src/main/java/com/onthegomap/flatmap/MbtilesWriter.java b/src/main/java/com/onthegomap/flatmap/MbtilesWriter.java index c08e05fe..d256cf64 100644 --- a/src/main/java/com/onthegomap/flatmap/MbtilesWriter.java +++ b/src/main/java/com/onthegomap/flatmap/MbtilesWriter.java @@ -1,11 +1,8 @@ package com.onthegomap.flatmap; -import static com.onthegomap.flatmap.GeoUtils.x; -import static com.onthegomap.flatmap.GeoUtils.y; -import static com.onthegomap.flatmap.GeoUtils.z; - import com.onthegomap.flatmap.collections.MergeSortFeatureMap; import com.onthegomap.flatmap.collections.MergeSortFeatureMap.TileFeatures; +import com.onthegomap.flatmap.geo.TileCoord; import com.onthegomap.flatmap.monitoring.ProgressLoggers; import com.onthegomap.flatmap.monitoring.Stats; import com.onthegomap.flatmap.worker.Topology; @@ -32,7 +29,7 @@ public class MbtilesWriter { private static final Logger LOGGER = LoggerFactory.getLogger(MbtilesWriter.class); - private static record RenderedTile(int tile, byte[] contents) { + private static record RenderedTile(TileCoord tile, byte[] contents) { } @@ -65,25 +62,23 @@ public class MbtilesWriter { while ((tileFeatures = prev.get()) != null) { featuresProcessed.addAndGet(tileFeatures.getNumFeatures()); byte[] bytes, encoded; - int zoom = z(tileFeatures.getTileId()); if (tileFeatures.hasSameContents(last)) { bytes = lastBytes; encoded = lastEncoded; memoizedTiles.incrementAndGet(); } else { - VectorTile en = tileFeatures.getTile(); + VectorTileEncoder en = tileFeatures.getTile(); encoded = en.encode(); bytes = gzipCompress(encoded); last = tileFeatures; lastEncoded = encoded; lastBytes = bytes; if (encoded.length > 1_000_000) { - LOGGER.warn("Tile " + zoom + "/" + x(tileFeatures.getTileId()) + "/" + y(tileFeatures.getTileId()) + " " - + encoded.length / 1024 + "kb uncompressed"); + LOGGER.warn(tileFeatures.coord() + " " + encoded.length / 1024 + "kb uncompressed"); } } - stats.encodedTile(zoom, encoded.length); - next.accept(new RenderedTile(tileFeatures.getTileId(), bytes)); + stats.encodedTile(tileFeatures.coord().z(), encoded.length); + next.accept(new RenderedTile(tileFeatures.coord(), bytes)); } } diff --git a/src/main/java/com/onthegomap/flatmap/RenderedFeature.java b/src/main/java/com/onthegomap/flatmap/RenderedFeature.java index a4a1052d..de7d4504 100644 --- a/src/main/java/com/onthegomap/flatmap/RenderedFeature.java +++ b/src/main/java/com/onthegomap/flatmap/RenderedFeature.java @@ -1,5 +1,5 @@ package com.onthegomap.flatmap; -public class RenderedFeature { +public record RenderedFeature(long sort, byte[] value) { } diff --git a/src/main/java/com/onthegomap/flatmap/VectorTile.java b/src/main/java/com/onthegomap/flatmap/VectorTile.java deleted file mode 100644 index c0d26c37..00000000 --- a/src/main/java/com/onthegomap/flatmap/VectorTile.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.onthegomap.flatmap; - -public class VectorTile { - - public byte[] encode() { - return new byte[]{}; - } -} diff --git a/src/main/java/com/onthegomap/flatmap/VectorTileEncoder.java b/src/main/java/com/onthegomap/flatmap/VectorTileEncoder.java new file mode 100644 index 00000000..b5c5dff0 --- /dev/null +++ b/src/main/java/com/onthegomap/flatmap/VectorTileEncoder.java @@ -0,0 +1,538 @@ +/***************************************************************** + * 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 com.onthegomap.flatmap; + +import com.carrotsearch.hppc.DoubleArrayList; +import com.carrotsearch.hppc.IntArrayList; +import com.google.common.primitives.Ints; +import com.onthegomap.flatmap.geo.GeoUtils; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import org.locationtech.jts.algorithm.Orientation; +import org.locationtech.jts.geom.CoordinateSequence; +import org.locationtech.jts.geom.Geometry; +import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.LineString; +import org.locationtech.jts.geom.LinearRing; +import org.locationtech.jts.geom.MultiLineString; +import org.locationtech.jts.geom.MultiPoint; +import org.locationtech.jts.geom.MultiPolygon; +import org.locationtech.jts.geom.Point; +import org.locationtech.jts.geom.Polygon; +import org.locationtech.jts.geom.impl.CoordinateArraySequence; +import org.locationtech.jts.geom.impl.PackedCoordinateSequence; +import vector_tile.VectorTile; +import vector_tile.VectorTile.Tile.GeomType; + +/** + * This class is copied from https://github.com/ElectronicChartCentre/java-vector-tile/blob/master/src/main/java/no/ecc/vectortile/VectorTileEncoder.java + * and https://github.com/ElectronicChartCentre/java-vector-tile/blob/master/src/main/java/no/ecc/vectortile/VectorTileDecoder.java + * and modified. + *

+ * The modifications decouple geometry encoding from vector tile encoding so that encoded commands can be stored in the + * sorted feature map prior to encoding vector tiles. The internals are also refactored to improve performance by using + * hppc primitive collections. + */ +public class VectorTileEncoder { + + private static final int EXTENT = 4096; + private static final double SIZE = 256d; + private static final double SCALE = ((double) EXTENT) / SIZE; + private final Map layers = new LinkedHashMap<>(); + + public static int[] getCommands(Geometry input) { + var encoder = new CommandEncoder(); + encoder.accept(input); + return encoder.result.toArray(); + } + + public static VectorTile.Tile.GeomType toGeomType(Geometry geometry) { + if (geometry instanceof Point || geometry instanceof MultiPoint) { + return VectorTile.Tile.GeomType.POINT; + } else if (geometry instanceof LineString || geometry instanceof MultiLineString) { + return VectorTile.Tile.GeomType.LINESTRING; + } else if (geometry instanceof Polygon || geometry instanceof MultiPolygon) { + return VectorTile.Tile.GeomType.POLYGON; + } + return VectorTile.Tile.GeomType.UNKNOWN; + } + + private static CoordinateSequence toCs(DoubleArrayList seq) { + return new PackedCoordinateSequence.Double(seq.toArray(), 2, 0); + } + + private static int zigZagEncode(int n) { + // https://developers.google.com/protocol-buffers/docs/encoding#types + return (n << 1) ^ (n >> 31); + } + + private static int zigZagDecode(int n) { + // https://developers.google.com/protocol-buffers/docs/encoding#types + return ((n >> 1) ^ (-(n & 1))); + } + + public static Geometry decode(byte geomTypeByte, int[] commands) { + VectorTile.Tile.GeomType geomType = Objects.requireNonNull(VectorTile.Tile.GeomType.forNumber(geomTypeByte)); + GeometryFactory gf = GeoUtils.gf; + int x = 0; + int y = 0; + + List coordsList = new ArrayList<>(); + DoubleArrayList coords = null; + + int geometryCount = commands.length; + int length = 0; + int command = 0; + int i = 0; + while (i < geometryCount) { + + if (length <= 0) { + length = commands[i++]; + command = length & ((1 << 3) - 1); + length = length >> 3; + } + + if (length > 0) { + + if (command == Command.MOVE_TO.value) { + coords = new DoubleArrayList(); + coordsList.add(coords); + } else { + Objects.requireNonNull(coords); + } + + if (command == Command.CLOSE_PATH.value) { + if (geomType != VectorTile.Tile.GeomType.POINT && !coords.isEmpty()) { + coords.add(coords.get(0), coords.get(1)); + } + length--; + continue; + } + + int dx = commands[i++]; + int dy = commands[i++]; + + length--; + + dx = zigZagDecode(dx); + dy = zigZagDecode(dy); + + x = x + dx; + y = y + dy; + + coords.add(x / SCALE, y / SCALE); + } + + } + + Geometry geometry = null; + boolean outerCCW = false; + + switch (geomType) { + case LINESTRING: + List lineStrings = new ArrayList<>(coordsList.size()); + for (DoubleArrayList cs : coordsList) { + if (cs.size() <= 2) { + continue; + } + lineStrings.add(gf.createLineString(toCs(cs))); + } + if (lineStrings.size() == 1) { + geometry = lineStrings.get(0); + } else if (lineStrings.size() > 1) { + geometry = gf.createMultiLineString(lineStrings.toArray(new LineString[0])); + } + break; + case POINT: + CoordinateSequence cs = new PackedCoordinateSequence.Double(coordsList.size(), 2, 0); + for (int j = 0; j < coordsList.size(); j++) { + cs.setOrdinate(j, 0, coordsList.get(j).get(0)); + cs.setOrdinate(j, 1, coordsList.get(j).get(1)); + } + if (cs.size() == 1) { + geometry = gf.createPoint(cs); + } else if (cs.size() > 1) { + geometry = gf.createMultiPoint(cs); + } + break; + case POLYGON: + List> polygonRings = new ArrayList<>(); + List ringsForCurrentPolygon = new ArrayList<>(); + boolean first = true; + for (DoubleArrayList clist : coordsList) { + // skip hole with too few coordinates + if (ringsForCurrentPolygon.size() > 0 && clist.size() < 4) { + continue; + } + LinearRing ring = gf.createLinearRing(toCs(clist)); + boolean ccw = Orientation.isCCW(ring.getCoordinates()); + if (first) { + first = false; + outerCCW = ccw; + } + if (ccw == outerCCW) { + ringsForCurrentPolygon = new ArrayList<>(); + polygonRings.add(ringsForCurrentPolygon); + } + ringsForCurrentPolygon.add(ring); + } + List polygons = new ArrayList<>(); + for (List rings : polygonRings) { + LinearRing shell = rings.get(0); + LinearRing[] holes = rings.subList(1, rings.size()).toArray(new LinearRing[rings.size() - 1]); + polygons.add(gf.createPolygon(shell, holes)); + } + if (polygons.size() == 1) { + geometry = polygons.get(0); + } + if (polygons.size() > 1) { + geometry = gf.createMultiPolygon(GeometryFactory.toPolygonArray(polygons)); + } + break; + default: + break; + } + + if (geometry == null) { + geometry = gf.createGeometryCollection(new Geometry[0]); + } + + return geometry; + } + + public static List decode(byte[] encoded) throws IOException { + VectorTile.Tile tile = VectorTile.Tile.parseFrom(encoded); + List features = new ArrayList<>(); + for (VectorTile.Tile.Layer layer : tile.getLayersList()) { + String layerName = layer.getName(); + int extent = layer.getExtent(); + List keys = layer.getKeysList(); + List values = new ArrayList<>(); + + for (VectorTile.Tile.Value value : layer.getValuesList()) { + if (value.hasBoolValue()) { + values.add(value.getBoolValue()); + } else if (value.hasDoubleValue()) { + values.add(value.getDoubleValue()); + } else if (value.hasFloatValue()) { + values.add(value.getFloatValue()); + } else if (value.hasIntValue()) { + values.add(value.getIntValue()); + } else if (value.hasSintValue()) { + values.add(value.getSintValue()); + } else if (value.hasUintValue()) { + values.add(value.getUintValue()); + } else if (value.hasStringValue()) { + values.add(value.getStringValue()); + } else { + values.add(null); + } + } + + for (VectorTile.Tile.Feature feature : layer.getFeaturesList()) { + int tagsCount = feature.getTagsCount(); + Map attrs = new HashMap<>(tagsCount / 2); + int tagIdx = 0; + while (tagIdx < feature.getTagsCount()) { + String key = keys.get(feature.getTags(tagIdx++)); + Object value = values.get(feature.getTags(tagIdx++)); + attrs.put(key, value); + } + Geometry geometry = decode(feature.getType(), feature.getGeometryList()); + features.add(new DecodedFeature( + layerName, + extent, + geometry, + attrs, + feature.getId() + )); + } + } + return features; + } + + private static Geometry decode(GeomType type, List geometryList) { + return decode((byte) type.getNumber(), geometryList.stream().mapToInt(i -> i).toArray()); + } + + public VectorTileEncoder addLayerFeatures(String layerName, List features) { + if (features.isEmpty()) { + return this; + } + + Layer layer = layers.get(layerName); + if (layer == null) { + layer = new Layer(); + layers.put(layerName, layer); + } + + for (LayerFeature inFeature : features) { + if (inFeature.commands().length > 0) { + EncodedFeature outFeature = new EncodedFeature(inFeature); + + for (Map.Entry e : inFeature.attrs().entrySet()) { + // skip attribute without value + if (e.getValue() == null) { + continue; + } + outFeature.tags.add(layer.key(e.getKey())); + outFeature.tags.add(layer.value(e.getValue())); + } + + layer.encodedFeatures.add(outFeature); + } + } + return this; + } + + public byte[] encode() { + VectorTile.Tile.Builder tile = VectorTile.Tile.newBuilder(); + for (Map.Entry e : layers.entrySet()) { + String layerName = e.getKey(); + Layer layer = e.getValue(); + + VectorTile.Tile.Layer.Builder tileLayer = VectorTile.Tile.Layer.newBuilder(); + + tileLayer.setVersion(2); + tileLayer.setName(layerName); + + tileLayer.addAllKeys(layer.keys()); + + for (Object value : layer.values()) { + VectorTile.Tile.Value.Builder tileValue = VectorTile.Tile.Value.newBuilder(); + if (value instanceof String stringValue) { + tileValue.setStringValue(stringValue); + } else if (value instanceof Integer intValue) { + tileValue.setSintValue(intValue); + } else if (value instanceof Long longValue) { + tileValue.setSintValue(longValue); + } else if (value instanceof Float floatValue) { + tileValue.setFloatValue(floatValue); + } else if (value instanceof Double doubleValue) { + tileValue.setDoubleValue(doubleValue); + } else if (value instanceof Boolean booleanValue) { + tileValue.setBoolValue(booleanValue); + } else { + tileValue.setStringValue(value.toString()); + } + tileLayer.addValues(tileValue.build()); + } + + tileLayer.setExtent(EXTENT); + + for (EncodedFeature feature : layer.encodedFeatures) { + + VectorTile.Tile.Feature.Builder featureBuilder = VectorTile.Tile.Feature.newBuilder(); + + featureBuilder.addAllTags(Ints.asList(feature.tags.toArray())); + if (feature.id >= 0) { + featureBuilder.setId(feature.id); + } + + featureBuilder.setType(VectorTile.Tile.GeomType.forNumber(feature.geometryType)); + featureBuilder.addAllGeometry(Ints.asList(feature.geometry)); + tileLayer.addFeatures(featureBuilder.build()); + } + + tile.addLayers(tileLayer.build()); + } + return tile.build().toByteArray(); + } + + private enum Command { + MOVE_TO(1), + LINE_TO(2), + CLOSE_PATH(7); + final int value; + + Command(int value) { + this.value = value; + } + } + + private static class CommandEncoder { + + private final IntArrayList result = new IntArrayList(); + private int x = 0, y = 0; + + private static boolean shouldClosePath(Geometry geometry) { + return (geometry instanceof Polygon) || (geometry instanceof LinearRing); + } + + private static int commandAndLength(Command command, int repeat) { + return repeat << 3 | command.value; + } + + private void accept(Geometry geometry) { + if (geometry instanceof MultiLineString multiLineString) { + for (int i = 0; i < multiLineString.getNumGeometries(); i++) { + encode(((LineString) multiLineString.getGeometryN(i)).getCoordinateSequence(), false); + } + } else if (geometry instanceof Polygon polygon) { + LineString exteriorRing = polygon.getExteriorRing(); + encode(exteriorRing.getCoordinateSequence(), true); + + for (int i = 0; i < polygon.getNumInteriorRing(); i++) { + LineString interiorRing = polygon.getInteriorRingN(i); + encode(interiorRing.getCoordinateSequence(), true); + } + } else if (geometry instanceof MultiPolygon multiPolygon) { + for (int i = 0; i < multiPolygon.getNumGeometries(); i++) { + accept(multiPolygon.getGeometryN(i)); + } + } else if (geometry instanceof LineString lineString) { + encode(lineString.getCoordinateSequence(), shouldClosePath(geometry)); + } else if (geometry instanceof Point point) { + encode(point.getCoordinateSequence(), false); + } else { + encode(new CoordinateArraySequence(geometry.getCoordinates()), shouldClosePath(geometry), + geometry instanceof MultiPoint); + } + } + + private void encode(CoordinateSequence cs, boolean closePathAtEnd) { + encode(cs, closePathAtEnd, false); + } + + private void encode(CoordinateSequence cs, boolean closePathAtEnd, boolean multiPoint) { + + if (cs.size() == 0) { + throw new IllegalArgumentException("empty geometry"); + } + + int lineToIndex = 0; + int lineToLength = 0; + + for (int i = 0; i < cs.size(); i++) { + + double cx = cs.getX(i); + double cy = cs.getY(i); + + if (i == 0) { + result.add(commandAndLength(Command.MOVE_TO, multiPoint ? cs.size() : 1)); + } + + int _x = (int) Math.round(cx * SCALE); + int _y = (int) Math.round(cy * SCALE); + + // prevent point equal to the previous + if (i > 0 && _x == x && _y == y) { + lineToLength--; + continue; + } + + // prevent double closing + if (closePathAtEnd && cs.size() > 1 && i == (cs.size() - 1) && cs.getX(0) == cx && cs.getY(0) == cy) { + lineToLength--; + continue; + } + + // delta, then zigzag + result.add(zigZagEncode(_x - x)); + result.add(zigZagEncode(_y - y)); + + x = _x; + y = _y; + + if (i == 0 && cs.size() > 1 && !multiPoint) { + // can length be too long? + lineToIndex = result.size(); + lineToLength = cs.size() - 1; + result.add(commandAndLength(Command.LINE_TO, lineToLength)); + } + + } + + // update LineTo length + if (lineToIndex > 0) { + if (lineToLength == 0) { + // remove empty LineTo + result.remove(lineToIndex); + } else { + // update LineTo with new length + result.set(lineToIndex, commandAndLength(Command.LINE_TO, lineToLength)); + } + } + + if (closePathAtEnd) { + result.add(commandAndLength(Command.CLOSE_PATH, 1)); + } + } + } + + private static final record EncodedFeature(IntArrayList tags, long id, byte geometryType, int[] geometry) { + + EncodedFeature(LayerFeature in) { + this(new IntArrayList(), in.id(), in.geomType(), in.commands()); + } + } + + public static final record DecodedFeature( + String layerName, + int extent, + Geometry geometry, + Map attributes, + long id + ) { + + } + + private static final class Layer { + + private final List encodedFeatures = new ArrayList<>(); + private final Map keys = new LinkedHashMap<>(); + private final Map values = new LinkedHashMap<>(); + + public Integer key(String key) { + Integer i = keys.get(key); + if (i == null) { + i = keys.size(); + keys.put(key, i); + } + return i; + } + + public List keys() { + return new ArrayList<>(keys.keySet()); + } + + public List values() { + return new ArrayList<>(values.keySet()); + } + + public Integer value(Object value) { + Integer i = values.get(value); + if (i == null) { + i = values.size(); + values.put(value, i); + } + return i; + } + + @Override + public String toString() { + return "Layer{" + encodedFeatures.size() + "}"; + } + } +} diff --git a/src/main/java/com/onthegomap/flatmap/collections/MergeSortFeatureMap.java b/src/main/java/com/onthegomap/flatmap/collections/MergeSortFeatureMap.java index c67b0c4f..62ad2bae 100644 --- a/src/main/java/com/onthegomap/flatmap/collections/MergeSortFeatureMap.java +++ b/src/main/java/com/onthegomap/flatmap/collections/MergeSortFeatureMap.java @@ -1,24 +1,33 @@ package com.onthegomap.flatmap.collections; +import com.carrotsearch.hppc.LongArrayList; import com.onthegomap.flatmap.RenderedFeature; -import com.onthegomap.flatmap.VectorTile; +import com.onthegomap.flatmap.VectorTileEncoder; +import com.onthegomap.flatmap.geo.TileCoord; import com.onthegomap.flatmap.monitoring.Stats; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import java.util.function.Consumer; public class MergeSortFeatureMap implements Consumer { + private volatile boolean prepared = false; + public MergeSortFeatureMap(Path featureDb, Stats stats) { } public void sort() { + prepared = true; } @Override public void accept(RenderedFeature renderedFeature) { - + if (prepared) { + throw new IllegalStateException("Attempting to add feature but already prepared"); + } } public long getStorageSize() { @@ -26,25 +35,55 @@ public class MergeSortFeatureMap implements Consumer { } public Iterator getAll() { - return null; + if (!prepared) { + throw new IllegalStateException("Attempting to iterate over features but not prepared yet"); + } + return new Iterator<>() { + @Override + public boolean hasNext() { + return false; + } + + @Override + public TileFeatures next() { + return null; + } + }; } public static class TileFeatures { + private final TileCoord tile; + private final LongArrayList sortKeys = new LongArrayList(); + private final List entries = new ArrayList<>(); + + public TileFeatures(int tile) { + this.tile = TileCoord.decode(tile); + } + public long getNumFeatures() { return 0; } - public int getTileId() { - return 0; + public TileCoord coord() { + return tile; } public boolean hasSameContents(TileFeatures other) { return false; } - public VectorTile getTile() { + public VectorTileEncoder getTile() { return null; } + + @Override + public String toString() { + return "TileFeatures{" + + "tile=" + tile + + ", sortKeys=" + sortKeys + + ", entries=" + entries + + '}'; + } } } diff --git a/src/main/java/com/onthegomap/flatmap/GeoUtils.java b/src/main/java/com/onthegomap/flatmap/geo/GeoUtils.java similarity index 91% rename from src/main/java/com/onthegomap/flatmap/GeoUtils.java rename to src/main/java/com/onthegomap/flatmap/geo/GeoUtils.java index 29094d87..7dfdc0f1 100644 --- a/src/main/java/com/onthegomap/flatmap/GeoUtils.java +++ b/src/main/java/com/onthegomap/flatmap/geo/GeoUtils.java @@ -1,4 +1,4 @@ -package com.onthegomap.flatmap; +package com.onthegomap.flatmap.geo; import org.locationtech.jts.geom.CoordinateSequence; import org.locationtech.jts.geom.Geometry; @@ -88,17 +88,4 @@ public class GeoUtils { long y = (long) (worldY * QUANTIZED_WORLD_SIZE); return (x << 32) | y; } - - public static int z(int key) { - int result = key >> 28; - return result < 0 ? 16 + result : result; - } - - public static int x(int key) { - return (key >> 14) & ((1 << 14) - 1); - } - - public static int y(int key) { - return (key) & ((1 << 14) - 1); - } } diff --git a/src/main/java/com/onthegomap/flatmap/geo/TileCoord.java b/src/main/java/com/onthegomap/flatmap/geo/TileCoord.java new file mode 100644 index 00000000..02dff642 --- /dev/null +++ b/src/main/java/com/onthegomap/flatmap/geo/TileCoord.java @@ -0,0 +1,97 @@ +package com.onthegomap.flatmap.geo; + +public class TileCoord { + + private final int encoded; + private final int x; + private final int y; + private final int z; + + private TileCoord(int encoded, int x, int y, int z) { + this.encoded = encoded; + this.x = x; + this.y = y; + this.z = z; + } + + public static TileCoord of(int x, int y, int z) { + return new TileCoord(encode(x, y, z), x, y, z); + } + + public static TileCoord decode(int encoded) { + return new TileCoord(encoded, decodeX(encoded), decodeY(encoded), decodeZ(encoded)); + } + + public int encoded() { + return encoded; + } + + public int x() { + return x; + } + + public int y() { + return y; + } + + public int z() { + return z; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + TileCoord tileCoord = (TileCoord) o; + + return encoded == tileCoord.encoded; + } + + @Override + public int hashCode() { + return encoded; + } + + public static int decodeZ(int key) { + int result = key >> 28; + return result < 0 ? 16 + result : result; + } + + public static int decodeX(int key) { + return (key >> 14) & ((1 << 14) - 1); + } + + public static int decodeY(int key) { + return (key) & ((1 << 14) - 1); + } + + private static int encode(int x, int y, int z) { + int max = 1 << z; + if (x >= max) { + x %= max; + } + if (x < 0) { + x += max; + } + if (y < 0) { + y = 0; + } + if (y >= max) { + y = max; + } + return (z << 28) | (x << 14) | y; + } + + @Override + public String toString() { + return "TileCoord{" + + z + "/" + x + "/" + y + + ", encoded=" + encoded + + '}'; + } +} diff --git a/src/main/java/com/onthegomap/flatmap/reader/NaturalEarthReader.java b/src/main/java/com/onthegomap/flatmap/reader/NaturalEarthReader.java index c3c37803..3b41cc74 100644 --- a/src/main/java/com/onthegomap/flatmap/reader/NaturalEarthReader.java +++ b/src/main/java/com/onthegomap/flatmap/reader/NaturalEarthReader.java @@ -1,7 +1,7 @@ package com.onthegomap.flatmap.reader; -import com.onthegomap.flatmap.GeoUtils; import com.onthegomap.flatmap.SourceFeature; +import com.onthegomap.flatmap.geo.GeoUtils; import com.onthegomap.flatmap.monitoring.Stats; import com.onthegomap.flatmap.worker.Topology.SourceStep; import java.io.File; diff --git a/src/main/java/com/onthegomap/flatmap/reader/OpenStreetMapReader.java b/src/main/java/com/onthegomap/flatmap/reader/OpenStreetMapReader.java index 5e8a0eed..f42143b4 100644 --- a/src/main/java/com/onthegomap/flatmap/reader/OpenStreetMapReader.java +++ b/src/main/java/com/onthegomap/flatmap/reader/OpenStreetMapReader.java @@ -10,7 +10,6 @@ import com.graphhopper.reader.ReaderRelation; import com.graphhopper.reader.ReaderWay; import com.onthegomap.flatmap.FeatureRenderer; import com.onthegomap.flatmap.FlatMapConfig; -import com.onthegomap.flatmap.GeoUtils; import com.onthegomap.flatmap.OsmInputFile; import com.onthegomap.flatmap.Profile; import com.onthegomap.flatmap.RenderableFeature; @@ -20,6 +19,7 @@ import com.onthegomap.flatmap.SourceFeature; import com.onthegomap.flatmap.collections.LongLongMap; import com.onthegomap.flatmap.collections.LongLongMultimap; import com.onthegomap.flatmap.collections.MergeSortFeatureMap; +import com.onthegomap.flatmap.geo.GeoUtils; import com.onthegomap.flatmap.monitoring.ProgressLoggers; import com.onthegomap.flatmap.monitoring.Stats; import com.onthegomap.flatmap.worker.Topology; diff --git a/src/main/java/vector_tile/VectorTile.java b/src/main/java/vector_tile/VectorTile.java new file mode 100644 index 00000000..991a122d --- /dev/null +++ b/src/main/java/vector_tile/VectorTile.java @@ -0,0 +1,5837 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: src/main/resources/vector_tile.proto + +package vector_tile; + +public final class VectorTile { + private VectorTile() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface TileOrBuilder extends + // @@protoc_insertion_point(interface_extends:vector_tile.Tile) + com.google.protobuf.GeneratedMessageV3. + ExtendableMessageOrBuilder { + + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + java.util.List + getLayersList(); + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + vector_tile.VectorTile.Tile.Layer getLayers(int index); + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + int getLayersCount(); + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + java.util.List + getLayersOrBuilderList(); + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + vector_tile.VectorTile.Tile.LayerOrBuilder getLayersOrBuilder( + int index); + } + /** + * Protobuf type {@code vector_tile.Tile} + */ + public static final class Tile extends + com.google.protobuf.GeneratedMessageV3.ExtendableMessage< + Tile> implements + // @@protoc_insertion_point(message_implements:vector_tile.Tile) + TileOrBuilder { + private static final long serialVersionUID = 0L; + // Use Tile.newBuilder() to construct. + private Tile(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder builder) { + super(builder); + } + private Tile() { + layers_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Tile(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Tile( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 26: { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + layers_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + layers_.add( + input.readMessage(vector_tile.VectorTile.Tile.Layer.PARSER, extensionRegistry)); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + layers_ = java.util.Collections.unmodifiableList(layers_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return vector_tile.VectorTile.internal_static_vector_tile_Tile_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return vector_tile.VectorTile.internal_static_vector_tile_Tile_fieldAccessorTable + .ensureFieldAccessorsInitialized( + vector_tile.VectorTile.Tile.class, vector_tile.VectorTile.Tile.Builder.class); + } + + /** + *
+     * GeomType is described in section 4.3.4 of the specification
+     * 
+ * + * Protobuf enum {@code vector_tile.Tile.GeomType} + */ + public enum GeomType + implements com.google.protobuf.ProtocolMessageEnum { + /** + * UNKNOWN = 0; + */ + UNKNOWN(0), + /** + * POINT = 1; + */ + POINT(1), + /** + * LINESTRING = 2; + */ + LINESTRING(2), + /** + * POLYGON = 3; + */ + POLYGON(3), + ; + + /** + * UNKNOWN = 0; + */ + public static final int UNKNOWN_VALUE = 0; + /** + * POINT = 1; + */ + public static final int POINT_VALUE = 1; + /** + * LINESTRING = 2; + */ + public static final int LINESTRING_VALUE = 2; + /** + * POLYGON = 3; + */ + public static final int POLYGON_VALUE = 3; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static GeomType valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static GeomType forNumber(int value) { + switch (value) { + case 0: return UNKNOWN; + case 1: return POINT; + case 2: return LINESTRING; + case 3: return POLYGON; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + GeomType> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public GeomType findValueByNumber(int number) { + return GeomType.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return vector_tile.VectorTile.Tile.getDescriptor().getEnumTypes().get(0); + } + + private static final GeomType[] VALUES = values(); + + public static GeomType valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private GeomType(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:vector_tile.Tile.GeomType) + } + + public interface ValueOrBuilder extends + // @@protoc_insertion_point(interface_extends:vector_tile.Tile.Value) + com.google.protobuf.GeneratedMessageV3. + ExtendableMessageOrBuilder { + + /** + *
+       * Exactly one of these values must be present in a valid message
+       * 
+ * + * optional string string_value = 1; + * @return Whether the stringValue field is set. + */ + boolean hasStringValue(); + /** + *
+       * Exactly one of these values must be present in a valid message
+       * 
+ * + * optional string string_value = 1; + * @return The stringValue. + */ + java.lang.String getStringValue(); + /** + *
+       * Exactly one of these values must be present in a valid message
+       * 
+ * + * optional string string_value = 1; + * @return The bytes for stringValue. + */ + com.google.protobuf.ByteString + getStringValueBytes(); + + /** + * optional float float_value = 2; + * @return Whether the floatValue field is set. + */ + boolean hasFloatValue(); + /** + * optional float float_value = 2; + * @return The floatValue. + */ + float getFloatValue(); + + /** + * optional double double_value = 3; + * @return Whether the doubleValue field is set. + */ + boolean hasDoubleValue(); + /** + * optional double double_value = 3; + * @return The doubleValue. + */ + double getDoubleValue(); + + /** + * optional int64 int_value = 4; + * @return Whether the intValue field is set. + */ + boolean hasIntValue(); + /** + * optional int64 int_value = 4; + * @return The intValue. + */ + long getIntValue(); + + /** + * optional uint64 uint_value = 5; + * @return Whether the uintValue field is set. + */ + boolean hasUintValue(); + /** + * optional uint64 uint_value = 5; + * @return The uintValue. + */ + long getUintValue(); + + /** + * optional sint64 sint_value = 6; + * @return Whether the sintValue field is set. + */ + boolean hasSintValue(); + /** + * optional sint64 sint_value = 6; + * @return The sintValue. + */ + long getSintValue(); + + /** + * optional bool bool_value = 7; + * @return Whether the boolValue field is set. + */ + boolean hasBoolValue(); + /** + * optional bool bool_value = 7; + * @return The boolValue. + */ + boolean getBoolValue(); + } + /** + *
+     * Variant type encoding
+     * The use of values is described in section 4.1 of the specification
+     * 
+ * + * Protobuf type {@code vector_tile.Tile.Value} + */ + public static final class Value extends + com.google.protobuf.GeneratedMessageV3.ExtendableMessage< + Value> implements + // @@protoc_insertion_point(message_implements:vector_tile.Tile.Value) + ValueOrBuilder { + private static final long serialVersionUID = 0L; + // Use Value.newBuilder() to construct. + private Value(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder builder) { + super(builder); + } + private Value() { + stringValue_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Value(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Value( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + stringValue_ = bs; + break; + } + case 21: { + bitField0_ |= 0x00000002; + floatValue_ = input.readFloat(); + break; + } + case 25: { + bitField0_ |= 0x00000004; + doubleValue_ = input.readDouble(); + break; + } + case 32: { + bitField0_ |= 0x00000008; + intValue_ = input.readInt64(); + break; + } + case 40: { + bitField0_ |= 0x00000010; + uintValue_ = input.readUInt64(); + break; + } + case 48: { + bitField0_ |= 0x00000020; + sintValue_ = input.readSInt64(); + break; + } + case 56: { + bitField0_ |= 0x00000040; + boolValue_ = input.readBool(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return vector_tile.VectorTile.internal_static_vector_tile_Tile_Value_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return vector_tile.VectorTile.internal_static_vector_tile_Tile_Value_fieldAccessorTable + .ensureFieldAccessorsInitialized( + vector_tile.VectorTile.Tile.Value.class, vector_tile.VectorTile.Tile.Value.Builder.class); + } + + private int bitField0_; + public static final int STRING_VALUE_FIELD_NUMBER = 1; + private volatile java.lang.Object stringValue_; + /** + *
+       * Exactly one of these values must be present in a valid message
+       * 
+ * + * optional string string_value = 1; + * @return Whether the stringValue field is set. + */ + @java.lang.Override + public boolean hasStringValue() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
+       * Exactly one of these values must be present in a valid message
+       * 
+ * + * optional string string_value = 1; + * @return The stringValue. + */ + @java.lang.Override + public java.lang.String getStringValue() { + java.lang.Object ref = stringValue_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + stringValue_ = s; + } + return s; + } + } + /** + *
+       * Exactly one of these values must be present in a valid message
+       * 
+ * + * optional string string_value = 1; + * @return The bytes for stringValue. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getStringValueBytes() { + java.lang.Object ref = stringValue_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + stringValue_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int FLOAT_VALUE_FIELD_NUMBER = 2; + private float floatValue_; + /** + * optional float float_value = 2; + * @return Whether the floatValue field is set. + */ + @java.lang.Override + public boolean hasFloatValue() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional float float_value = 2; + * @return The floatValue. + */ + @java.lang.Override + public float getFloatValue() { + return floatValue_; + } + + public static final int DOUBLE_VALUE_FIELD_NUMBER = 3; + private double doubleValue_; + /** + * optional double double_value = 3; + * @return Whether the doubleValue field is set. + */ + @java.lang.Override + public boolean hasDoubleValue() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * optional double double_value = 3; + * @return The doubleValue. + */ + @java.lang.Override + public double getDoubleValue() { + return doubleValue_; + } + + public static final int INT_VALUE_FIELD_NUMBER = 4; + private long intValue_; + /** + * optional int64 int_value = 4; + * @return Whether the intValue field is set. + */ + @java.lang.Override + public boolean hasIntValue() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + * optional int64 int_value = 4; + * @return The intValue. + */ + @java.lang.Override + public long getIntValue() { + return intValue_; + } + + public static final int UINT_VALUE_FIELD_NUMBER = 5; + private long uintValue_; + /** + * optional uint64 uint_value = 5; + * @return Whether the uintValue field is set. + */ + @java.lang.Override + public boolean hasUintValue() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + * optional uint64 uint_value = 5; + * @return The uintValue. + */ + @java.lang.Override + public long getUintValue() { + return uintValue_; + } + + public static final int SINT_VALUE_FIELD_NUMBER = 6; + private long sintValue_; + /** + * optional sint64 sint_value = 6; + * @return Whether the sintValue field is set. + */ + @java.lang.Override + public boolean hasSintValue() { + return ((bitField0_ & 0x00000020) != 0); + } + /** + * optional sint64 sint_value = 6; + * @return The sintValue. + */ + @java.lang.Override + public long getSintValue() { + return sintValue_; + } + + public static final int BOOL_VALUE_FIELD_NUMBER = 7; + private boolean boolValue_; + /** + * optional bool bool_value = 7; + * @return Whether the boolValue field is set. + */ + @java.lang.Override + public boolean hasBoolValue() { + return ((bitField0_ & 0x00000040) != 0); + } + /** + * optional bool bool_value = 7; + * @return The boolValue. + */ + @java.lang.Override + public boolean getBoolValue() { + return boolValue_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!extensionsAreInitialized()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + com.google.protobuf.GeneratedMessageV3 + .ExtendableMessage.ExtensionWriter + extensionWriter = newExtensionWriter(); + if (((bitField0_ & 0x00000001) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, stringValue_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeFloat(2, floatValue_); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeDouble(3, doubleValue_); + } + if (((bitField0_ & 0x00000008) != 0)) { + output.writeInt64(4, intValue_); + } + if (((bitField0_ & 0x00000010) != 0)) { + output.writeUInt64(5, uintValue_); + } + if (((bitField0_ & 0x00000020) != 0)) { + output.writeSInt64(6, sintValue_); + } + if (((bitField0_ & 0x00000040) != 0)) { + output.writeBool(7, boolValue_); + } + extensionWriter.writeUntil(536870912, output); + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, stringValue_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeFloatSize(2, floatValue_); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(3, doubleValue_); + } + if (((bitField0_ & 0x00000008) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeInt64Size(4, intValue_); + } + if (((bitField0_ & 0x00000010) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(5, uintValue_); + } + if (((bitField0_ & 0x00000020) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeSInt64Size(6, sintValue_); + } + if (((bitField0_ & 0x00000040) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(7, boolValue_); + } + size += extensionsSerializedSize(); + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof vector_tile.VectorTile.Tile.Value)) { + return super.equals(obj); + } + vector_tile.VectorTile.Tile.Value other = (vector_tile.VectorTile.Tile.Value) obj; + + if (hasStringValue() != other.hasStringValue()) return false; + if (hasStringValue()) { + if (!getStringValue() + .equals(other.getStringValue())) return false; + } + if (hasFloatValue() != other.hasFloatValue()) return false; + if (hasFloatValue()) { + if (java.lang.Float.floatToIntBits(getFloatValue()) + != java.lang.Float.floatToIntBits( + other.getFloatValue())) return false; + } + if (hasDoubleValue() != other.hasDoubleValue()) return false; + if (hasDoubleValue()) { + if (java.lang.Double.doubleToLongBits(getDoubleValue()) + != java.lang.Double.doubleToLongBits( + other.getDoubleValue())) return false; + } + if (hasIntValue() != other.hasIntValue()) return false; + if (hasIntValue()) { + if (getIntValue() + != other.getIntValue()) return false; + } + if (hasUintValue() != other.hasUintValue()) return false; + if (hasUintValue()) { + if (getUintValue() + != other.getUintValue()) return false; + } + if (hasSintValue() != other.hasSintValue()) return false; + if (hasSintValue()) { + if (getSintValue() + != other.getSintValue()) return false; + } + if (hasBoolValue() != other.hasBoolValue()) return false; + if (hasBoolValue()) { + if (getBoolValue() + != other.getBoolValue()) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + if (!getExtensionFields().equals(other.getExtensionFields())) + return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasStringValue()) { + hash = (37 * hash) + STRING_VALUE_FIELD_NUMBER; + hash = (53 * hash) + getStringValue().hashCode(); + } + if (hasFloatValue()) { + hash = (37 * hash) + FLOAT_VALUE_FIELD_NUMBER; + hash = (53 * hash) + java.lang.Float.floatToIntBits( + getFloatValue()); + } + if (hasDoubleValue()) { + hash = (37 * hash) + DOUBLE_VALUE_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + java.lang.Double.doubleToLongBits(getDoubleValue())); + } + if (hasIntValue()) { + hash = (37 * hash) + INT_VALUE_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getIntValue()); + } + if (hasUintValue()) { + hash = (37 * hash) + UINT_VALUE_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getUintValue()); + } + if (hasSintValue()) { + hash = (37 * hash) + SINT_VALUE_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getSintValue()); + } + if (hasBoolValue()) { + hash = (37 * hash) + BOOL_VALUE_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getBoolValue()); + } + hash = hashFields(hash, getExtensionFields()); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static vector_tile.VectorTile.Tile.Value parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static vector_tile.VectorTile.Tile.Value parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static vector_tile.VectorTile.Tile.Value parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static vector_tile.VectorTile.Tile.Value parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static vector_tile.VectorTile.Tile.Value parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static vector_tile.VectorTile.Tile.Value parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static vector_tile.VectorTile.Tile.Value parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static vector_tile.VectorTile.Tile.Value parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static vector_tile.VectorTile.Tile.Value parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static vector_tile.VectorTile.Tile.Value parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static vector_tile.VectorTile.Tile.Value parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static vector_tile.VectorTile.Tile.Value parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(vector_tile.VectorTile.Tile.Value prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
+       * Variant type encoding
+       * The use of values is described in section 4.1 of the specification
+       * 
+ * + * Protobuf type {@code vector_tile.Tile.Value} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.ExtendableBuilder< + vector_tile.VectorTile.Tile.Value, Builder> implements + // @@protoc_insertion_point(builder_implements:vector_tile.Tile.Value) + vector_tile.VectorTile.Tile.ValueOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return vector_tile.VectorTile.internal_static_vector_tile_Tile_Value_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return vector_tile.VectorTile.internal_static_vector_tile_Tile_Value_fieldAccessorTable + .ensureFieldAccessorsInitialized( + vector_tile.VectorTile.Tile.Value.class, vector_tile.VectorTile.Tile.Value.Builder.class); + } + + // Construct using vector_tile.VectorTile.Tile.Value.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + stringValue_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + floatValue_ = 0F; + bitField0_ = (bitField0_ & ~0x00000002); + doubleValue_ = 0D; + bitField0_ = (bitField0_ & ~0x00000004); + intValue_ = 0L; + bitField0_ = (bitField0_ & ~0x00000008); + uintValue_ = 0L; + bitField0_ = (bitField0_ & ~0x00000010); + sintValue_ = 0L; + bitField0_ = (bitField0_ & ~0x00000020); + boolValue_ = false; + bitField0_ = (bitField0_ & ~0x00000040); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return vector_tile.VectorTile.internal_static_vector_tile_Tile_Value_descriptor; + } + + @java.lang.Override + public vector_tile.VectorTile.Tile.Value getDefaultInstanceForType() { + return vector_tile.VectorTile.Tile.Value.getDefaultInstance(); + } + + @java.lang.Override + public vector_tile.VectorTile.Tile.Value build() { + vector_tile.VectorTile.Tile.Value result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public vector_tile.VectorTile.Tile.Value buildPartial() { + vector_tile.VectorTile.Tile.Value result = new vector_tile.VectorTile.Tile.Value(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.stringValue_ = stringValue_; + if (((from_bitField0_ & 0x00000002) != 0)) { + result.floatValue_ = floatValue_; + to_bitField0_ |= 0x00000002; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.doubleValue_ = doubleValue_; + to_bitField0_ |= 0x00000004; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.intValue_ = intValue_; + to_bitField0_ |= 0x00000008; + } + if (((from_bitField0_ & 0x00000010) != 0)) { + result.uintValue_ = uintValue_; + to_bitField0_ |= 0x00000010; + } + if (((from_bitField0_ & 0x00000020) != 0)) { + result.sintValue_ = sintValue_; + to_bitField0_ |= 0x00000020; + } + if (((from_bitField0_ & 0x00000040) != 0)) { + result.boolValue_ = boolValue_; + to_bitField0_ |= 0x00000040; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder setExtension( + com.google.protobuf.GeneratedMessage.GeneratedExtension< + vector_tile.VectorTile.Tile.Value, Type> extension, + Type value) { + return super.setExtension(extension, value); + } + @java.lang.Override + public Builder setExtension( + com.google.protobuf.GeneratedMessage.GeneratedExtension< + vector_tile.VectorTile.Tile.Value, java.util.List> extension, + int index, Type value) { + return super.setExtension(extension, index, value); + } + @java.lang.Override + public Builder addExtension( + com.google.protobuf.GeneratedMessage.GeneratedExtension< + vector_tile.VectorTile.Tile.Value, java.util.List> extension, + Type value) { + return super.addExtension(extension, value); + } + @java.lang.Override + public Builder clearExtension( + com.google.protobuf.GeneratedMessage.GeneratedExtension< + vector_tile.VectorTile.Tile.Value, ?> extension) { + return super.clearExtension(extension); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof vector_tile.VectorTile.Tile.Value) { + return mergeFrom((vector_tile.VectorTile.Tile.Value)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(vector_tile.VectorTile.Tile.Value other) { + if (other == vector_tile.VectorTile.Tile.Value.getDefaultInstance()) return this; + if (other.hasStringValue()) { + bitField0_ |= 0x00000001; + stringValue_ = other.stringValue_; + onChanged(); + } + if (other.hasFloatValue()) { + setFloatValue(other.getFloatValue()); + } + if (other.hasDoubleValue()) { + setDoubleValue(other.getDoubleValue()); + } + if (other.hasIntValue()) { + setIntValue(other.getIntValue()); + } + if (other.hasUintValue()) { + setUintValue(other.getUintValue()); + } + if (other.hasSintValue()) { + setSintValue(other.getSintValue()); + } + if (other.hasBoolValue()) { + setBoolValue(other.getBoolValue()); + } + this.mergeExtensionFields(other); + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!extensionsAreInitialized()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + vector_tile.VectorTile.Tile.Value parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (vector_tile.VectorTile.Tile.Value) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.lang.Object stringValue_ = ""; + /** + *
+         * Exactly one of these values must be present in a valid message
+         * 
+ * + * optional string string_value = 1; + * @return Whether the stringValue field is set. + */ + public boolean hasStringValue() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
+         * Exactly one of these values must be present in a valid message
+         * 
+ * + * optional string string_value = 1; + * @return The stringValue. + */ + public java.lang.String getStringValue() { + java.lang.Object ref = stringValue_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + stringValue_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+         * Exactly one of these values must be present in a valid message
+         * 
+ * + * optional string string_value = 1; + * @return The bytes for stringValue. + */ + public com.google.protobuf.ByteString + getStringValueBytes() { + java.lang.Object ref = stringValue_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + stringValue_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+         * Exactly one of these values must be present in a valid message
+         * 
+ * + * optional string string_value = 1; + * @param value The stringValue to set. + * @return This builder for chaining. + */ + public Builder setStringValue( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + stringValue_ = value; + onChanged(); + return this; + } + /** + *
+         * Exactly one of these values must be present in a valid message
+         * 
+ * + * optional string string_value = 1; + * @return This builder for chaining. + */ + public Builder clearStringValue() { + bitField0_ = (bitField0_ & ~0x00000001); + stringValue_ = getDefaultInstance().getStringValue(); + onChanged(); + return this; + } + /** + *
+         * Exactly one of these values must be present in a valid message
+         * 
+ * + * optional string string_value = 1; + * @param value The bytes for stringValue to set. + * @return This builder for chaining. + */ + public Builder setStringValueBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + stringValue_ = value; + onChanged(); + return this; + } + + private float floatValue_ ; + /** + * optional float float_value = 2; + * @return Whether the floatValue field is set. + */ + @java.lang.Override + public boolean hasFloatValue() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional float float_value = 2; + * @return The floatValue. + */ + @java.lang.Override + public float getFloatValue() { + return floatValue_; + } + /** + * optional float float_value = 2; + * @param value The floatValue to set. + * @return This builder for chaining. + */ + public Builder setFloatValue(float value) { + bitField0_ |= 0x00000002; + floatValue_ = value; + onChanged(); + return this; + } + /** + * optional float float_value = 2; + * @return This builder for chaining. + */ + public Builder clearFloatValue() { + bitField0_ = (bitField0_ & ~0x00000002); + floatValue_ = 0F; + onChanged(); + return this; + } + + private double doubleValue_ ; + /** + * optional double double_value = 3; + * @return Whether the doubleValue field is set. + */ + @java.lang.Override + public boolean hasDoubleValue() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * optional double double_value = 3; + * @return The doubleValue. + */ + @java.lang.Override + public double getDoubleValue() { + return doubleValue_; + } + /** + * optional double double_value = 3; + * @param value The doubleValue to set. + * @return This builder for chaining. + */ + public Builder setDoubleValue(double value) { + bitField0_ |= 0x00000004; + doubleValue_ = value; + onChanged(); + return this; + } + /** + * optional double double_value = 3; + * @return This builder for chaining. + */ + public Builder clearDoubleValue() { + bitField0_ = (bitField0_ & ~0x00000004); + doubleValue_ = 0D; + onChanged(); + return this; + } + + private long intValue_ ; + /** + * optional int64 int_value = 4; + * @return Whether the intValue field is set. + */ + @java.lang.Override + public boolean hasIntValue() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + * optional int64 int_value = 4; + * @return The intValue. + */ + @java.lang.Override + public long getIntValue() { + return intValue_; + } + /** + * optional int64 int_value = 4; + * @param value The intValue to set. + * @return This builder for chaining. + */ + public Builder setIntValue(long value) { + bitField0_ |= 0x00000008; + intValue_ = value; + onChanged(); + return this; + } + /** + * optional int64 int_value = 4; + * @return This builder for chaining. + */ + public Builder clearIntValue() { + bitField0_ = (bitField0_ & ~0x00000008); + intValue_ = 0L; + onChanged(); + return this; + } + + private long uintValue_ ; + /** + * optional uint64 uint_value = 5; + * @return Whether the uintValue field is set. + */ + @java.lang.Override + public boolean hasUintValue() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + * optional uint64 uint_value = 5; + * @return The uintValue. + */ + @java.lang.Override + public long getUintValue() { + return uintValue_; + } + /** + * optional uint64 uint_value = 5; + * @param value The uintValue to set. + * @return This builder for chaining. + */ + public Builder setUintValue(long value) { + bitField0_ |= 0x00000010; + uintValue_ = value; + onChanged(); + return this; + } + /** + * optional uint64 uint_value = 5; + * @return This builder for chaining. + */ + public Builder clearUintValue() { + bitField0_ = (bitField0_ & ~0x00000010); + uintValue_ = 0L; + onChanged(); + return this; + } + + private long sintValue_ ; + /** + * optional sint64 sint_value = 6; + * @return Whether the sintValue field is set. + */ + @java.lang.Override + public boolean hasSintValue() { + return ((bitField0_ & 0x00000020) != 0); + } + /** + * optional sint64 sint_value = 6; + * @return The sintValue. + */ + @java.lang.Override + public long getSintValue() { + return sintValue_; + } + /** + * optional sint64 sint_value = 6; + * @param value The sintValue to set. + * @return This builder for chaining. + */ + public Builder setSintValue(long value) { + bitField0_ |= 0x00000020; + sintValue_ = value; + onChanged(); + return this; + } + /** + * optional sint64 sint_value = 6; + * @return This builder for chaining. + */ + public Builder clearSintValue() { + bitField0_ = (bitField0_ & ~0x00000020); + sintValue_ = 0L; + onChanged(); + return this; + } + + private boolean boolValue_ ; + /** + * optional bool bool_value = 7; + * @return Whether the boolValue field is set. + */ + @java.lang.Override + public boolean hasBoolValue() { + return ((bitField0_ & 0x00000040) != 0); + } + /** + * optional bool bool_value = 7; + * @return The boolValue. + */ + @java.lang.Override + public boolean getBoolValue() { + return boolValue_; + } + /** + * optional bool bool_value = 7; + * @param value The boolValue to set. + * @return This builder for chaining. + */ + public Builder setBoolValue(boolean value) { + bitField0_ |= 0x00000040; + boolValue_ = value; + onChanged(); + return this; + } + /** + * optional bool bool_value = 7; + * @return This builder for chaining. + */ + public Builder clearBoolValue() { + bitField0_ = (bitField0_ & ~0x00000040); + boolValue_ = false; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:vector_tile.Tile.Value) + } + + // @@protoc_insertion_point(class_scope:vector_tile.Tile.Value) + private static final vector_tile.VectorTile.Tile.Value DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new vector_tile.VectorTile.Tile.Value(); + } + + public static vector_tile.VectorTile.Tile.Value getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Value parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Value(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public vector_tile.VectorTile.Tile.Value getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface FeatureOrBuilder extends + // @@protoc_insertion_point(interface_extends:vector_tile.Tile.Feature) + com.google.protobuf.MessageOrBuilder { + + /** + * optional uint64 id = 1 [default = 0]; + * @return Whether the id field is set. + */ + boolean hasId(); + /** + * optional uint64 id = 1 [default = 0]; + * @return The id. + */ + long getId(); + + /** + *
+       * Tags of this feature are encoded as repeated pairs of
+       * integers.
+       * A detailed description of tags is located in sections
+       * 4.2 and 4.4 of the specification
+       * 
+ * + * repeated uint32 tags = 2 [packed = true]; + * @return A list containing the tags. + */ + java.util.List getTagsList(); + /** + *
+       * Tags of this feature are encoded as repeated pairs of
+       * integers.
+       * A detailed description of tags is located in sections
+       * 4.2 and 4.4 of the specification
+       * 
+ * + * repeated uint32 tags = 2 [packed = true]; + * @return The count of tags. + */ + int getTagsCount(); + /** + *
+       * Tags of this feature are encoded as repeated pairs of
+       * integers.
+       * A detailed description of tags is located in sections
+       * 4.2 and 4.4 of the specification
+       * 
+ * + * repeated uint32 tags = 2 [packed = true]; + * @param index The index of the element to return. + * @return The tags at the given index. + */ + int getTags(int index); + + /** + *
+       * The type of geometry stored in this feature.
+       * 
+ * + * optional .vector_tile.Tile.GeomType type = 3 [default = UNKNOWN]; + * @return Whether the type field is set. + */ + boolean hasType(); + /** + *
+       * The type of geometry stored in this feature.
+       * 
+ * + * optional .vector_tile.Tile.GeomType type = 3 [default = UNKNOWN]; + * @return The type. + */ + vector_tile.VectorTile.Tile.GeomType getType(); + + /** + *
+       * Contains a stream of commands and parameters (vertices).
+       * A detailed description on geometry encoding is located in
+       * section 4.3 of the specification.
+       * 
+ * + * repeated uint32 geometry = 4 [packed = true]; + * @return A list containing the geometry. + */ + java.util.List getGeometryList(); + /** + *
+       * Contains a stream of commands and parameters (vertices).
+       * A detailed description on geometry encoding is located in
+       * section 4.3 of the specification.
+       * 
+ * + * repeated uint32 geometry = 4 [packed = true]; + * @return The count of geometry. + */ + int getGeometryCount(); + /** + *
+       * Contains a stream of commands and parameters (vertices).
+       * A detailed description on geometry encoding is located in
+       * section 4.3 of the specification.
+       * 
+ * + * repeated uint32 geometry = 4 [packed = true]; + * @param index The index of the element to return. + * @return The geometry at the given index. + */ + int getGeometry(int index); + } + /** + *
+     * Features are described in section 4.2 of the specification
+     * 
+ * + * Protobuf type {@code vector_tile.Tile.Feature} + */ + public static final class Feature extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:vector_tile.Tile.Feature) + FeatureOrBuilder { + private static final long serialVersionUID = 0L; + // Use Feature.newBuilder() to construct. + private Feature(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Feature() { + tags_ = emptyIntList(); + type_ = 0; + geometry_ = emptyIntList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Feature(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Feature( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + bitField0_ |= 0x00000001; + id_ = input.readUInt64(); + break; + } + case 16: { + if (!((mutable_bitField0_ & 0x00000002) != 0)) { + tags_ = newIntList(); + mutable_bitField0_ |= 0x00000002; + } + tags_.addInt(input.readUInt32()); + break; + } + case 18: { + int length = input.readRawVarint32(); + int limit = input.pushLimit(length); + if (!((mutable_bitField0_ & 0x00000002) != 0) && input.getBytesUntilLimit() > 0) { + tags_ = newIntList(); + mutable_bitField0_ |= 0x00000002; + } + while (input.getBytesUntilLimit() > 0) { + tags_.addInt(input.readUInt32()); + } + input.popLimit(limit); + break; + } + case 24: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + vector_tile.VectorTile.Tile.GeomType value = vector_tile.VectorTile.Tile.GeomType.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(3, rawValue); + } else { + bitField0_ |= 0x00000002; + type_ = rawValue; + } + break; + } + case 32: { + if (!((mutable_bitField0_ & 0x00000008) != 0)) { + geometry_ = newIntList(); + mutable_bitField0_ |= 0x00000008; + } + geometry_.addInt(input.readUInt32()); + break; + } + case 34: { + int length = input.readRawVarint32(); + int limit = input.pushLimit(length); + if (!((mutable_bitField0_ & 0x00000008) != 0) && input.getBytesUntilLimit() > 0) { + geometry_ = newIntList(); + mutable_bitField0_ |= 0x00000008; + } + while (input.getBytesUntilLimit() > 0) { + geometry_.addInt(input.readUInt32()); + } + input.popLimit(limit); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000002) != 0)) { + tags_.makeImmutable(); // C + } + if (((mutable_bitField0_ & 0x00000008) != 0)) { + geometry_.makeImmutable(); // C + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return vector_tile.VectorTile.internal_static_vector_tile_Tile_Feature_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return vector_tile.VectorTile.internal_static_vector_tile_Tile_Feature_fieldAccessorTable + .ensureFieldAccessorsInitialized( + vector_tile.VectorTile.Tile.Feature.class, vector_tile.VectorTile.Tile.Feature.Builder.class); + } + + private int bitField0_; + public static final int ID_FIELD_NUMBER = 1; + private long id_; + /** + * optional uint64 id = 1 [default = 0]; + * @return Whether the id field is set. + */ + @java.lang.Override + public boolean hasId() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * optional uint64 id = 1 [default = 0]; + * @return The id. + */ + @java.lang.Override + public long getId() { + return id_; + } + + public static final int TAGS_FIELD_NUMBER = 2; + private com.google.protobuf.Internal.IntList tags_; + /** + *
+       * Tags of this feature are encoded as repeated pairs of
+       * integers.
+       * A detailed description of tags is located in sections
+       * 4.2 and 4.4 of the specification
+       * 
+ * + * repeated uint32 tags = 2 [packed = true]; + * @return A list containing the tags. + */ + @java.lang.Override + public java.util.List + getTagsList() { + return tags_; + } + /** + *
+       * Tags of this feature are encoded as repeated pairs of
+       * integers.
+       * A detailed description of tags is located in sections
+       * 4.2 and 4.4 of the specification
+       * 
+ * + * repeated uint32 tags = 2 [packed = true]; + * @return The count of tags. + */ + public int getTagsCount() { + return tags_.size(); + } + /** + *
+       * Tags of this feature are encoded as repeated pairs of
+       * integers.
+       * A detailed description of tags is located in sections
+       * 4.2 and 4.4 of the specification
+       * 
+ * + * repeated uint32 tags = 2 [packed = true]; + * @param index The index of the element to return. + * @return The tags at the given index. + */ + public int getTags(int index) { + return tags_.getInt(index); + } + private int tagsMemoizedSerializedSize = -1; + + public static final int TYPE_FIELD_NUMBER = 3; + private int type_; + /** + *
+       * The type of geometry stored in this feature.
+       * 
+ * + * optional .vector_tile.Tile.GeomType type = 3 [default = UNKNOWN]; + * @return Whether the type field is set. + */ + @java.lang.Override public boolean hasType() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
+       * The type of geometry stored in this feature.
+       * 
+ * + * optional .vector_tile.Tile.GeomType type = 3 [default = UNKNOWN]; + * @return The type. + */ + @java.lang.Override public vector_tile.VectorTile.Tile.GeomType getType() { + @SuppressWarnings("deprecation") + vector_tile.VectorTile.Tile.GeomType result = vector_tile.VectorTile.Tile.GeomType.valueOf(type_); + return result == null ? vector_tile.VectorTile.Tile.GeomType.UNKNOWN : result; + } + + public static final int GEOMETRY_FIELD_NUMBER = 4; + private com.google.protobuf.Internal.IntList geometry_; + /** + *
+       * Contains a stream of commands and parameters (vertices).
+       * A detailed description on geometry encoding is located in
+       * section 4.3 of the specification.
+       * 
+ * + * repeated uint32 geometry = 4 [packed = true]; + * @return A list containing the geometry. + */ + @java.lang.Override + public java.util.List + getGeometryList() { + return geometry_; + } + /** + *
+       * Contains a stream of commands and parameters (vertices).
+       * A detailed description on geometry encoding is located in
+       * section 4.3 of the specification.
+       * 
+ * + * repeated uint32 geometry = 4 [packed = true]; + * @return The count of geometry. + */ + public int getGeometryCount() { + return geometry_.size(); + } + /** + *
+       * Contains a stream of commands and parameters (vertices).
+       * A detailed description on geometry encoding is located in
+       * section 4.3 of the specification.
+       * 
+ * + * repeated uint32 geometry = 4 [packed = true]; + * @param index The index of the element to return. + * @return The geometry at the given index. + */ + public int getGeometry(int index) { + return geometry_.getInt(index); + } + private int geometryMemoizedSerializedSize = -1; + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) != 0)) { + output.writeUInt64(1, id_); + } + if (getTagsList().size() > 0) { + output.writeUInt32NoTag(18); + output.writeUInt32NoTag(tagsMemoizedSerializedSize); + } + for (int i = 0; i < tags_.size(); i++) { + output.writeUInt32NoTag(tags_.getInt(i)); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeEnum(3, type_); + } + if (getGeometryList().size() > 0) { + output.writeUInt32NoTag(34); + output.writeUInt32NoTag(geometryMemoizedSerializedSize); + } + for (int i = 0; i < geometry_.size(); i++) { + output.writeUInt32NoTag(geometry_.getInt(i)); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(1, id_); + } + { + int dataSize = 0; + for (int i = 0; i < tags_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeUInt32SizeNoTag(tags_.getInt(i)); + } + size += dataSize; + if (!getTagsList().isEmpty()) { + size += 1; + size += com.google.protobuf.CodedOutputStream + .computeInt32SizeNoTag(dataSize); + } + tagsMemoizedSerializedSize = dataSize; + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(3, type_); + } + { + int dataSize = 0; + for (int i = 0; i < geometry_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeUInt32SizeNoTag(geometry_.getInt(i)); + } + size += dataSize; + if (!getGeometryList().isEmpty()) { + size += 1; + size += com.google.protobuf.CodedOutputStream + .computeInt32SizeNoTag(dataSize); + } + geometryMemoizedSerializedSize = dataSize; + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof vector_tile.VectorTile.Tile.Feature)) { + return super.equals(obj); + } + vector_tile.VectorTile.Tile.Feature other = (vector_tile.VectorTile.Tile.Feature) obj; + + if (hasId() != other.hasId()) return false; + if (hasId()) { + if (getId() + != other.getId()) return false; + } + if (!getTagsList() + .equals(other.getTagsList())) return false; + if (hasType() != other.hasType()) return false; + if (hasType()) { + if (type_ != other.type_) return false; + } + if (!getGeometryList() + .equals(other.getGeometryList())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasId()) { + hash = (37 * hash) + ID_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getId()); + } + if (getTagsCount() > 0) { + hash = (37 * hash) + TAGS_FIELD_NUMBER; + hash = (53 * hash) + getTagsList().hashCode(); + } + if (hasType()) { + hash = (37 * hash) + TYPE_FIELD_NUMBER; + hash = (53 * hash) + type_; + } + if (getGeometryCount() > 0) { + hash = (37 * hash) + GEOMETRY_FIELD_NUMBER; + hash = (53 * hash) + getGeometryList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static vector_tile.VectorTile.Tile.Feature parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static vector_tile.VectorTile.Tile.Feature parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static vector_tile.VectorTile.Tile.Feature parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static vector_tile.VectorTile.Tile.Feature parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static vector_tile.VectorTile.Tile.Feature parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static vector_tile.VectorTile.Tile.Feature parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static vector_tile.VectorTile.Tile.Feature parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static vector_tile.VectorTile.Tile.Feature parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static vector_tile.VectorTile.Tile.Feature parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static vector_tile.VectorTile.Tile.Feature parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static vector_tile.VectorTile.Tile.Feature parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static vector_tile.VectorTile.Tile.Feature parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(vector_tile.VectorTile.Tile.Feature prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
+       * Features are described in section 4.2 of the specification
+       * 
+ * + * Protobuf type {@code vector_tile.Tile.Feature} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:vector_tile.Tile.Feature) + vector_tile.VectorTile.Tile.FeatureOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return vector_tile.VectorTile.internal_static_vector_tile_Tile_Feature_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return vector_tile.VectorTile.internal_static_vector_tile_Tile_Feature_fieldAccessorTable + .ensureFieldAccessorsInitialized( + vector_tile.VectorTile.Tile.Feature.class, vector_tile.VectorTile.Tile.Feature.Builder.class); + } + + // Construct using vector_tile.VectorTile.Tile.Feature.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + id_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + tags_ = emptyIntList(); + bitField0_ = (bitField0_ & ~0x00000002); + type_ = 0; + bitField0_ = (bitField0_ & ~0x00000004); + geometry_ = emptyIntList(); + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return vector_tile.VectorTile.internal_static_vector_tile_Tile_Feature_descriptor; + } + + @java.lang.Override + public vector_tile.VectorTile.Tile.Feature getDefaultInstanceForType() { + return vector_tile.VectorTile.Tile.Feature.getDefaultInstance(); + } + + @java.lang.Override + public vector_tile.VectorTile.Tile.Feature build() { + vector_tile.VectorTile.Tile.Feature result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public vector_tile.VectorTile.Tile.Feature buildPartial() { + vector_tile.VectorTile.Tile.Feature result = new vector_tile.VectorTile.Tile.Feature(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.id_ = id_; + to_bitField0_ |= 0x00000001; + } + if (((bitField0_ & 0x00000002) != 0)) { + tags_.makeImmutable(); + bitField0_ = (bitField0_ & ~0x00000002); + } + result.tags_ = tags_; + if (((from_bitField0_ & 0x00000004) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.type_ = type_; + if (((bitField0_ & 0x00000008) != 0)) { + geometry_.makeImmutable(); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.geometry_ = geometry_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof vector_tile.VectorTile.Tile.Feature) { + return mergeFrom((vector_tile.VectorTile.Tile.Feature)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(vector_tile.VectorTile.Tile.Feature other) { + if (other == vector_tile.VectorTile.Tile.Feature.getDefaultInstance()) return this; + if (other.hasId()) { + setId(other.getId()); + } + if (!other.tags_.isEmpty()) { + if (tags_.isEmpty()) { + tags_ = other.tags_; + bitField0_ = (bitField0_ & ~0x00000002); + } else { + ensureTagsIsMutable(); + tags_.addAll(other.tags_); + } + onChanged(); + } + if (other.hasType()) { + setType(other.getType()); + } + if (!other.geometry_.isEmpty()) { + if (geometry_.isEmpty()) { + geometry_ = other.geometry_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensureGeometryIsMutable(); + geometry_.addAll(other.geometry_); + } + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + vector_tile.VectorTile.Tile.Feature parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (vector_tile.VectorTile.Tile.Feature) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private long id_ ; + /** + * optional uint64 id = 1 [default = 0]; + * @return Whether the id field is set. + */ + @java.lang.Override + public boolean hasId() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * optional uint64 id = 1 [default = 0]; + * @return The id. + */ + @java.lang.Override + public long getId() { + return id_; + } + /** + * optional uint64 id = 1 [default = 0]; + * @param value The id to set. + * @return This builder for chaining. + */ + public Builder setId(long value) { + bitField0_ |= 0x00000001; + id_ = value; + onChanged(); + return this; + } + /** + * optional uint64 id = 1 [default = 0]; + * @return This builder for chaining. + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000001); + id_ = 0L; + onChanged(); + return this; + } + + private com.google.protobuf.Internal.IntList tags_ = emptyIntList(); + private void ensureTagsIsMutable() { + if (!((bitField0_ & 0x00000002) != 0)) { + tags_ = mutableCopy(tags_); + bitField0_ |= 0x00000002; + } + } + /** + *
+         * Tags of this feature are encoded as repeated pairs of
+         * integers.
+         * A detailed description of tags is located in sections
+         * 4.2 and 4.4 of the specification
+         * 
+ * + * repeated uint32 tags = 2 [packed = true]; + * @return A list containing the tags. + */ + public java.util.List + getTagsList() { + return ((bitField0_ & 0x00000002) != 0) ? + java.util.Collections.unmodifiableList(tags_) : tags_; + } + /** + *
+         * Tags of this feature are encoded as repeated pairs of
+         * integers.
+         * A detailed description of tags is located in sections
+         * 4.2 and 4.4 of the specification
+         * 
+ * + * repeated uint32 tags = 2 [packed = true]; + * @return The count of tags. + */ + public int getTagsCount() { + return tags_.size(); + } + /** + *
+         * Tags of this feature are encoded as repeated pairs of
+         * integers.
+         * A detailed description of tags is located in sections
+         * 4.2 and 4.4 of the specification
+         * 
+ * + * repeated uint32 tags = 2 [packed = true]; + * @param index The index of the element to return. + * @return The tags at the given index. + */ + public int getTags(int index) { + return tags_.getInt(index); + } + /** + *
+         * Tags of this feature are encoded as repeated pairs of
+         * integers.
+         * A detailed description of tags is located in sections
+         * 4.2 and 4.4 of the specification
+         * 
+ * + * repeated uint32 tags = 2 [packed = true]; + * @param index The index to set the value at. + * @param value The tags to set. + * @return This builder for chaining. + */ + public Builder setTags( + int index, int value) { + ensureTagsIsMutable(); + tags_.setInt(index, value); + onChanged(); + return this; + } + /** + *
+         * Tags of this feature are encoded as repeated pairs of
+         * integers.
+         * A detailed description of tags is located in sections
+         * 4.2 and 4.4 of the specification
+         * 
+ * + * repeated uint32 tags = 2 [packed = true]; + * @param value The tags to add. + * @return This builder for chaining. + */ + public Builder addTags(int value) { + ensureTagsIsMutable(); + tags_.addInt(value); + onChanged(); + return this; + } + /** + *
+         * Tags of this feature are encoded as repeated pairs of
+         * integers.
+         * A detailed description of tags is located in sections
+         * 4.2 and 4.4 of the specification
+         * 
+ * + * repeated uint32 tags = 2 [packed = true]; + * @param values The tags to add. + * @return This builder for chaining. + */ + public Builder addAllTags( + java.lang.Iterable values) { + ensureTagsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, tags_); + onChanged(); + return this; + } + /** + *
+         * Tags of this feature are encoded as repeated pairs of
+         * integers.
+         * A detailed description of tags is located in sections
+         * 4.2 and 4.4 of the specification
+         * 
+ * + * repeated uint32 tags = 2 [packed = true]; + * @return This builder for chaining. + */ + public Builder clearTags() { + tags_ = emptyIntList(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + return this; + } + + private int type_ = 0; + /** + *
+         * The type of geometry stored in this feature.
+         * 
+ * + * optional .vector_tile.Tile.GeomType type = 3 [default = UNKNOWN]; + * @return Whether the type field is set. + */ + @java.lang.Override public boolean hasType() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
+         * The type of geometry stored in this feature.
+         * 
+ * + * optional .vector_tile.Tile.GeomType type = 3 [default = UNKNOWN]; + * @return The type. + */ + @java.lang.Override + public vector_tile.VectorTile.Tile.GeomType getType() { + @SuppressWarnings("deprecation") + vector_tile.VectorTile.Tile.GeomType result = vector_tile.VectorTile.Tile.GeomType.valueOf(type_); + return result == null ? vector_tile.VectorTile.Tile.GeomType.UNKNOWN : result; + } + /** + *
+         * The type of geometry stored in this feature.
+         * 
+ * + * optional .vector_tile.Tile.GeomType type = 3 [default = UNKNOWN]; + * @param value The type to set. + * @return This builder for chaining. + */ + public Builder setType(vector_tile.VectorTile.Tile.GeomType value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + type_ = value.getNumber(); + onChanged(); + return this; + } + /** + *
+         * The type of geometry stored in this feature.
+         * 
+ * + * optional .vector_tile.Tile.GeomType type = 3 [default = UNKNOWN]; + * @return This builder for chaining. + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000004); + type_ = 0; + onChanged(); + return this; + } + + private com.google.protobuf.Internal.IntList geometry_ = emptyIntList(); + private void ensureGeometryIsMutable() { + if (!((bitField0_ & 0x00000008) != 0)) { + geometry_ = mutableCopy(geometry_); + bitField0_ |= 0x00000008; + } + } + /** + *
+         * Contains a stream of commands and parameters (vertices).
+         * A detailed description on geometry encoding is located in
+         * section 4.3 of the specification.
+         * 
+ * + * repeated uint32 geometry = 4 [packed = true]; + * @return A list containing the geometry. + */ + public java.util.List + getGeometryList() { + return ((bitField0_ & 0x00000008) != 0) ? + java.util.Collections.unmodifiableList(geometry_) : geometry_; + } + /** + *
+         * Contains a stream of commands and parameters (vertices).
+         * A detailed description on geometry encoding is located in
+         * section 4.3 of the specification.
+         * 
+ * + * repeated uint32 geometry = 4 [packed = true]; + * @return The count of geometry. + */ + public int getGeometryCount() { + return geometry_.size(); + } + /** + *
+         * Contains a stream of commands and parameters (vertices).
+         * A detailed description on geometry encoding is located in
+         * section 4.3 of the specification.
+         * 
+ * + * repeated uint32 geometry = 4 [packed = true]; + * @param index The index of the element to return. + * @return The geometry at the given index. + */ + public int getGeometry(int index) { + return geometry_.getInt(index); + } + /** + *
+         * Contains a stream of commands and parameters (vertices).
+         * A detailed description on geometry encoding is located in
+         * section 4.3 of the specification.
+         * 
+ * + * repeated uint32 geometry = 4 [packed = true]; + * @param index The index to set the value at. + * @param value The geometry to set. + * @return This builder for chaining. + */ + public Builder setGeometry( + int index, int value) { + ensureGeometryIsMutable(); + geometry_.setInt(index, value); + onChanged(); + return this; + } + /** + *
+         * Contains a stream of commands and parameters (vertices).
+         * A detailed description on geometry encoding is located in
+         * section 4.3 of the specification.
+         * 
+ * + * repeated uint32 geometry = 4 [packed = true]; + * @param value The geometry to add. + * @return This builder for chaining. + */ + public Builder addGeometry(int value) { + ensureGeometryIsMutable(); + geometry_.addInt(value); + onChanged(); + return this; + } + /** + *
+         * Contains a stream of commands and parameters (vertices).
+         * A detailed description on geometry encoding is located in
+         * section 4.3 of the specification.
+         * 
+ * + * repeated uint32 geometry = 4 [packed = true]; + * @param values The geometry to add. + * @return This builder for chaining. + */ + public Builder addAllGeometry( + java.lang.Iterable values) { + ensureGeometryIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, geometry_); + onChanged(); + return this; + } + /** + *
+         * Contains a stream of commands and parameters (vertices).
+         * A detailed description on geometry encoding is located in
+         * section 4.3 of the specification.
+         * 
+ * + * repeated uint32 geometry = 4 [packed = true]; + * @return This builder for chaining. + */ + public Builder clearGeometry() { + geometry_ = emptyIntList(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:vector_tile.Tile.Feature) + } + + // @@protoc_insertion_point(class_scope:vector_tile.Tile.Feature) + private static final vector_tile.VectorTile.Tile.Feature DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new vector_tile.VectorTile.Tile.Feature(); + } + + public static vector_tile.VectorTile.Tile.Feature getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Feature parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Feature(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public vector_tile.VectorTile.Tile.Feature getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface LayerOrBuilder extends + // @@protoc_insertion_point(interface_extends:vector_tile.Tile.Layer) + com.google.protobuf.GeneratedMessageV3. + ExtendableMessageOrBuilder { + + /** + *
+       * Any compliant implementation must first read the version
+       * number encoded in this message and choose the correct
+       * implementation for this version number before proceeding to
+       * decode other parts of this message.
+       * 
+ * + * required uint32 version = 15 [default = 1]; + * @return Whether the version field is set. + */ + boolean hasVersion(); + /** + *
+       * Any compliant implementation must first read the version
+       * number encoded in this message and choose the correct
+       * implementation for this version number before proceeding to
+       * decode other parts of this message.
+       * 
+ * + * required uint32 version = 15 [default = 1]; + * @return The version. + */ + int getVersion(); + + /** + * required string name = 1; + * @return Whether the name field is set. + */ + boolean hasName(); + /** + * required string name = 1; + * @return The name. + */ + java.lang.String getName(); + /** + * required string name = 1; + * @return The bytes for name. + */ + com.google.protobuf.ByteString + getNameBytes(); + + /** + *
+       * The actual features in this tile.
+       * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + java.util.List + getFeaturesList(); + /** + *
+       * The actual features in this tile.
+       * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + vector_tile.VectorTile.Tile.Feature getFeatures(int index); + /** + *
+       * The actual features in this tile.
+       * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + int getFeaturesCount(); + /** + *
+       * The actual features in this tile.
+       * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + java.util.List + getFeaturesOrBuilderList(); + /** + *
+       * The actual features in this tile.
+       * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + vector_tile.VectorTile.Tile.FeatureOrBuilder getFeaturesOrBuilder( + int index); + + /** + *
+       * Dictionary encoding for keys
+       * 
+ * + * repeated string keys = 3; + * @return A list containing the keys. + */ + java.util.List + getKeysList(); + /** + *
+       * Dictionary encoding for keys
+       * 
+ * + * repeated string keys = 3; + * @return The count of keys. + */ + int getKeysCount(); + /** + *
+       * Dictionary encoding for keys
+       * 
+ * + * repeated string keys = 3; + * @param index The index of the element to return. + * @return The keys at the given index. + */ + java.lang.String getKeys(int index); + /** + *
+       * Dictionary encoding for keys
+       * 
+ * + * repeated string keys = 3; + * @param index The index of the value to return. + * @return The bytes of the keys at the given index. + */ + com.google.protobuf.ByteString + getKeysBytes(int index); + + /** + *
+       * Dictionary encoding for values
+       * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + java.util.List + getValuesList(); + /** + *
+       * Dictionary encoding for values
+       * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + vector_tile.VectorTile.Tile.Value getValues(int index); + /** + *
+       * Dictionary encoding for values
+       * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + int getValuesCount(); + /** + *
+       * Dictionary encoding for values
+       * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + java.util.List + getValuesOrBuilderList(); + /** + *
+       * Dictionary encoding for values
+       * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + vector_tile.VectorTile.Tile.ValueOrBuilder getValuesOrBuilder( + int index); + + /** + *
+       * Although this is an "optional" field it is required by the specification.
+       * See https://github.com/mapbox/vector-tile-spec/issues/47
+       * 
+ * + * optional uint32 extent = 5 [default = 4096]; + * @return Whether the extent field is set. + */ + boolean hasExtent(); + /** + *
+       * Although this is an "optional" field it is required by the specification.
+       * See https://github.com/mapbox/vector-tile-spec/issues/47
+       * 
+ * + * optional uint32 extent = 5 [default = 4096]; + * @return The extent. + */ + int getExtent(); + } + /** + *
+     * Layers are described in section 4.1 of the specification
+     * 
+ * + * Protobuf type {@code vector_tile.Tile.Layer} + */ + public static final class Layer extends + com.google.protobuf.GeneratedMessageV3.ExtendableMessage< + Layer> implements + // @@protoc_insertion_point(message_implements:vector_tile.Tile.Layer) + LayerOrBuilder { + private static final long serialVersionUID = 0L; + // Use Layer.newBuilder() to construct. + private Layer(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder builder) { + super(builder); + } + private Layer() { + version_ = 1; + name_ = ""; + features_ = java.util.Collections.emptyList(); + keys_ = com.google.protobuf.LazyStringArrayList.EMPTY; + values_ = java.util.Collections.emptyList(); + extent_ = 4096; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Layer(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Layer( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000002; + name_ = bs; + break; + } + case 18: { + if (!((mutable_bitField0_ & 0x00000004) != 0)) { + features_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000004; + } + features_.add( + input.readMessage(vector_tile.VectorTile.Tile.Feature.PARSER, extensionRegistry)); + break; + } + case 26: { + com.google.protobuf.ByteString bs = input.readBytes(); + if (!((mutable_bitField0_ & 0x00000008) != 0)) { + keys_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000008; + } + keys_.add(bs); + break; + } + case 34: { + if (!((mutable_bitField0_ & 0x00000010) != 0)) { + values_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000010; + } + values_.add( + input.readMessage(vector_tile.VectorTile.Tile.Value.PARSER, extensionRegistry)); + break; + } + case 40: { + bitField0_ |= 0x00000004; + extent_ = input.readUInt32(); + break; + } + case 120: { + bitField0_ |= 0x00000001; + version_ = input.readUInt32(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000004) != 0)) { + features_ = java.util.Collections.unmodifiableList(features_); + } + if (((mutable_bitField0_ & 0x00000008) != 0)) { + keys_ = keys_.getUnmodifiableView(); + } + if (((mutable_bitField0_ & 0x00000010) != 0)) { + values_ = java.util.Collections.unmodifiableList(values_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return vector_tile.VectorTile.internal_static_vector_tile_Tile_Layer_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return vector_tile.VectorTile.internal_static_vector_tile_Tile_Layer_fieldAccessorTable + .ensureFieldAccessorsInitialized( + vector_tile.VectorTile.Tile.Layer.class, vector_tile.VectorTile.Tile.Layer.Builder.class); + } + + private int bitField0_; + public static final int VERSION_FIELD_NUMBER = 15; + private int version_; + /** + *
+       * Any compliant implementation must first read the version
+       * number encoded in this message and choose the correct
+       * implementation for this version number before proceeding to
+       * decode other parts of this message.
+       * 
+ * + * required uint32 version = 15 [default = 1]; + * @return Whether the version field is set. + */ + @java.lang.Override + public boolean hasVersion() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
+       * Any compliant implementation must first read the version
+       * number encoded in this message and choose the correct
+       * implementation for this version number before proceeding to
+       * decode other parts of this message.
+       * 
+ * + * required uint32 version = 15 [default = 1]; + * @return The version. + */ + @java.lang.Override + public int getVersion() { + return version_; + } + + public static final int NAME_FIELD_NUMBER = 1; + private volatile java.lang.Object name_; + /** + * required string name = 1; + * @return Whether the name field is set. + */ + @java.lang.Override + public boolean hasName() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * required string name = 1; + * @return The name. + */ + @java.lang.Override + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + /** + * required string name = 1; + * @return The bytes for name. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int FEATURES_FIELD_NUMBER = 2; + private java.util.List features_; + /** + *
+       * The actual features in this tile.
+       * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + @java.lang.Override + public java.util.List getFeaturesList() { + return features_; + } + /** + *
+       * The actual features in this tile.
+       * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + @java.lang.Override + public java.util.List + getFeaturesOrBuilderList() { + return features_; + } + /** + *
+       * The actual features in this tile.
+       * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + @java.lang.Override + public int getFeaturesCount() { + return features_.size(); + } + /** + *
+       * The actual features in this tile.
+       * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + @java.lang.Override + public vector_tile.VectorTile.Tile.Feature getFeatures(int index) { + return features_.get(index); + } + /** + *
+       * The actual features in this tile.
+       * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + @java.lang.Override + public vector_tile.VectorTile.Tile.FeatureOrBuilder getFeaturesOrBuilder( + int index) { + return features_.get(index); + } + + public static final int KEYS_FIELD_NUMBER = 3; + private com.google.protobuf.LazyStringList keys_; + /** + *
+       * Dictionary encoding for keys
+       * 
+ * + * repeated string keys = 3; + * @return A list containing the keys. + */ + public com.google.protobuf.ProtocolStringList + getKeysList() { + return keys_; + } + /** + *
+       * Dictionary encoding for keys
+       * 
+ * + * repeated string keys = 3; + * @return The count of keys. + */ + public int getKeysCount() { + return keys_.size(); + } + /** + *
+       * Dictionary encoding for keys
+       * 
+ * + * repeated string keys = 3; + * @param index The index of the element to return. + * @return The keys at the given index. + */ + public java.lang.String getKeys(int index) { + return keys_.get(index); + } + /** + *
+       * Dictionary encoding for keys
+       * 
+ * + * repeated string keys = 3; + * @param index The index of the value to return. + * @return The bytes of the keys at the given index. + */ + public com.google.protobuf.ByteString + getKeysBytes(int index) { + return keys_.getByteString(index); + } + + public static final int VALUES_FIELD_NUMBER = 4; + private java.util.List values_; + /** + *
+       * Dictionary encoding for values
+       * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + @java.lang.Override + public java.util.List getValuesList() { + return values_; + } + /** + *
+       * Dictionary encoding for values
+       * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + @java.lang.Override + public java.util.List + getValuesOrBuilderList() { + return values_; + } + /** + *
+       * Dictionary encoding for values
+       * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + @java.lang.Override + public int getValuesCount() { + return values_.size(); + } + /** + *
+       * Dictionary encoding for values
+       * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + @java.lang.Override + public vector_tile.VectorTile.Tile.Value getValues(int index) { + return values_.get(index); + } + /** + *
+       * Dictionary encoding for values
+       * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + @java.lang.Override + public vector_tile.VectorTile.Tile.ValueOrBuilder getValuesOrBuilder( + int index) { + return values_.get(index); + } + + public static final int EXTENT_FIELD_NUMBER = 5; + private int extent_; + /** + *
+       * Although this is an "optional" field it is required by the specification.
+       * See https://github.com/mapbox/vector-tile-spec/issues/47
+       * 
+ * + * optional uint32 extent = 5 [default = 4096]; + * @return Whether the extent field is set. + */ + @java.lang.Override + public boolean hasExtent() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
+       * Although this is an "optional" field it is required by the specification.
+       * See https://github.com/mapbox/vector-tile-spec/issues/47
+       * 
+ * + * optional uint32 extent = 5 [default = 4096]; + * @return The extent. + */ + @java.lang.Override + public int getExtent() { + return extent_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasVersion()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasName()) { + memoizedIsInitialized = 0; + return false; + } + for (int i = 0; i < getValuesCount(); i++) { + if (!getValues(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (!extensionsAreInitialized()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + com.google.protobuf.GeneratedMessageV3 + .ExtendableMessage.ExtensionWriter + extensionWriter = newExtensionWriter(); + if (((bitField0_ & 0x00000002) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_); + } + for (int i = 0; i < features_.size(); i++) { + output.writeMessage(2, features_.get(i)); + } + for (int i = 0; i < keys_.size(); i++) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, keys_.getRaw(i)); + } + for (int i = 0; i < values_.size(); i++) { + output.writeMessage(4, values_.get(i)); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeUInt32(5, extent_); + } + if (((bitField0_ & 0x00000001) != 0)) { + output.writeUInt32(15, version_); + } + extensionWriter.writeUntil(536870912, output); + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_); + } + for (int i = 0; i < features_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, features_.get(i)); + } + { + int dataSize = 0; + for (int i = 0; i < keys_.size(); i++) { + dataSize += computeStringSizeNoTag(keys_.getRaw(i)); + } + size += dataSize; + size += 1 * getKeysList().size(); + } + for (int i = 0; i < values_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, values_.get(i)); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(5, extent_); + } + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(15, version_); + } + size += extensionsSerializedSize(); + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof vector_tile.VectorTile.Tile.Layer)) { + return super.equals(obj); + } + vector_tile.VectorTile.Tile.Layer other = (vector_tile.VectorTile.Tile.Layer) obj; + + if (hasVersion() != other.hasVersion()) return false; + if (hasVersion()) { + if (getVersion() + != other.getVersion()) return false; + } + if (hasName() != other.hasName()) return false; + if (hasName()) { + if (!getName() + .equals(other.getName())) return false; + } + if (!getFeaturesList() + .equals(other.getFeaturesList())) return false; + if (!getKeysList() + .equals(other.getKeysList())) return false; + if (!getValuesList() + .equals(other.getValuesList())) return false; + if (hasExtent() != other.hasExtent()) return false; + if (hasExtent()) { + if (getExtent() + != other.getExtent()) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + if (!getExtensionFields().equals(other.getExtensionFields())) + return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasVersion()) { + hash = (37 * hash) + VERSION_FIELD_NUMBER; + hash = (53 * hash) + getVersion(); + } + if (hasName()) { + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + } + if (getFeaturesCount() > 0) { + hash = (37 * hash) + FEATURES_FIELD_NUMBER; + hash = (53 * hash) + getFeaturesList().hashCode(); + } + if (getKeysCount() > 0) { + hash = (37 * hash) + KEYS_FIELD_NUMBER; + hash = (53 * hash) + getKeysList().hashCode(); + } + if (getValuesCount() > 0) { + hash = (37 * hash) + VALUES_FIELD_NUMBER; + hash = (53 * hash) + getValuesList().hashCode(); + } + if (hasExtent()) { + hash = (37 * hash) + EXTENT_FIELD_NUMBER; + hash = (53 * hash) + getExtent(); + } + hash = hashFields(hash, getExtensionFields()); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static vector_tile.VectorTile.Tile.Layer parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static vector_tile.VectorTile.Tile.Layer parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static vector_tile.VectorTile.Tile.Layer parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static vector_tile.VectorTile.Tile.Layer parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static vector_tile.VectorTile.Tile.Layer parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static vector_tile.VectorTile.Tile.Layer parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static vector_tile.VectorTile.Tile.Layer parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static vector_tile.VectorTile.Tile.Layer parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static vector_tile.VectorTile.Tile.Layer parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static vector_tile.VectorTile.Tile.Layer parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static vector_tile.VectorTile.Tile.Layer parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static vector_tile.VectorTile.Tile.Layer parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(vector_tile.VectorTile.Tile.Layer prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
+       * Layers are described in section 4.1 of the specification
+       * 
+ * + * Protobuf type {@code vector_tile.Tile.Layer} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.ExtendableBuilder< + vector_tile.VectorTile.Tile.Layer, Builder> implements + // @@protoc_insertion_point(builder_implements:vector_tile.Tile.Layer) + vector_tile.VectorTile.Tile.LayerOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return vector_tile.VectorTile.internal_static_vector_tile_Tile_Layer_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return vector_tile.VectorTile.internal_static_vector_tile_Tile_Layer_fieldAccessorTable + .ensureFieldAccessorsInitialized( + vector_tile.VectorTile.Tile.Layer.class, vector_tile.VectorTile.Tile.Layer.Builder.class); + } + + // Construct using vector_tile.VectorTile.Tile.Layer.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getFeaturesFieldBuilder(); + getValuesFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + version_ = 1; + bitField0_ = (bitField0_ & ~0x00000001); + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + if (featuresBuilder_ == null) { + features_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + } else { + featuresBuilder_.clear(); + } + keys_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + if (valuesBuilder_ == null) { + values_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000010); + } else { + valuesBuilder_.clear(); + } + extent_ = 4096; + bitField0_ = (bitField0_ & ~0x00000020); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return vector_tile.VectorTile.internal_static_vector_tile_Tile_Layer_descriptor; + } + + @java.lang.Override + public vector_tile.VectorTile.Tile.Layer getDefaultInstanceForType() { + return vector_tile.VectorTile.Tile.Layer.getDefaultInstance(); + } + + @java.lang.Override + public vector_tile.VectorTile.Tile.Layer build() { + vector_tile.VectorTile.Tile.Layer result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public vector_tile.VectorTile.Tile.Layer buildPartial() { + vector_tile.VectorTile.Tile.Layer result = new vector_tile.VectorTile.Tile.Layer(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.version_ = version_; + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.name_ = name_; + if (featuresBuilder_ == null) { + if (((bitField0_ & 0x00000004) != 0)) { + features_ = java.util.Collections.unmodifiableList(features_); + bitField0_ = (bitField0_ & ~0x00000004); + } + result.features_ = features_; + } else { + result.features_ = featuresBuilder_.build(); + } + if (((bitField0_ & 0x00000008) != 0)) { + keys_ = keys_.getUnmodifiableView(); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.keys_ = keys_; + if (valuesBuilder_ == null) { + if (((bitField0_ & 0x00000010) != 0)) { + values_ = java.util.Collections.unmodifiableList(values_); + bitField0_ = (bitField0_ & ~0x00000010); + } + result.values_ = values_; + } else { + result.values_ = valuesBuilder_.build(); + } + if (((from_bitField0_ & 0x00000020) != 0)) { + to_bitField0_ |= 0x00000004; + } + result.extent_ = extent_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder setExtension( + com.google.protobuf.GeneratedMessage.GeneratedExtension< + vector_tile.VectorTile.Tile.Layer, Type> extension, + Type value) { + return super.setExtension(extension, value); + } + @java.lang.Override + public Builder setExtension( + com.google.protobuf.GeneratedMessage.GeneratedExtension< + vector_tile.VectorTile.Tile.Layer, java.util.List> extension, + int index, Type value) { + return super.setExtension(extension, index, value); + } + @java.lang.Override + public Builder addExtension( + com.google.protobuf.GeneratedMessage.GeneratedExtension< + vector_tile.VectorTile.Tile.Layer, java.util.List> extension, + Type value) { + return super.addExtension(extension, value); + } + @java.lang.Override + public Builder clearExtension( + com.google.protobuf.GeneratedMessage.GeneratedExtension< + vector_tile.VectorTile.Tile.Layer, ?> extension) { + return super.clearExtension(extension); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof vector_tile.VectorTile.Tile.Layer) { + return mergeFrom((vector_tile.VectorTile.Tile.Layer)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(vector_tile.VectorTile.Tile.Layer other) { + if (other == vector_tile.VectorTile.Tile.Layer.getDefaultInstance()) return this; + if (other.hasVersion()) { + setVersion(other.getVersion()); + } + if (other.hasName()) { + bitField0_ |= 0x00000002; + name_ = other.name_; + onChanged(); + } + if (featuresBuilder_ == null) { + if (!other.features_.isEmpty()) { + if (features_.isEmpty()) { + features_ = other.features_; + bitField0_ = (bitField0_ & ~0x00000004); + } else { + ensureFeaturesIsMutable(); + features_.addAll(other.features_); + } + onChanged(); + } + } else { + if (!other.features_.isEmpty()) { + if (featuresBuilder_.isEmpty()) { + featuresBuilder_.dispose(); + featuresBuilder_ = null; + features_ = other.features_; + bitField0_ = (bitField0_ & ~0x00000004); + featuresBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getFeaturesFieldBuilder() : null; + } else { + featuresBuilder_.addAllMessages(other.features_); + } + } + } + if (!other.keys_.isEmpty()) { + if (keys_.isEmpty()) { + keys_ = other.keys_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensureKeysIsMutable(); + keys_.addAll(other.keys_); + } + onChanged(); + } + if (valuesBuilder_ == null) { + if (!other.values_.isEmpty()) { + if (values_.isEmpty()) { + values_ = other.values_; + bitField0_ = (bitField0_ & ~0x00000010); + } else { + ensureValuesIsMutable(); + values_.addAll(other.values_); + } + onChanged(); + } + } else { + if (!other.values_.isEmpty()) { + if (valuesBuilder_.isEmpty()) { + valuesBuilder_.dispose(); + valuesBuilder_ = null; + values_ = other.values_; + bitField0_ = (bitField0_ & ~0x00000010); + valuesBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getValuesFieldBuilder() : null; + } else { + valuesBuilder_.addAllMessages(other.values_); + } + } + } + if (other.hasExtent()) { + setExtent(other.getExtent()); + } + this.mergeExtensionFields(other); + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasVersion()) { + return false; + } + if (!hasName()) { + return false; + } + for (int i = 0; i < getValuesCount(); i++) { + if (!getValues(i).isInitialized()) { + return false; + } + } + if (!extensionsAreInitialized()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + vector_tile.VectorTile.Tile.Layer parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (vector_tile.VectorTile.Tile.Layer) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int version_ = 1; + /** + *
+         * Any compliant implementation must first read the version
+         * number encoded in this message and choose the correct
+         * implementation for this version number before proceeding to
+         * decode other parts of this message.
+         * 
+ * + * required uint32 version = 15 [default = 1]; + * @return Whether the version field is set. + */ + @java.lang.Override + public boolean hasVersion() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
+         * Any compliant implementation must first read the version
+         * number encoded in this message and choose the correct
+         * implementation for this version number before proceeding to
+         * decode other parts of this message.
+         * 
+ * + * required uint32 version = 15 [default = 1]; + * @return The version. + */ + @java.lang.Override + public int getVersion() { + return version_; + } + /** + *
+         * Any compliant implementation must first read the version
+         * number encoded in this message and choose the correct
+         * implementation for this version number before proceeding to
+         * decode other parts of this message.
+         * 
+ * + * required uint32 version = 15 [default = 1]; + * @param value The version to set. + * @return This builder for chaining. + */ + public Builder setVersion(int value) { + bitField0_ |= 0x00000001; + version_ = value; + onChanged(); + return this; + } + /** + *
+         * Any compliant implementation must first read the version
+         * number encoded in this message and choose the correct
+         * implementation for this version number before proceeding to
+         * decode other parts of this message.
+         * 
+ * + * required uint32 version = 15 [default = 1]; + * @return This builder for chaining. + */ + public Builder clearVersion() { + bitField0_ = (bitField0_ & ~0x00000001); + version_ = 1; + onChanged(); + return this; + } + + private java.lang.Object name_ = ""; + /** + * required string name = 1; + * @return Whether the name field is set. + */ + public boolean hasName() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * required string name = 1; + * @return The name. + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * required string name = 1; + * @return The bytes for name. + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * required string name = 1; + * @param value The name to set. + * @return This builder for chaining. + */ + public Builder setName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + name_ = value; + onChanged(); + return this; + } + /** + * required string name = 1; + * @return This builder for chaining. + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000002); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + * required string name = 1; + * @param value The bytes for name to set. + * @return This builder for chaining. + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + name_ = value; + onChanged(); + return this; + } + + private java.util.List features_ = + java.util.Collections.emptyList(); + private void ensureFeaturesIsMutable() { + if (!((bitField0_ & 0x00000004) != 0)) { + features_ = new java.util.ArrayList(features_); + bitField0_ |= 0x00000004; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + vector_tile.VectorTile.Tile.Feature, vector_tile.VectorTile.Tile.Feature.Builder, vector_tile.VectorTile.Tile.FeatureOrBuilder> featuresBuilder_; + + /** + *
+         * The actual features in this tile.
+         * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + public java.util.List getFeaturesList() { + if (featuresBuilder_ == null) { + return java.util.Collections.unmodifiableList(features_); + } else { + return featuresBuilder_.getMessageList(); + } + } + /** + *
+         * The actual features in this tile.
+         * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + public int getFeaturesCount() { + if (featuresBuilder_ == null) { + return features_.size(); + } else { + return featuresBuilder_.getCount(); + } + } + /** + *
+         * The actual features in this tile.
+         * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + public vector_tile.VectorTile.Tile.Feature getFeatures(int index) { + if (featuresBuilder_ == null) { + return features_.get(index); + } else { + return featuresBuilder_.getMessage(index); + } + } + /** + *
+         * The actual features in this tile.
+         * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + public Builder setFeatures( + int index, vector_tile.VectorTile.Tile.Feature value) { + if (featuresBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFeaturesIsMutable(); + features_.set(index, value); + onChanged(); + } else { + featuresBuilder_.setMessage(index, value); + } + return this; + } + /** + *
+         * The actual features in this tile.
+         * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + public Builder setFeatures( + int index, vector_tile.VectorTile.Tile.Feature.Builder builderForValue) { + if (featuresBuilder_ == null) { + ensureFeaturesIsMutable(); + features_.set(index, builderForValue.build()); + onChanged(); + } else { + featuresBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
+         * The actual features in this tile.
+         * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + public Builder addFeatures(vector_tile.VectorTile.Tile.Feature value) { + if (featuresBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFeaturesIsMutable(); + features_.add(value); + onChanged(); + } else { + featuresBuilder_.addMessage(value); + } + return this; + } + /** + *
+         * The actual features in this tile.
+         * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + public Builder addFeatures( + int index, vector_tile.VectorTile.Tile.Feature value) { + if (featuresBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFeaturesIsMutable(); + features_.add(index, value); + onChanged(); + } else { + featuresBuilder_.addMessage(index, value); + } + return this; + } + /** + *
+         * The actual features in this tile.
+         * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + public Builder addFeatures( + vector_tile.VectorTile.Tile.Feature.Builder builderForValue) { + if (featuresBuilder_ == null) { + ensureFeaturesIsMutable(); + features_.add(builderForValue.build()); + onChanged(); + } else { + featuresBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
+         * The actual features in this tile.
+         * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + public Builder addFeatures( + int index, vector_tile.VectorTile.Tile.Feature.Builder builderForValue) { + if (featuresBuilder_ == null) { + ensureFeaturesIsMutable(); + features_.add(index, builderForValue.build()); + onChanged(); + } else { + featuresBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
+         * The actual features in this tile.
+         * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + public Builder addAllFeatures( + java.lang.Iterable values) { + if (featuresBuilder_ == null) { + ensureFeaturesIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, features_); + onChanged(); + } else { + featuresBuilder_.addAllMessages(values); + } + return this; + } + /** + *
+         * The actual features in this tile.
+         * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + public Builder clearFeatures() { + if (featuresBuilder_ == null) { + features_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + } else { + featuresBuilder_.clear(); + } + return this; + } + /** + *
+         * The actual features in this tile.
+         * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + public Builder removeFeatures(int index) { + if (featuresBuilder_ == null) { + ensureFeaturesIsMutable(); + features_.remove(index); + onChanged(); + } else { + featuresBuilder_.remove(index); + } + return this; + } + /** + *
+         * The actual features in this tile.
+         * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + public vector_tile.VectorTile.Tile.Feature.Builder getFeaturesBuilder( + int index) { + return getFeaturesFieldBuilder().getBuilder(index); + } + /** + *
+         * The actual features in this tile.
+         * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + public vector_tile.VectorTile.Tile.FeatureOrBuilder getFeaturesOrBuilder( + int index) { + if (featuresBuilder_ == null) { + return features_.get(index); } else { + return featuresBuilder_.getMessageOrBuilder(index); + } + } + /** + *
+         * The actual features in this tile.
+         * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + public java.util.List + getFeaturesOrBuilderList() { + if (featuresBuilder_ != null) { + return featuresBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(features_); + } + } + /** + *
+         * The actual features in this tile.
+         * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + public vector_tile.VectorTile.Tile.Feature.Builder addFeaturesBuilder() { + return getFeaturesFieldBuilder().addBuilder( + vector_tile.VectorTile.Tile.Feature.getDefaultInstance()); + } + /** + *
+         * The actual features in this tile.
+         * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + public vector_tile.VectorTile.Tile.Feature.Builder addFeaturesBuilder( + int index) { + return getFeaturesFieldBuilder().addBuilder( + index, vector_tile.VectorTile.Tile.Feature.getDefaultInstance()); + } + /** + *
+         * The actual features in this tile.
+         * 
+ * + * repeated .vector_tile.Tile.Feature features = 2; + */ + public java.util.List + getFeaturesBuilderList() { + return getFeaturesFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + vector_tile.VectorTile.Tile.Feature, vector_tile.VectorTile.Tile.Feature.Builder, vector_tile.VectorTile.Tile.FeatureOrBuilder> + getFeaturesFieldBuilder() { + if (featuresBuilder_ == null) { + featuresBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + vector_tile.VectorTile.Tile.Feature, vector_tile.VectorTile.Tile.Feature.Builder, vector_tile.VectorTile.Tile.FeatureOrBuilder>( + features_, + ((bitField0_ & 0x00000004) != 0), + getParentForChildren(), + isClean()); + features_ = null; + } + return featuresBuilder_; + } + + private com.google.protobuf.LazyStringList keys_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureKeysIsMutable() { + if (!((bitField0_ & 0x00000008) != 0)) { + keys_ = new com.google.protobuf.LazyStringArrayList(keys_); + bitField0_ |= 0x00000008; + } + } + /** + *
+         * Dictionary encoding for keys
+         * 
+ * + * repeated string keys = 3; + * @return A list containing the keys. + */ + public com.google.protobuf.ProtocolStringList + getKeysList() { + return keys_.getUnmodifiableView(); + } + /** + *
+         * Dictionary encoding for keys
+         * 
+ * + * repeated string keys = 3; + * @return The count of keys. + */ + public int getKeysCount() { + return keys_.size(); + } + /** + *
+         * Dictionary encoding for keys
+         * 
+ * + * repeated string keys = 3; + * @param index The index of the element to return. + * @return The keys at the given index. + */ + public java.lang.String getKeys(int index) { + return keys_.get(index); + } + /** + *
+         * Dictionary encoding for keys
+         * 
+ * + * repeated string keys = 3; + * @param index The index of the value to return. + * @return The bytes of the keys at the given index. + */ + public com.google.protobuf.ByteString + getKeysBytes(int index) { + return keys_.getByteString(index); + } + /** + *
+         * Dictionary encoding for keys
+         * 
+ * + * repeated string keys = 3; + * @param index The index to set the value at. + * @param value The keys to set. + * @return This builder for chaining. + */ + public Builder setKeys( + int index, java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureKeysIsMutable(); + keys_.set(index, value); + onChanged(); + return this; + } + /** + *
+         * Dictionary encoding for keys
+         * 
+ * + * repeated string keys = 3; + * @param value The keys to add. + * @return This builder for chaining. + */ + public Builder addKeys( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureKeysIsMutable(); + keys_.add(value); + onChanged(); + return this; + } + /** + *
+         * Dictionary encoding for keys
+         * 
+ * + * repeated string keys = 3; + * @param values The keys to add. + * @return This builder for chaining. + */ + public Builder addAllKeys( + java.lang.Iterable values) { + ensureKeysIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, keys_); + onChanged(); + return this; + } + /** + *
+         * Dictionary encoding for keys
+         * 
+ * + * repeated string keys = 3; + * @return This builder for chaining. + */ + public Builder clearKeys() { + keys_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + return this; + } + /** + *
+         * Dictionary encoding for keys
+         * 
+ * + * repeated string keys = 3; + * @param value The bytes of the keys to add. + * @return This builder for chaining. + */ + public Builder addKeysBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureKeysIsMutable(); + keys_.add(value); + onChanged(); + return this; + } + + private java.util.List values_ = + java.util.Collections.emptyList(); + private void ensureValuesIsMutable() { + if (!((bitField0_ & 0x00000010) != 0)) { + values_ = new java.util.ArrayList(values_); + bitField0_ |= 0x00000010; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + vector_tile.VectorTile.Tile.Value, vector_tile.VectorTile.Tile.Value.Builder, vector_tile.VectorTile.Tile.ValueOrBuilder> valuesBuilder_; + + /** + *
+         * Dictionary encoding for values
+         * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + public java.util.List getValuesList() { + if (valuesBuilder_ == null) { + return java.util.Collections.unmodifiableList(values_); + } else { + return valuesBuilder_.getMessageList(); + } + } + /** + *
+         * Dictionary encoding for values
+         * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + public int getValuesCount() { + if (valuesBuilder_ == null) { + return values_.size(); + } else { + return valuesBuilder_.getCount(); + } + } + /** + *
+         * Dictionary encoding for values
+         * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + public vector_tile.VectorTile.Tile.Value getValues(int index) { + if (valuesBuilder_ == null) { + return values_.get(index); + } else { + return valuesBuilder_.getMessage(index); + } + } + /** + *
+         * Dictionary encoding for values
+         * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + public Builder setValues( + int index, vector_tile.VectorTile.Tile.Value value) { + if (valuesBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureValuesIsMutable(); + values_.set(index, value); + onChanged(); + } else { + valuesBuilder_.setMessage(index, value); + } + return this; + } + /** + *
+         * Dictionary encoding for values
+         * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + public Builder setValues( + int index, vector_tile.VectorTile.Tile.Value.Builder builderForValue) { + if (valuesBuilder_ == null) { + ensureValuesIsMutable(); + values_.set(index, builderForValue.build()); + onChanged(); + } else { + valuesBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
+         * Dictionary encoding for values
+         * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + public Builder addValues(vector_tile.VectorTile.Tile.Value value) { + if (valuesBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureValuesIsMutable(); + values_.add(value); + onChanged(); + } else { + valuesBuilder_.addMessage(value); + } + return this; + } + /** + *
+         * Dictionary encoding for values
+         * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + public Builder addValues( + int index, vector_tile.VectorTile.Tile.Value value) { + if (valuesBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureValuesIsMutable(); + values_.add(index, value); + onChanged(); + } else { + valuesBuilder_.addMessage(index, value); + } + return this; + } + /** + *
+         * Dictionary encoding for values
+         * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + public Builder addValues( + vector_tile.VectorTile.Tile.Value.Builder builderForValue) { + if (valuesBuilder_ == null) { + ensureValuesIsMutable(); + values_.add(builderForValue.build()); + onChanged(); + } else { + valuesBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
+         * Dictionary encoding for values
+         * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + public Builder addValues( + int index, vector_tile.VectorTile.Tile.Value.Builder builderForValue) { + if (valuesBuilder_ == null) { + ensureValuesIsMutable(); + values_.add(index, builderForValue.build()); + onChanged(); + } else { + valuesBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
+         * Dictionary encoding for values
+         * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + public Builder addAllValues( + java.lang.Iterable values) { + if (valuesBuilder_ == null) { + ensureValuesIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, values_); + onChanged(); + } else { + valuesBuilder_.addAllMessages(values); + } + return this; + } + /** + *
+         * Dictionary encoding for values
+         * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + public Builder clearValues() { + if (valuesBuilder_ == null) { + values_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000010); + onChanged(); + } else { + valuesBuilder_.clear(); + } + return this; + } + /** + *
+         * Dictionary encoding for values
+         * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + public Builder removeValues(int index) { + if (valuesBuilder_ == null) { + ensureValuesIsMutable(); + values_.remove(index); + onChanged(); + } else { + valuesBuilder_.remove(index); + } + return this; + } + /** + *
+         * Dictionary encoding for values
+         * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + public vector_tile.VectorTile.Tile.Value.Builder getValuesBuilder( + int index) { + return getValuesFieldBuilder().getBuilder(index); + } + /** + *
+         * Dictionary encoding for values
+         * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + public vector_tile.VectorTile.Tile.ValueOrBuilder getValuesOrBuilder( + int index) { + if (valuesBuilder_ == null) { + return values_.get(index); } else { + return valuesBuilder_.getMessageOrBuilder(index); + } + } + /** + *
+         * Dictionary encoding for values
+         * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + public java.util.List + getValuesOrBuilderList() { + if (valuesBuilder_ != null) { + return valuesBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(values_); + } + } + /** + *
+         * Dictionary encoding for values
+         * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + public vector_tile.VectorTile.Tile.Value.Builder addValuesBuilder() { + return getValuesFieldBuilder().addBuilder( + vector_tile.VectorTile.Tile.Value.getDefaultInstance()); + } + /** + *
+         * Dictionary encoding for values
+         * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + public vector_tile.VectorTile.Tile.Value.Builder addValuesBuilder( + int index) { + return getValuesFieldBuilder().addBuilder( + index, vector_tile.VectorTile.Tile.Value.getDefaultInstance()); + } + /** + *
+         * Dictionary encoding for values
+         * 
+ * + * repeated .vector_tile.Tile.Value values = 4; + */ + public java.util.List + getValuesBuilderList() { + return getValuesFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + vector_tile.VectorTile.Tile.Value, vector_tile.VectorTile.Tile.Value.Builder, vector_tile.VectorTile.Tile.ValueOrBuilder> + getValuesFieldBuilder() { + if (valuesBuilder_ == null) { + valuesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + vector_tile.VectorTile.Tile.Value, vector_tile.VectorTile.Tile.Value.Builder, vector_tile.VectorTile.Tile.ValueOrBuilder>( + values_, + ((bitField0_ & 0x00000010) != 0), + getParentForChildren(), + isClean()); + values_ = null; + } + return valuesBuilder_; + } + + private int extent_ = 4096; + /** + *
+         * Although this is an "optional" field it is required by the specification.
+         * See https://github.com/mapbox/vector-tile-spec/issues/47
+         * 
+ * + * optional uint32 extent = 5 [default = 4096]; + * @return Whether the extent field is set. + */ + @java.lang.Override + public boolean hasExtent() { + return ((bitField0_ & 0x00000020) != 0); + } + /** + *
+         * Although this is an "optional" field it is required by the specification.
+         * See https://github.com/mapbox/vector-tile-spec/issues/47
+         * 
+ * + * optional uint32 extent = 5 [default = 4096]; + * @return The extent. + */ + @java.lang.Override + public int getExtent() { + return extent_; + } + /** + *
+         * Although this is an "optional" field it is required by the specification.
+         * See https://github.com/mapbox/vector-tile-spec/issues/47
+         * 
+ * + * optional uint32 extent = 5 [default = 4096]; + * @param value The extent to set. + * @return This builder for chaining. + */ + public Builder setExtent(int value) { + bitField0_ |= 0x00000020; + extent_ = value; + onChanged(); + return this; + } + /** + *
+         * Although this is an "optional" field it is required by the specification.
+         * See https://github.com/mapbox/vector-tile-spec/issues/47
+         * 
+ * + * optional uint32 extent = 5 [default = 4096]; + * @return This builder for chaining. + */ + public Builder clearExtent() { + bitField0_ = (bitField0_ & ~0x00000020); + extent_ = 4096; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:vector_tile.Tile.Layer) + } + + // @@protoc_insertion_point(class_scope:vector_tile.Tile.Layer) + private static final vector_tile.VectorTile.Tile.Layer DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new vector_tile.VectorTile.Tile.Layer(); + } + + public static vector_tile.VectorTile.Tile.Layer getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Layer parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Layer(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public vector_tile.VectorTile.Tile.Layer getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public static final int LAYERS_FIELD_NUMBER = 3; + private java.util.List layers_; + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + @java.lang.Override + public java.util.List getLayersList() { + return layers_; + } + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + @java.lang.Override + public java.util.List + getLayersOrBuilderList() { + return layers_; + } + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + @java.lang.Override + public int getLayersCount() { + return layers_.size(); + } + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + @java.lang.Override + public vector_tile.VectorTile.Tile.Layer getLayers(int index) { + return layers_.get(index); + } + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + @java.lang.Override + public vector_tile.VectorTile.Tile.LayerOrBuilder getLayersOrBuilder( + int index) { + return layers_.get(index); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + for (int i = 0; i < getLayersCount(); i++) { + if (!getLayers(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (!extensionsAreInitialized()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + com.google.protobuf.GeneratedMessageV3 + .ExtendableMessage.ExtensionWriter + extensionWriter = newExtensionWriter(); + for (int i = 0; i < layers_.size(); i++) { + output.writeMessage(3, layers_.get(i)); + } + extensionWriter.writeUntil(8192, output); + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + for (int i = 0; i < layers_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, layers_.get(i)); + } + size += extensionsSerializedSize(); + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof vector_tile.VectorTile.Tile)) { + return super.equals(obj); + } + vector_tile.VectorTile.Tile other = (vector_tile.VectorTile.Tile) obj; + + if (!getLayersList() + .equals(other.getLayersList())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + if (!getExtensionFields().equals(other.getExtensionFields())) + return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (getLayersCount() > 0) { + hash = (37 * hash) + LAYERS_FIELD_NUMBER; + hash = (53 * hash) + getLayersList().hashCode(); + } + hash = hashFields(hash, getExtensionFields()); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static vector_tile.VectorTile.Tile parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static vector_tile.VectorTile.Tile parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static vector_tile.VectorTile.Tile parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static vector_tile.VectorTile.Tile parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static vector_tile.VectorTile.Tile parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static vector_tile.VectorTile.Tile parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static vector_tile.VectorTile.Tile parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static vector_tile.VectorTile.Tile parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static vector_tile.VectorTile.Tile parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static vector_tile.VectorTile.Tile parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static vector_tile.VectorTile.Tile parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static vector_tile.VectorTile.Tile parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(vector_tile.VectorTile.Tile prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code vector_tile.Tile} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.ExtendableBuilder< + vector_tile.VectorTile.Tile, Builder> implements + // @@protoc_insertion_point(builder_implements:vector_tile.Tile) + vector_tile.VectorTile.TileOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return vector_tile.VectorTile.internal_static_vector_tile_Tile_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return vector_tile.VectorTile.internal_static_vector_tile_Tile_fieldAccessorTable + .ensureFieldAccessorsInitialized( + vector_tile.VectorTile.Tile.class, vector_tile.VectorTile.Tile.Builder.class); + } + + // Construct using vector_tile.VectorTile.Tile.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getLayersFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (layersBuilder_ == null) { + layers_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + } else { + layersBuilder_.clear(); + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return vector_tile.VectorTile.internal_static_vector_tile_Tile_descriptor; + } + + @java.lang.Override + public vector_tile.VectorTile.Tile getDefaultInstanceForType() { + return vector_tile.VectorTile.Tile.getDefaultInstance(); + } + + @java.lang.Override + public vector_tile.VectorTile.Tile build() { + vector_tile.VectorTile.Tile result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public vector_tile.VectorTile.Tile buildPartial() { + vector_tile.VectorTile.Tile result = new vector_tile.VectorTile.Tile(this); + int from_bitField0_ = bitField0_; + if (layersBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0)) { + layers_ = java.util.Collections.unmodifiableList(layers_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.layers_ = layers_; + } else { + result.layers_ = layersBuilder_.build(); + } + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder setExtension( + com.google.protobuf.GeneratedMessage.GeneratedExtension< + vector_tile.VectorTile.Tile, Type> extension, + Type value) { + return super.setExtension(extension, value); + } + @java.lang.Override + public Builder setExtension( + com.google.protobuf.GeneratedMessage.GeneratedExtension< + vector_tile.VectorTile.Tile, java.util.List> extension, + int index, Type value) { + return super.setExtension(extension, index, value); + } + @java.lang.Override + public Builder addExtension( + com.google.protobuf.GeneratedMessage.GeneratedExtension< + vector_tile.VectorTile.Tile, java.util.List> extension, + Type value) { + return super.addExtension(extension, value); + } + @java.lang.Override + public Builder clearExtension( + com.google.protobuf.GeneratedMessage.GeneratedExtension< + vector_tile.VectorTile.Tile, ?> extension) { + return super.clearExtension(extension); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof vector_tile.VectorTile.Tile) { + return mergeFrom((vector_tile.VectorTile.Tile)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(vector_tile.VectorTile.Tile other) { + if (other == vector_tile.VectorTile.Tile.getDefaultInstance()) return this; + if (layersBuilder_ == null) { + if (!other.layers_.isEmpty()) { + if (layers_.isEmpty()) { + layers_ = other.layers_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureLayersIsMutable(); + layers_.addAll(other.layers_); + } + onChanged(); + } + } else { + if (!other.layers_.isEmpty()) { + if (layersBuilder_.isEmpty()) { + layersBuilder_.dispose(); + layersBuilder_ = null; + layers_ = other.layers_; + bitField0_ = (bitField0_ & ~0x00000001); + layersBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getLayersFieldBuilder() : null; + } else { + layersBuilder_.addAllMessages(other.layers_); + } + } + } + this.mergeExtensionFields(other); + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + for (int i = 0; i < getLayersCount(); i++) { + if (!getLayers(i).isInitialized()) { + return false; + } + } + if (!extensionsAreInitialized()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + vector_tile.VectorTile.Tile parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (vector_tile.VectorTile.Tile) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.util.List layers_ = + java.util.Collections.emptyList(); + private void ensureLayersIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + layers_ = new java.util.ArrayList(layers_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + vector_tile.VectorTile.Tile.Layer, vector_tile.VectorTile.Tile.Layer.Builder, vector_tile.VectorTile.Tile.LayerOrBuilder> layersBuilder_; + + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + public java.util.List getLayersList() { + if (layersBuilder_ == null) { + return java.util.Collections.unmodifiableList(layers_); + } else { + return layersBuilder_.getMessageList(); + } + } + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + public int getLayersCount() { + if (layersBuilder_ == null) { + return layers_.size(); + } else { + return layersBuilder_.getCount(); + } + } + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + public vector_tile.VectorTile.Tile.Layer getLayers(int index) { + if (layersBuilder_ == null) { + return layers_.get(index); + } else { + return layersBuilder_.getMessage(index); + } + } + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + public Builder setLayers( + int index, vector_tile.VectorTile.Tile.Layer value) { + if (layersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureLayersIsMutable(); + layers_.set(index, value); + onChanged(); + } else { + layersBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + public Builder setLayers( + int index, vector_tile.VectorTile.Tile.Layer.Builder builderForValue) { + if (layersBuilder_ == null) { + ensureLayersIsMutable(); + layers_.set(index, builderForValue.build()); + onChanged(); + } else { + layersBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + public Builder addLayers(vector_tile.VectorTile.Tile.Layer value) { + if (layersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureLayersIsMutable(); + layers_.add(value); + onChanged(); + } else { + layersBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + public Builder addLayers( + int index, vector_tile.VectorTile.Tile.Layer value) { + if (layersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureLayersIsMutable(); + layers_.add(index, value); + onChanged(); + } else { + layersBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + public Builder addLayers( + vector_tile.VectorTile.Tile.Layer.Builder builderForValue) { + if (layersBuilder_ == null) { + ensureLayersIsMutable(); + layers_.add(builderForValue.build()); + onChanged(); + } else { + layersBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + public Builder addLayers( + int index, vector_tile.VectorTile.Tile.Layer.Builder builderForValue) { + if (layersBuilder_ == null) { + ensureLayersIsMutable(); + layers_.add(index, builderForValue.build()); + onChanged(); + } else { + layersBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + public Builder addAllLayers( + java.lang.Iterable values) { + if (layersBuilder_ == null) { + ensureLayersIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, layers_); + onChanged(); + } else { + layersBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + public Builder clearLayers() { + if (layersBuilder_ == null) { + layers_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + layersBuilder_.clear(); + } + return this; + } + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + public Builder removeLayers(int index) { + if (layersBuilder_ == null) { + ensureLayersIsMutable(); + layers_.remove(index); + onChanged(); + } else { + layersBuilder_.remove(index); + } + return this; + } + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + public vector_tile.VectorTile.Tile.Layer.Builder getLayersBuilder( + int index) { + return getLayersFieldBuilder().getBuilder(index); + } + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + public vector_tile.VectorTile.Tile.LayerOrBuilder getLayersOrBuilder( + int index) { + if (layersBuilder_ == null) { + return layers_.get(index); } else { + return layersBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + public java.util.List + getLayersOrBuilderList() { + if (layersBuilder_ != null) { + return layersBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(layers_); + } + } + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + public vector_tile.VectorTile.Tile.Layer.Builder addLayersBuilder() { + return getLayersFieldBuilder().addBuilder( + vector_tile.VectorTile.Tile.Layer.getDefaultInstance()); + } + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + public vector_tile.VectorTile.Tile.Layer.Builder addLayersBuilder( + int index) { + return getLayersFieldBuilder().addBuilder( + index, vector_tile.VectorTile.Tile.Layer.getDefaultInstance()); + } + /** + * repeated .vector_tile.Tile.Layer layers = 3; + */ + public java.util.List + getLayersBuilderList() { + return getLayersFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + vector_tile.VectorTile.Tile.Layer, vector_tile.VectorTile.Tile.Layer.Builder, vector_tile.VectorTile.Tile.LayerOrBuilder> + getLayersFieldBuilder() { + if (layersBuilder_ == null) { + layersBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + vector_tile.VectorTile.Tile.Layer, vector_tile.VectorTile.Tile.Layer.Builder, vector_tile.VectorTile.Tile.LayerOrBuilder>( + layers_, + ((bitField0_ & 0x00000001) != 0), + getParentForChildren(), + isClean()); + layers_ = null; + } + return layersBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:vector_tile.Tile) + } + + // @@protoc_insertion_point(class_scope:vector_tile.Tile) + private static final vector_tile.VectorTile.Tile DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new vector_tile.VectorTile.Tile(); + } + + public static vector_tile.VectorTile.Tile getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Tile parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Tile(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public vector_tile.VectorTile.Tile getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_vector_tile_Tile_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_vector_tile_Tile_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_vector_tile_Tile_Value_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_vector_tile_Tile_Value_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_vector_tile_Tile_Feature_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_vector_tile_Tile_Feature_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_vector_tile_Tile_Layer_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_vector_tile_Tile_Layer_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n$src/main/resources/vector_tile.proto\022\013" + + "vector_tile\"\300\004\n\004Tile\022\'\n\006layers\030\003 \003(\0132\027.v" + + "ector_tile.Tile.Layer\032\241\001\n\005Value\022\024\n\014strin" + + "g_value\030\001 \001(\t\022\023\n\013float_value\030\002 \001(\002\022\024\n\014do" + + "uble_value\030\003 \001(\001\022\021\n\tint_value\030\004 \001(\003\022\022\n\nu" + + "int_value\030\005 \001(\004\022\022\n\nsint_value\030\006 \001(\022\022\022\n\nb" + + "ool_value\030\007 \001(\010*\010\010\010\020\200\200\200\200\002\032s\n\007Feature\022\r\n\002" + + "id\030\001 \001(\004:\0010\022\020\n\004tags\030\002 \003(\rB\002\020\001\0221\n\004type\030\003 " + + "\001(\0162\032.vector_tile.Tile.GeomType:\007UNKNOWN" + + "\022\024\n\010geometry\030\004 \003(\rB\002\020\001\032\255\001\n\005Layer\022\022\n\007vers" + + "ion\030\017 \002(\r:\0011\022\014\n\004name\030\001 \002(\t\022+\n\010features\030\002" + + " \003(\0132\031.vector_tile.Tile.Feature\022\014\n\004keys\030" + + "\003 \003(\t\022\'\n\006values\030\004 \003(\0132\027.vector_tile.Tile" + + ".Value\022\024\n\006extent\030\005 \001(\r:\0044096*\010\010\020\020\200\200\200\200\002\"?" + + "\n\010GeomType\022\013\n\007UNKNOWN\020\000\022\t\n\005POINT\020\001\022\016\n\nLI" + + "NESTRING\020\002\022\013\n\007POLYGON\020\003*\005\010\020\020\200@B\002H\001" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }); + internal_static_vector_tile_Tile_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_vector_tile_Tile_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_vector_tile_Tile_descriptor, + new java.lang.String[] { "Layers", }); + internal_static_vector_tile_Tile_Value_descriptor = + internal_static_vector_tile_Tile_descriptor.getNestedTypes().get(0); + internal_static_vector_tile_Tile_Value_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_vector_tile_Tile_Value_descriptor, + new java.lang.String[] { "StringValue", "FloatValue", "DoubleValue", "IntValue", "UintValue", "SintValue", "BoolValue", }); + internal_static_vector_tile_Tile_Feature_descriptor = + internal_static_vector_tile_Tile_descriptor.getNestedTypes().get(1); + internal_static_vector_tile_Tile_Feature_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_vector_tile_Tile_Feature_descriptor, + new java.lang.String[] { "Id", "Tags", "Type", "Geometry", }); + internal_static_vector_tile_Tile_Layer_descriptor = + internal_static_vector_tile_Tile_descriptor.getNestedTypes().get(2); + internal_static_vector_tile_Tile_Layer_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_vector_tile_Tile_Layer_descriptor, + new java.lang.String[] { "Version", "Name", "Features", "Keys", "Values", "Extent", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/src/main/resources/vector_tile.proto b/src/main/resources/vector_tile.proto new file mode 100644 index 00000000..f128e24b --- /dev/null +++ b/src/main/resources/vector_tile.proto @@ -0,0 +1,79 @@ +syntax = "proto2"; +package vector_tile; + +option optimize_for = SPEED; + +message Tile { + + // GeomType is described in section 4.3.4 of the specification + enum GeomType { + UNKNOWN = 0; + POINT = 1; + LINESTRING = 2; + POLYGON = 3; + } + + // Variant type encoding + // The use of values is described in section 4.1 of the specification + message Value { + // Exactly one of these values must be present in a valid message + optional string string_value = 1; + optional float float_value = 2; + optional double double_value = 3; + optional int64 int_value = 4; + optional uint64 uint_value = 5; + optional sint64 sint_value = 6; + optional bool bool_value = 7; + + extensions 8 to max; + } + + // Features are described in section 4.2 of the specification + message Feature { + optional uint64 id = 1 [default = 0]; + + // Tags of this feature are encoded as repeated pairs of + // integers. + // A detailed description of tags is located in sections + // 4.2 and 4.4 of the specification + repeated uint32 tags = 2 [packed = true]; + + // The type of geometry stored in this feature. + optional GeomType type = 3 [default = UNKNOWN]; + + // Contains a stream of commands and parameters (vertices). + // A detailed description on geometry encoding is located in + // section 4.3 of the specification. + repeated uint32 geometry = 4 [packed = true]; + } + + // Layers are described in section 4.1 of the specification + message Layer { + // Any compliant implementation must first read the version + // number encoded in this message and choose the correct + // implementation for this version number before proceeding to + // decode other parts of this message. + required uint32 version = 15 [default = 1]; + + required string name = 1; + + // The actual features in this tile. + repeated Feature features = 2; + + // Dictionary encoding for keys + repeated string keys = 3; + + // Dictionary encoding for values + repeated Value values = 4; + + // Although this is an "optional" field it is required by the specification. + // See https://github.com/mapbox/vector-tile-spec/issues/47 + optional uint32 extent = 5 [default = 4096]; + + extensions 16 to max; + } + + repeated Layer layers = 3; + + extensions 16 to 8191; +} diff --git a/src/test/java/com/onthegomap/flatmap/VectorTileEncoderTest.java b/src/test/java/com/onthegomap/flatmap/VectorTileEncoderTest.java new file mode 100644 index 00000000..59681677 --- /dev/null +++ b/src/test/java/com/onthegomap/flatmap/VectorTileEncoderTest.java @@ -0,0 +1,145 @@ +package com.onthegomap.flatmap; + +import static com.onthegomap.flatmap.geo.GeoUtils.gf; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.onthegomap.flatmap.VectorTileEncoder.DecodedFeature; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.Test; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.CoordinateXY; +import org.locationtech.jts.geom.Geometry; +import org.locationtech.jts.geom.LinearRing; +import org.locationtech.jts.geom.Point; +import org.locationtech.jts.geom.Polygon; +import vector_tile.VectorTile.Tile.GeomType; + +public class VectorTileEncoderTest { + + @Test + public void testRoundTripPoint() throws IOException { + testRoundTripGeometry(gf.createPoint(new CoordinateXY(1, 2))); + } + + @Test + public void testRoundTripMultipoint() throws IOException { + testRoundTripGeometry(gf.createMultiPointFromCoords(new Coordinate[]{ + new CoordinateXY(1, 2), + new CoordinateXY(3, 4) + })); + } + + @Test + public void testRoundTripLineString() throws IOException { + testRoundTripGeometry(gf.createLineString(new Coordinate[]{ + new CoordinateXY(1, 2), + new CoordinateXY(3, 4) + })); + } + + @Test + public void testRoundTripPolygon() throws IOException { + testRoundTripGeometry(gf.createPolygon( + gf.createLinearRing(new Coordinate[]{ + new CoordinateXY(0, 0), + new CoordinateXY(4, 0), + new CoordinateXY(4, 4), + new CoordinateXY(0, 4), + new CoordinateXY(0, 0) + }), + new LinearRing[]{ + gf.createLinearRing(new Coordinate[]{ + new CoordinateXY(1, 1), + new CoordinateXY(1, 2), + new CoordinateXY(2, 2), + new CoordinateXY(2, 1), + new CoordinateXY(1, 1) + }) + } + )); + } + + @Test + public void testRoundTripMultiPolygon() throws IOException { + testRoundTripGeometry(gf.createMultiPolygon(new Polygon[]{ + gf.createPolygon(new Coordinate[]{ + new CoordinateXY(0, 0), + new CoordinateXY(1, 0), + new CoordinateXY(1, 1), + new CoordinateXY(0, 1), + new CoordinateXY(0, 0) + }), + gf.createPolygon(new Coordinate[]{ + new CoordinateXY(3, 0), + new CoordinateXY(4, 0), + new CoordinateXY(4, 1), + new CoordinateXY(3, 1), + new CoordinateXY(3, 0) + }) + })); + } + + @Test + public void testRoundTripAttributes() throws IOException { + testRoundTripAttrs(Map.of( + "string", "string", + "long", 1L, + "double", 3.5d, + "true", true, + "false", false + )); + } + + @Test + public void testMultipleFeaturesMultipleLayer() throws IOException { + Point point = gf.createPoint(new CoordinateXY(0, 0)); + Map attrs1 = Map.of("a", 1L, "b", 2L); + Map attrs2 = Map.of("b", 3L, "c", 2L); + byte[] encoded = new VectorTileEncoder().addLayerFeatures("layer1", List.of( + new LayerFeature(false, 0, 0, attrs1, + (byte) GeomType.POINT.getNumber(), VectorTileEncoder.getCommands(point), 1L), + new LayerFeature(false, 0, 0, attrs2, + (byte) GeomType.POINT.getNumber(), VectorTileEncoder.getCommands(point), 2L) + )).addLayerFeatures("layer2", List.of( + new LayerFeature(false, 0, 0, attrs1, + (byte) GeomType.POINT.getNumber(), VectorTileEncoder.getCommands(point), 3L) + )).encode(); + + List decoded = VectorTileEncoder.decode(encoded); + assertEquals(attrs1, decoded.get(0).attributes()); + assertEquals("layer1", decoded.get(0).layerName()); + + assertEquals(attrs2, decoded.get(1).attributes()); + assertEquals("layer1", decoded.get(1).layerName()); + + assertEquals(attrs1, decoded.get(2).attributes()); + assertEquals("layer2", decoded.get(2).layerName()); + } + + private void testRoundTripAttrs(Map attrs) throws IOException { + testRoundTrip(gf.createPoint(new CoordinateXY(0, 0)), "layer", attrs, 1); + } + + private void testRoundTripGeometry(Geometry input) throws IOException { + testRoundTrip(input, "layer", Map.of(), 1); + } + + private void testRoundTrip(Geometry input, String layer, Map attrs, long id) throws IOException { + int[] commands = VectorTileEncoder.getCommands(input); + byte geomType = (byte) VectorTileEncoder.toGeomType(input).ordinal(); + Geometry output = VectorTileEncoder.decode(geomType, commands); + assertTrue(input.equalsExact(output), "\n" + input + "\n!=\n" + output); + + byte[] encoded = new VectorTileEncoder().addLayerFeatures(layer, List.of( + new LayerFeature(false, 0, 0, attrs, + (byte) VectorTileEncoder.toGeomType(input).getNumber(), VectorTileEncoder.getCommands(input), id) + )).encode(); + + List decoded = VectorTileEncoder.decode(encoded); + DecodedFeature expected = new DecodedFeature(layer, 4096, input, attrs, id); + assertEquals(List.of(expected), decoded); + } +} diff --git a/src/test/java/com/onthegomap/flatmap/collections/MergeSortFeatureMapTest.java b/src/test/java/com/onthegomap/flatmap/collections/MergeSortFeatureMapTest.java new file mode 100644 index 00000000..a626c031 --- /dev/null +++ b/src/test/java/com/onthegomap/flatmap/collections/MergeSortFeatureMapTest.java @@ -0,0 +1,32 @@ +package com.onthegomap.flatmap.collections; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import com.onthegomap.flatmap.RenderedFeature; +import com.onthegomap.flatmap.monitoring.Stats.InMemory; +import java.nio.file.Path; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +public class MergeSortFeatureMapTest { + + @TempDir + Path tmpDir; + + @Test + public void testEmpty() { + var features = new MergeSortFeatureMap(tmpDir, new InMemory()); + features.sort(); + assertFalse(features.getAll().hasNext()); + } + + @Test + public void testThrowsWhenPreparedOutOfOrder() { + var features = new MergeSortFeatureMap(tmpDir, new InMemory()); + features.accept(new RenderedFeature(1, new byte[]{})); + assertThrows(IllegalStateException.class, features::getAll); + features.sort(); + assertThrows(IllegalStateException.class, () -> features.accept(new RenderedFeature(1, new byte[]{}))); + } +} diff --git a/src/test/java/com/onthegomap/flatmap/reader/NaturalEarthReaderTest.java b/src/test/java/com/onthegomap/flatmap/reader/NaturalEarthReaderTest.java index 92f4fc9d..2df5475d 100644 --- a/src/test/java/com/onthegomap/flatmap/reader/NaturalEarthReaderTest.java +++ b/src/test/java/com/onthegomap/flatmap/reader/NaturalEarthReaderTest.java @@ -4,7 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import com.onthegomap.flatmap.GeoUtils; +import com.onthegomap.flatmap.geo.GeoUtils; import com.onthegomap.flatmap.monitoring.Stats.InMemory; import com.onthegomap.flatmap.worker.Topology; import java.io.File; diff --git a/src/test/java/com/onthegomap/flatmap/reader/ShapefileReaderTest.java b/src/test/java/com/onthegomap/flatmap/reader/ShapefileReaderTest.java index 6adcc93a..c330e744 100644 --- a/src/test/java/com/onthegomap/flatmap/reader/ShapefileReaderTest.java +++ b/src/test/java/com/onthegomap/flatmap/reader/ShapefileReaderTest.java @@ -3,7 +3,7 @@ package com.onthegomap.flatmap.reader; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import com.onthegomap.flatmap.GeoUtils; +import com.onthegomap.flatmap.geo.GeoUtils; import com.onthegomap.flatmap.monitoring.Stats.InMemory; import com.onthegomap.flatmap.worker.Topology; import java.io.File;