diff --git a/vector/src/main/java/lt/lrv/basemap/layers/Transportation.java b/vector/src/main/java/lt/lrv/basemap/layers/Transportation.java index e32a65a9..308a836c 100644 --- a/vector/src/main/java/lt/lrv/basemap/layers/Transportation.java +++ b/vector/src/main/java/lt/lrv/basemap/layers/Transportation.java @@ -77,12 +77,8 @@ public void processFeature(SourceFeature sf, FeatureCollector features) { public void addTransportationFeature(String clazz, String subclass, int minZoom, SourceFeature sf, FeatureCollector features) { var level = (int) sf.getLong("LYGMUO"); - var name = nullIfEmpty(sf.getString("VARDAS")); - var expressway = clazz.equals(FieldValues.CLASS_MOTORWAY); - - var ref = expressway ? nullIfEmpty(sf.getString("NUMERIS")) : null; - var refLength = ref != null ? ref.length() : null; + var expressway = "AM".equals(sf.getString("KATEGOR")); var surface = PAVED_VALUES.contains(sf.getString("DANGA")) ? "paved" : "unpaved"; var brunnel = switch (level) { @@ -103,21 +99,7 @@ public void addTransportationFeature(String clazz, String subclass, int minZoom, .setMinPixelSize(0.0) .setPixelTolerance(0.0); - // TODO transportation_name building should be moved to TransportationName class once Transportation layer becomes stable - if (ref != null || name != null) { - features.line(OpenMapTilesSchema.TransportationName.LAYER_NAME) - .setBufferPixels(OpenMapTilesSchema.TransportationName.BUFFER_SIZE) - .putAttrs(LanguageUtils.getNames(sf.tags())) - .setAttr(OpenMapTilesSchema.TransportationName.Fields.CLASS, clazz) - .setAttr(OpenMapTilesSchema.TransportationName.Fields.SUBCLASS, subclass) - .setAttr(OpenMapTilesSchema.TransportationName.Fields.REF, ref) - .setAttr(OpenMapTilesSchema.TransportationName.Fields.REF_LENGTH, refLength) - .setAttr(OpenMapTilesSchema.TransportationName.Fields.BRUNNEL, brunnel) - .setAttr(OpenMapTilesSchema.TransportationName.Fields.LEVEL, level) - .setMinPixelSize(0.0) - .setPixelTolerance(0.0) - .setMinZoom(Math.min(minZoom + 2, 14)); - } + TransportationName.addFeature(clazz, subclass, brunnel, level, minZoom, sf, features); } @Override diff --git a/vector/src/main/java/lt/lrv/basemap/layers/TransportationName.java b/vector/src/main/java/lt/lrv/basemap/layers/TransportationName.java index a691e895..f6326434 100644 --- a/vector/src/main/java/lt/lrv/basemap/layers/TransportationName.java +++ b/vector/src/main/java/lt/lrv/basemap/layers/TransportationName.java @@ -7,9 +7,13 @@ import com.onthegomap.planetiler.VectorTile; import com.onthegomap.planetiler.reader.SourceFeature; import lt.lrv.basemap.openmaptiles.OpenMapTilesSchema; +import lt.lrv.basemap.utils.LanguageUtils; +import lt.lrv.basemap.utils.Utils; import java.util.List; +import static com.onthegomap.planetiler.util.LanguageUtils.nullIfEmpty; + public class TransportationName implements OpenMapTilesSchema.TransportationName, ForwardingProfile.FeaturePostProcessor { @Override @@ -17,6 +21,48 @@ public void processFeature(SourceFeature sf, FeatureCollector features) { // Currently TransportationName processFeature is handled inside Transportation } + public static void addFeature(String clazz, String subclass, String brunnel, int level, int transportMinZoom, SourceFeature sf, FeatureCollector features) { + var name = nullIfEmpty(sf.getString("VARDAS")); + var rawRef = Utils.coalesce(nullIfEmpty(sf.getString("ENUMERIS")), nullIfEmpty(sf.getString("NUMERIS"))); + + if (Utils.coalesce(name, rawRef) == null) { + return; + } + + var feature = features.line(LAYER_NAME) + .setBufferPixels(BUFFER_SIZE) + .setAttr(Fields.CLASS, clazz) + .setAttr(Fields.SUBCLASS, subclass) + .setAttr(Fields.BRUNNEL, brunnel) + .setAttr(Fields.LEVEL, level) + .setMinPixelSize(0.0) + .setPixelTolerance(0.0); + + if (rawRef != null) { + // Handle cases like E67/E272 by getting first road number + var ref = rawRef.contains("/") ? rawRef.split("/")[0] : rawRef; + var minZoom = getRefMinZoom(rawRef); + + feature.setAttr(Fields.REF, ref) + .setAttr(Fields.REF_LENGTH, ref.length()) + .setMinZoom(getRefMinZoom(rawRef)) + .setSortKeyDescending(minZoom); + } else { + feature.putAttrs(LanguageUtils.getNames(sf.tags())) + .setMinZoom(Math.min(transportMinZoom + 2, 14)); + } + } + + private static int getRefMinZoom(String ref) { + if (ref.startsWith("E")) { + return 8; + } else if (ref.startsWith("A")) { + return 9; + } else { + return 11; + } + } + @Override public List postProcess(int zoom, List items) { if (zoom >= 14) { diff --git a/vector/src/main/java/lt/lrv/basemap/utils/Utils.java b/vector/src/main/java/lt/lrv/basemap/utils/Utils.java new file mode 100644 index 00000000..a45c6357 --- /dev/null +++ b/vector/src/main/java/lt/lrv/basemap/utils/Utils.java @@ -0,0 +1,10 @@ +package lt.lrv.basemap.utils; + +public class Utils { + private Utils() { + } + + public static T coalesce(T a, T b) { + return a != null ? a : b; + } +}