diff --git a/resources/rendertheme.xsd b/resources/rendertheme.xsd index a2c03204..05030d3d 100644 --- a/resources/rendertheme.xsd +++ b/resources/rendertheme.xsd @@ -303,10 +303,10 @@ - - - - + + + + diff --git a/vtm-jeo/src/org/oscim/theme/carto/RenderTheme.java b/vtm-jeo/src/org/oscim/theme/carto/RenderTheme.java index 8264649e..47424ce5 100644 --- a/vtm-jeo/src/org/oscim/theme/carto/RenderTheme.java +++ b/vtm-jeo/src/org/oscim/theme/carto/RenderTheme.java @@ -252,12 +252,22 @@ public class RenderTheme implements IRenderTheme { } @Override - public String transformKey(String key) { + public String transformBackwardKey(String key) { return null; } @Override - public Tag transformTag(Tag tag) { + public String transformForwardKey(String key) { + return null; + } + + @Override + public Tag transformBackwardTag(Tag tag) { + return null; + } + + @Override + public Tag transformForwardTag(Tag tag) { return null; } diff --git a/vtm-playground/src/org/oscim/test/DebugTheme.java b/vtm-playground/src/org/oscim/test/DebugTheme.java index b0f41a66..1692918c 100644 --- a/vtm-playground/src/org/oscim/test/DebugTheme.java +++ b/vtm-playground/src/org/oscim/test/DebugTheme.java @@ -48,12 +48,22 @@ public class DebugTheme implements IRenderTheme { } @Override - public String transformKey(String key) { + public String transformBackwardKey(String key) { return null; } @Override - public Tag transformTag(Tag tag) { + public String transformForwardKey(String key) { + return null; + } + + @Override + public Tag transformBackwardTag(Tag tag) { + return null; + } + + @Override + public Tag transformForwardTag(Tag tag) { return null; } diff --git a/vtm-themes/resources/assets/vtm/mapzen.xml b/vtm-themes/resources/assets/vtm/mapzen.xml index 79b138bd..632ab8b6 100644 --- a/vtm-themes/resources/assets/vtm/mapzen.xml +++ b/vtm-themes/resources/assets/vtm/mapzen.xml @@ -3,16 +3,16 @@ version="1" xmlns="http://opensciencemap.org/rendertheme" xsi:schemaLocation="http://opensciencemap.org/rendertheme https://raw.githubusercontent.com/mapsforge/vtm/master/resources/rendertheme.xsd"> - - - + + + - - - - - - + + + + + + diff --git a/vtm-themes/resources/assets/vtm/openmaptiles.xml b/vtm-themes/resources/assets/vtm/openmaptiles.xml index 7563d0d4..e89283d4 100644 --- a/vtm-themes/resources/assets/vtm/openmaptiles.xml +++ b/vtm-themes/resources/assets/vtm/openmaptiles.xml @@ -3,10 +3,10 @@ version="1" xmlns="http://opensciencemap.org/rendertheme" xsi:schemaLocation="http://opensciencemap.org/rendertheme https://raw.githubusercontent.com/mapsforge/vtm/master/resources/rendertheme.xsd"> - - - - + + + + diff --git a/vtm/src/org/oscim/core/MapElement.java b/vtm/src/org/oscim/core/MapElement.java index 5fded8ef..1f41758c 100644 --- a/vtm/src/org/oscim/core/MapElement.java +++ b/vtm/src/org/oscim/core/MapElement.java @@ -1,7 +1,7 @@ /* * Copyright 2012 Hannes Janetzek * Copyright 2016 Andrey Novikov - * Copyright 2017-2018 Gustl22 + * Copyright 2017-2019 Gustl22 * Copyright 2018 devemux86 * * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). @@ -66,7 +66,7 @@ public class MapElement extends GeometryBuffer { * @return height in meters, if present */ public Float getHeight(IRenderTheme theme) { - String res = theme != null ? theme.transformKey(Tag.KEY_HEIGHT) : Tag.KEY_HEIGHT; + String res = theme != null ? theme.transformBackwardKey(Tag.KEY_HEIGHT) : Tag.KEY_HEIGHT; String v = tags.getValue(res != null ? res : Tag.KEY_HEIGHT); if (v != null) return Float.parseFloat(v); @@ -77,7 +77,7 @@ public class MapElement extends GeometryBuffer { * @return minimum height in meters, if present */ public Float getMinHeight(IRenderTheme theme) { - String res = theme != null ? theme.transformKey(Tag.KEY_MIN_HEIGHT) : Tag.KEY_MIN_HEIGHT; + String res = theme != null ? theme.transformBackwardKey(Tag.KEY_MIN_HEIGHT) : Tag.KEY_MIN_HEIGHT; String v = tags.getValue(res != null ? res : Tag.KEY_MIN_HEIGHT); if (v != null) return Float.parseFloat(v); diff --git a/vtm/src/org/oscim/layers/tile/buildings/BuildingLayer.java b/vtm/src/org/oscim/layers/tile/buildings/BuildingLayer.java index db39c00d..7af4d812 100644 --- a/vtm/src/org/oscim/layers/tile/buildings/BuildingLayer.java +++ b/vtm/src/org/oscim/layers/tile/buildings/BuildingLayer.java @@ -273,7 +273,7 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook, ZoomLim protected String getKeyOrDefault(String key) { if (mTileLayer.getTheme() == null) return key; - String res = mTileLayer.getTheme().transformKey(key); + String res = mTileLayer.getTheme().transformBackwardKey(key); return res != null ? res : key; } diff --git a/vtm/src/org/oscim/theme/IRenderTheme.java b/vtm/src/org/oscim/theme/IRenderTheme.java index e7725f5d..d08c5fdc 100644 --- a/vtm/src/org/oscim/theme/IRenderTheme.java +++ b/vtm/src/org/oscim/theme/IRenderTheme.java @@ -2,7 +2,7 @@ * Copyright 2010, 2011, 2012 mapsforge.org * Copyright 2013 Hannes Janetzek * Copyright 2017 devemux86 - * Copyright 2018 Gustl22 + * Copyright 2018-2019 Gustl22 * * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). * @@ -66,14 +66,35 @@ public interface IRenderTheme { void scaleTextSize(float scaleFactor); /** - * @return the transformed tag key of this RenderTheme. + * Transform internal key to tile source key. + * e.g. for lazy fetched tag values via tile source key. + * Use when tile source and internal keys have 1-1 relation. + * + * @return the backwards transformed tag key. */ - String transformKey(String key); + String transformBackwardKey(String key); /** - * @return the transformed tag of this RenderTheme. + * Transform tile source key to internal key. + * + * @return the forward transformed tag key. */ - Tag transformTag(Tag tag); + String transformForwardKey(String key); + + /** + * Transform internal tag to tile source tag. + * Use when tile source and internal tags have 1-1 relation. + * + * @return the backwards transformed tag. + */ + Tag transformBackwardTag(Tag tag); + + /** + * Transform tile source tag to internal tag. + * + * @return the forward transformed tag. + */ + Tag transformForwardTag(Tag tag); class ThemeException extends IllegalArgumentException { public ThemeException(String string) { diff --git a/vtm/src/org/oscim/theme/RenderTheme.java b/vtm/src/org/oscim/theme/RenderTheme.java index 974f3076..9861d849 100644 --- a/vtm/src/org/oscim/theme/RenderTheme.java +++ b/vtm/src/org/oscim/theme/RenderTheme.java @@ -2,7 +2,7 @@ * Copyright 2014 Hannes Janetzek * Copyright 2017 Longri * Copyright 2017 devemux86 - * Copyright 2018 Gustl22 + * Copyright 2018-2019 Gustl22 * * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). * @@ -26,6 +26,7 @@ import org.oscim.theme.rule.Rule; import org.oscim.theme.rule.Rule.Element; import org.oscim.theme.rule.Rule.RuleVisitor; import org.oscim.theme.styles.RenderStyle; +import org.oscim.utils.ArrayUtils; import org.oscim.utils.LRUCache; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -47,8 +48,8 @@ public class RenderTheme implements IRenderTheme { private final Rule[] mRules; private final boolean mMapsforgeTheme; - private final Map mTransformKeyMap; - private final Map mTransformTagMap; + private final Map mTransformBackwardKeyMap, mTransformForwardKeyMap; + private final Map mTransformBackwardTagMap, mTransformForwardTagMap; class RenderStyleCache { final int matchType; @@ -105,8 +106,10 @@ public class RenderTheme implements IRenderTheme { mRules = rules; mMapsforgeTheme = mapsforgeTheme; - mTransformKeyMap = transformKeyMap; - mTransformTagMap = transformTagMap; + mTransformForwardKeyMap = transformKeyMap; + mTransformBackwardKeyMap = ArrayUtils.swap(transformKeyMap); + mTransformForwardTagMap = transformTagMap; + mTransformBackwardTagMap = ArrayUtils.swap(transformTagMap); mStyleCache = new RenderStyleCache[3]; mStyleCache[0] = new RenderStyleCache(Element.NODE); @@ -292,16 +295,30 @@ public class RenderTheme implements IRenderTheme { } @Override - public String transformKey(String key) { - if (mTransformKeyMap != null) - return mTransformKeyMap.get(key); + public String transformBackwardKey(String key) { + if (mTransformBackwardKeyMap != null) + return mTransformBackwardKeyMap.get(key); return null; } @Override - public Tag transformTag(Tag tag) { - if (mTransformTagMap != null) - return mTransformTagMap.get(tag); + public String transformForwardKey(String key) { + if (mTransformForwardKeyMap != null) + return mTransformForwardKeyMap.get(key); + return null; + } + + @Override + public Tag transformBackwardTag(Tag tag) { + if (mTransformBackwardTagMap != null) + return mTransformBackwardTagMap.get(tag); + return null; + } + + @Override + public Tag transformForwardTag(Tag tag) { + if (mTransformForwardTagMap != null) + return mTransformForwardTagMap.get(tag); return null; } diff --git a/vtm/src/org/oscim/theme/XmlThemeBuilder.java b/vtm/src/org/oscim/theme/XmlThemeBuilder.java index 08f2db95..6f1801fe 100644 --- a/vtm/src/org/oscim/theme/XmlThemeBuilder.java +++ b/vtm/src/org/oscim/theme/XmlThemeBuilder.java @@ -4,7 +4,7 @@ * Copyright 2016-2019 devemux86 * Copyright 2016-2017 Longri * Copyright 2016 Andrey Novikov - * Copyright 2018 Gustl22 + * Copyright 2018-2019 Gustl22 * Copyright 2018 Izumi Kawashima * * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). @@ -1268,40 +1268,40 @@ public class XmlThemeBuilder extends DefaultHandler { } private void tagTransform(String localName, Attributes attributes) { - String matchKey, matchValue, outputKey, outputValue; - matchKey = matchValue = outputKey = outputValue = null; + String k, v, libK, libV; + k = v = libK = libV = null; for (int i = 0; i < attributes.getLength(); i++) { String name = attributes.getLocalName(i); String value = attributes.getValue(i); switch (name) { - case "match-k": - matchKey = value; + case "k": + k = value; break; - case "match-v": - matchValue = value; + case "v": + v = value; break; - case "output-k": - outputKey = value; + case "k-lib": + libK = value; break; - case "output-v": - outputValue = value; + case "v-lib": + libV = value; break; default: logUnknownAttribute(localName, name, value, i); } } - if (matchKey == null || matchKey.isEmpty() || outputKey == null || outputKey.isEmpty()) { + if (k == null || k.isEmpty() || libK == null || libK.isEmpty()) { log.debug("empty key in element " + localName); return; } - if (matchValue == null && outputValue == null) { - mTransformKeyMap.put(matchKey, outputKey); + if (v == null && libV == null) { + mTransformKeyMap.put(k, libK); } else { - mTransformTagMap.put(new Tag(matchKey, matchValue), new Tag(outputKey, outputValue)); + mTransformTagMap.put(new Tag(k, v), new Tag(libK, libV)); } } diff --git a/vtm/src/org/oscim/utils/ArrayUtils.java b/vtm/src/org/oscim/utils/ArrayUtils.java index fa5ff7c8..498fd08d 100644 --- a/vtm/src/org/oscim/utils/ArrayUtils.java +++ b/vtm/src/org/oscim/utils/ArrayUtils.java @@ -17,6 +17,9 @@ */ package org.oscim.utils; +import java.util.HashMap; +import java.util.Map; + public class ArrayUtils { public static void reverse(T[] data) { @@ -189,6 +192,18 @@ public class ArrayUtils { return neg ? -val : val; } + /** + * @return the Map with swapped keys and values + */ + public static Map swap(Map map) { + if (map == null) + return null; + Map swap = new HashMap<>(); + for (Map.Entry entry : map.entrySet()) + swap.put(entry.getValue(), entry.getKey()); + return swap; + } + public static boolean withinRange(float[] vec, float min, float max) { for (int i = 0, n = vec.length; i < n; i++) { float v = vec[i];