diff --git a/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/layers/tile/vector/VectorTileLoader.java b/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/layers/tile/vector/VectorTileLoader.java
index eef9eb96..fa69f946 100644
--- a/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/layers/tile/vector/VectorTileLoader.java
+++ b/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/layers/tile/vector/VectorTileLoader.java
@@ -68,8 +68,8 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
// replacement for variable value tags that should not be matched by RenderTheme
// FIXME make this general, maybe subclass tags
- private static final Tag mTagEmptyName = new Tag(Tag.TAG_KEY_NAME, null, false);
- private static final Tag mTagEmptyHouseNr = new Tag(Tag.TAG_KEY_HOUSE_NUMBER, null, false);
+ private static final Tag mTagEmptyName = new Tag(Tag.KEY_NAME, null, false);
+ private static final Tag mTagEmptyHouseNr = new Tag(Tag.KEY_HOUSE_NUMBER, null, false);
private IRenderTheme renderTheme;
private int renderLevels;
@@ -208,12 +208,12 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
for (int i = 0; i < in.numTags; i++) {
String key = tags[i].key;
- if (key == Tag.TAG_KEY_NAME) {
+ if (key == Tag.KEY_NAME) {
if (tags[i].value != null) {
mTagName = tags[i];
tags[i] = mTagEmptyName;
}
- } else if (key == Tag.TAG_KEY_HOUSE_NUMBER) {
+ } else if (key == Tag.KEY_HOUSE_NUMBER) {
if (tags[i].value != null) {
mTagHouseNr = tags[i];
tags[i] = mTagEmptyHouseNr;
@@ -221,7 +221,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
} else if (mTile.zoomLevel > 16) {
// FIXME, allow overlays to intercept
// this, or use a theme option for this
- if (key == Tag.TAG_KEY_BUILDING)
+ if (key == Tag.KEY_BUILDING)
mRenderBuildingModel = true;
else if (key == Tag.KEY_HEIGHT) {
try {
@@ -381,10 +381,10 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
private String textValueForKey(Text text) {
String value = null;
- if (text.textKey == Tag.TAG_KEY_NAME) {
+ if (text.textKey == Tag.KEY_NAME) {
if (mTagName != null)
value = mTagName.value;
- } else if (text.textKey == Tag.TAG_KEY_HOUSE_NUMBER) {
+ } else if (text.textKey == Tag.KEY_HOUSE_NUMBER) {
if (mTagHouseNr != null)
value = mTagHouseNr.value;
}
diff --git a/vtm/src/org/oscim/core/Tag.java b/vtm/src/org/oscim/core/Tag.java
index 98210830..455f581b 100644
--- a/vtm/src/org/oscim/core/Tag.java
+++ b/vtm/src/org/oscim/core/Tag.java
@@ -1,5 +1,6 @@
/*
* Copyright 2010, 2011, 2012 mapsforge.org
+ * Copyright 2013 Hannes Janetzek
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
@@ -15,47 +16,32 @@
package org.oscim.core;
/**
- * A tag represents an immutable key-value pair.
+ * A tag represents an immutable key-value pair. Keys are always intern().
*/
-// TODO: use own stringshare method instead of internalized strings
-
public class Tag {
- private static final char KEY_VALUE_SEPARATOR = '=';
- /**
- * The key of the house number OpenStreetMap tag.
- */
- public static final String TAG_KEY_HOUSE_NUMBER = "addr:housenumber";
+ /** The key of the house number OpenStreetMap tag. */
+ public static final String KEY_HOUSE_NUMBER = "addr:housenumber";
- /**
- * The key of the name OpenStreetMap tag.
- */
- public static final String TAG_KEY_NAME = "name";
+ /** The key of the name OpenStreetMap tag. */
+ public static final String KEY_NAME = "name";
- /**
- * The key of the reference OpenStreetMap tag.
- */
- public static final String TAG_KEY_REF = "ref";
+ /** The key of the reference OpenStreetMap tag. */
+ public static final String KEY_REF = "ref";
- /**
- * The key of the elevation OpenStreetMap tag.
- */
- public static final String TAG_KEY_ELE = "ele";
-
- public static final String TAG_KEY_AMENITY = "amenity";
-
- /**
- * The key of the elevation OpenStreetMap tag.
- */
- public static final String TAG_KEY_BUILDING = "building";
- public static final String TAG_KEY_HIGHWAY = "highway";
- public static final String TAG_KEY_LANDUSE = "landuse";
- public static final String VALUE_YES = "yes";
- public static final String VALUE_NO = "no";
+ /** The key of the elevation OpenStreetMap tag. */
+ public static final String KEY_ELE = "ele";
+ public static final String KEY_AMENITY = "amenity";
+ public static final String KEY_BUILDING = "building";
+ public static final String KEY_HIGHWAY = "highway";
+ public static final String KEY_LANDUSE = "landuse";
public static final String KEY_HEIGHT = "height";
public static final String KEY_MIN_HEIGHT = "min_height";
+ public static final String VALUE_YES = "yes";
+ public static final String VALUE_NO = "no";
+
/**
* The key of this tag.
*/
@@ -66,23 +52,12 @@ public class Tag {
*/
public String value;
- private int hashCodeValue = 0;
+ /**
+ * true when value is intern().
+ */
private final boolean intern;
- /**
- * @param tag
- * the textual representation of the tag.
- */
-
- public Tag(String tag) {
- int splitPosition = tag.indexOf(KEY_VALUE_SEPARATOR);
- if (splitPosition < 0) {
- System.out.println("TAG:" + tag);
- }
- this.key = tag.substring(0, splitPosition).intern();
- this.value = tag.substring(splitPosition + 1).intern();
- this.intern = true;
- }
+ private int hashCodeValue = 0;
/**
* @param key
@@ -165,4 +140,17 @@ public class Tag {
result = 31 * result + ((this.value == null) ? 0 : this.value.hashCode());
return result;
}
+
+ /**
+ * @param tag
+ * the textual representation of the tag.
+ */
+ public static Tag parse(String tag) {
+ int splitPosition = tag.indexOf("=");
+ if (splitPosition < 0) {
+ return new Tag(tag, "");
+ }
+
+ return new Tag(tag.substring(0, splitPosition), tag.substring(splitPosition + 1));
+ }
}
diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java
index b16ebdc8..4adbfb4f 100644
--- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java
+++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java
@@ -61,8 +61,8 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
// replacement for variable value tags that should not be matched by RenderTheme
// FIXME make this general, maybe subclass tags
- private static final Tag mTagEmptyName = new Tag(Tag.TAG_KEY_NAME, null, false);
- private static final Tag mTagEmptyHouseNr = new Tag(Tag.TAG_KEY_HOUSE_NUMBER, null, false);
+ private static final Tag mTagEmptyName = new Tag(Tag.KEY_NAME, null, false);
+ private static final Tag mTagEmptyHouseNr = new Tag(Tag.KEY_HOUSE_NUMBER, null, false);
// private final MapElement mDebugWay, mDebugPoint;
@@ -187,12 +187,12 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
for (int i = 0; i < in.numTags; i++) {
String key = tags[i].key;
- if (tags[i].key == Tag.TAG_KEY_NAME) {
+ if (tags[i].key == Tag.KEY_NAME) {
if (tags[i].value != null) {
mTagName = tags[i];
tags[i] = mTagEmptyName;
}
- } else if (tags[i].key == Tag.TAG_KEY_HOUSE_NUMBER) {
+ } else if (tags[i].key == Tag.KEY_HOUSE_NUMBER) {
if (tags[i].value != null) {
mTagHouseNr = tags[i];
tags[i] = mTagEmptyHouseNr;
@@ -200,7 +200,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
} else if (mTile.zoomLevel > 16) {
// FIXME, allow overlays to intercept
// this, or use a theme option for this
- if (key == Tag.TAG_KEY_BUILDING)
+ if (key == Tag.KEY_BUILDING)
mRenderBuildingModel = true;
else if (key == Tag.KEY_HEIGHT) {
@@ -369,10 +369,10 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
private String textValueForKey(Text text) {
String value = null;
- if (text.textKey == Tag.TAG_KEY_NAME) {
+ if (text.textKey == Tag.KEY_NAME) {
if (mTagName != null)
value = mTagName.value;
- } else if (text.textKey == Tag.TAG_KEY_HOUSE_NUMBER) {
+ } else if (text.textKey == Tag.KEY_HOUSE_NUMBER) {
if (mTagHouseNr != null)
value = mTagHouseNr.value;
}
diff --git a/vtm/src/org/oscim/tiling/source/mapfile/MapDatabase.java b/vtm/src/org/oscim/tiling/source/mapfile/MapDatabase.java
index fb3ddf27..3fab858e 100644
--- a/vtm/src/org/oscim/tiling/source/mapfile/MapDatabase.java
+++ b/vtm/src/org/oscim/tiling/source/mapfile/MapDatabase.java
@@ -503,7 +503,7 @@ public class MapDatabase implements ITileDataSource {
// check if the POI has a name
if ((featureByte & POI_FEATURE_NAME) != 0) {
String str = mReadBuffer.readUTF8EncodedString();
- mElem.tags.add(new Tag(Tag.TAG_KEY_NAME, str, false));
+ mElem.tags.add(new Tag(Tag.KEY_NAME, str, false));
}
// check if the POI has a house number
@@ -801,30 +801,30 @@ public class MapDatabase implements ITileDataSource {
if (hasName) {
int textPos = mReadBuffer.readUnsignedInt();
String str = mReadBuffer.readUTF8EncodedStringAt(stringOffset + textPos);
- mElem.tags.add(new Tag(Tag.TAG_KEY_NAME, str, false));
+ mElem.tags.add(new Tag(Tag.KEY_NAME, str, false));
}
if (hasHouseNr) {
int textPos = mReadBuffer.readUnsignedInt();
String str = mReadBuffer.readUTF8EncodedStringAt(stringOffset + textPos);
- mElem.tags.add(new Tag(Tag.TAG_KEY_HOUSE_NUMBER, str, false));
+ mElem.tags.add(new Tag(Tag.KEY_HOUSE_NUMBER, str, false));
}
if (hasRef) {
int textPos = mReadBuffer.readUnsignedInt();
String str = mReadBuffer.readUTF8EncodedStringAt(stringOffset + textPos);
- mElem.tags.add(new Tag(Tag.TAG_KEY_REF, str, false));
+ mElem.tags.add(new Tag(Tag.KEY_REF, str, false));
}
} else {
if (hasName) {
String str = mReadBuffer.readUTF8EncodedString();
- mElem.tags.add(new Tag(Tag.TAG_KEY_NAME, str, false));
+ mElem.tags.add(new Tag(Tag.KEY_NAME, str, false));
}
if (hasHouseNr) {
String str = mReadBuffer.readUTF8EncodedString();
- mElem.tags.add(new Tag(Tag.TAG_KEY_HOUSE_NUMBER, str, false));
+ mElem.tags.add(new Tag(Tag.KEY_HOUSE_NUMBER, str, false));
}
if (hasRef) {
String str = mReadBuffer.readUTF8EncodedString();
- mElem.tags.add(new Tag(Tag.TAG_KEY_REF, str, false));
+ mElem.tags.add(new Tag(Tag.KEY_REF, str, false));
}
}
if ((featureByte & WAY_FEATURE_LABEL_POSITION) != 0)
diff --git a/vtm/src/org/oscim/tiling/source/mapfile/header/RequiredFields.java b/vtm/src/org/oscim/tiling/source/mapfile/header/RequiredFields.java
index b51e3f0b..31f5638d 100644
--- a/vtm/src/org/oscim/tiling/source/mapfile/header/RequiredFields.java
+++ b/vtm/src/org/oscim/tiling/source/mapfile/header/RequiredFields.java
@@ -171,7 +171,7 @@ final class RequiredFields {
if (tag == null) {
return new OpenResult("POI tag must not be null: " + currentTagId);
}
- poiTags[currentTagId] = new Tag(tag);
+ poiTags[currentTagId] = Tag.parse(tag);
}
mapFileInfoBuilder.poiTags = poiTags;
return OpenResult.SUCCESS;
@@ -227,7 +227,7 @@ final class RequiredFields {
if (tag == null) {
return new OpenResult("way tag must not be null: " + currentTagId);
}
- wayTags[currentTagId] = new Tag(tag);
+ wayTags[currentTagId] = Tag.parse(tag);
}
mapFileInfoBuilder.wayTags = wayTags;
return OpenResult.SUCCESS;
diff --git a/vtm/src/org/oscim/tiling/source/mapnik/TileDecoder.java b/vtm/src/org/oscim/tiling/source/mapnik/TileDecoder.java
index 84c20af8..d3ed7fd5 100644
--- a/vtm/src/org/oscim/tiling/source/mapnik/TileDecoder.java
+++ b/vtm/src/org/oscim/tiling/source/mapnik/TileDecoder.java
@@ -175,7 +175,7 @@ public class TileDecoder extends PbfDecoder {
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
- if (!key.startsWith(Tag.TAG_KEY_NAME))
+ if (!key.startsWith(Tag.KEY_NAME))
continue;
int len = key.length();
if (len == 4) {
@@ -222,7 +222,7 @@ public class TileDecoder extends PbfDecoder {
if (keyIdx == matchedLocal) {
hasName = true;
- f.elem.tags.add(new Tag(Tag.TAG_KEY_NAME, val, false));
+ f.elem.tags.add(new Tag(Tag.KEY_NAME, val, false));
} else {
key = keys.get(keyIdx);
@@ -231,7 +231,7 @@ public class TileDecoder extends PbfDecoder {
}
if (!hasName && fallbackName != null)
- f.elem.tags.add(new Tag(Tag.TAG_KEY_NAME, fallbackName, false));
+ f.elem.tags.add(new Tag(Tag.KEY_NAME, fallbackName, false));
// FIXME extract layer tag here
f.elem.setLayer(5);
diff --git a/vtm/src/org/oscim/tiling/source/oscimap/TileDecoder.java b/vtm/src/org/oscim/tiling/source/oscimap/TileDecoder.java
index fea0c277..33cb6fac 100644
--- a/vtm/src/org/oscim/tiling/source/oscimap/TileDecoder.java
+++ b/vtm/src/org/oscim/tiling/source/oscimap/TileDecoder.java
@@ -130,19 +130,20 @@ public class TileDecoder extends PbfDecoder {
String tagString = decodeString();
if (tagString == null || tagString.length() == 0) {
- curTags[mCurTagCnt++] = new Tag(Tag.TAG_KEY_NAME, "...");
+ curTags[mCurTagCnt++] = new Tag(Tag.KEY_NAME, "...");
return false;
}
Tag tag = tagHash.get(tagString);
if (tag == null) {
- if (tagString.startsWith(Tag.TAG_KEY_NAME))
- tag = new Tag(Tag.TAG_KEY_NAME, tagString.substring(5), false);
+ if (tagString.startsWith(Tag.KEY_NAME))
+ tag = new Tag(Tag.KEY_NAME, tagString.substring(5), false);
else
- tag = new Tag(tagString);
+ tag = Tag.parse(tagString);
- tagHash.put(tagString, tag);
+ if (tag != null)
+ tagHash.put(tagString, tag);
}
if (mCurTagCnt >= MAX_TILE_TAGS) {
diff --git a/vtm/src/org/oscim/tiling/source/oscimap2/OSciMap2TileSource.java b/vtm/src/org/oscim/tiling/source/oscimap2/OSciMap2TileSource.java
index b7c36912..0db5761b 100644
--- a/vtm/src/org/oscim/tiling/source/oscimap2/OSciMap2TileSource.java
+++ b/vtm/src/org/oscim/tiling/source/oscimap2/OSciMap2TileSource.java
@@ -155,7 +155,7 @@ public class OSciMap2TileSource extends UrlTileSource {
String key = Tags.keys[mSArray[curTag]];
Tag tag;
- if (key == Tag.TAG_KEY_NAME)
+ if (key == Tag.KEY_NAME)
tag = new Tag(key, tagString, false);
else
tag = new Tag(key, tagString, true);
diff --git a/vtm/src/org/oscim/tiling/source/oscimap4/TileDecoder.java b/vtm/src/org/oscim/tiling/source/oscimap4/TileDecoder.java
index 6d2bb862..5d709597 100644
--- a/vtm/src/org/oscim/tiling/source/oscimap4/TileDecoder.java
+++ b/vtm/src/org/oscim/tiling/source/oscimap4/TileDecoder.java
@@ -209,12 +209,12 @@ public class TileDecoder extends PbfDecoder {
// FIXME filter out all variable tags
// might depend on theme though
- if (key == Tag.TAG_KEY_NAME
+ if (key == Tag.KEY_NAME
|| key == Tag.KEY_HEIGHT
|| key == Tag.KEY_MIN_HEIGHT
- || key == Tag.TAG_KEY_HOUSE_NUMBER
- || key == Tag.TAG_KEY_REF
- || key == Tag.TAG_KEY_ELE)
+ || key == Tag.KEY_HOUSE_NUMBER
+ || key == Tag.KEY_REF
+ || key == Tag.KEY_ELE)
tag = new Tag(key, val, false);
else
tag = new Tag(key, val, true);