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];