diff --git a/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5MapDataSource.java b/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5MapDataSource.java index 55962bb..eeece9c 100644 --- a/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5MapDataSource.java +++ b/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5MapDataSource.java @@ -63,11 +63,10 @@ public class Osm5MapDataSource extends OsmMapDataSource { try { InputStream is = openFile(name); SAXParserFactory parserFactory = SAXParserFactory.newInstance(); - boolean ignoreBounds = getConfig().getProperty("ignore-osm-bounds", false); SAXParser parser = parserFactory.newSAXParser(); try { - Osm5XmlHandler handler = new Osm5XmlHandler(ignoreBounds); + Osm5XmlHandler handler = new Osm5XmlHandler(getConfig()); handler.setCollector(mapper); Runnable task = new Runnable() { public void run() { diff --git a/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java b/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java index a94ac40..65c2261 100644 --- a/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java +++ b/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java @@ -31,6 +31,7 @@ import uk.me.parabola.mkgmap.reader.osm.Node; import uk.me.parabola.mkgmap.reader.osm.OsmConverter; import uk.me.parabola.mkgmap.reader.osm.Relation; import uk.me.parabola.mkgmap.reader.osm.Way; +import uk.me.parabola.util.EnhancedProperties; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; @@ -71,11 +72,14 @@ class Osm5XmlHandler extends DefaultHandler { private Runnable endTask; private long nextFakeId = 1; + private final long FAKE_ID_BASE = (1L << 62); private final boolean ignoreBounds; + private final boolean makeRoadNamePOIS; - public Osm5XmlHandler(boolean ignoreBounds) { - this.ignoreBounds = ignoreBounds; + public Osm5XmlHandler(EnhancedProperties props) { + ignoreBounds = props.getProperty("ignore-osm-bounds", false); + makeRoadNamePOIS = props.getProperty("road-name-pois", false); } /** @@ -210,6 +214,32 @@ class Osm5XmlHandler extends DefaultHandler { } else if (mode == MODE_WAY) { if (qName.equals("way")) { + if(makeRoadNamePOIS) { + String wayName = currentWay.getTag("name"); + java.util.List points = currentWay.getPoints(); + int numPoints = points.size(); + if(wayName != null && numPoints > 0) { + Coord middleNodeCoord; + if((numPoints & 1) != 0) + middleNodeCoord = points.get(numPoints / 2); + else { + int i2 = numPoints / 2; + int i1 = i2 - 1; + middleNodeCoord = new Coord((points.get(i1).getLatitude() + + points.get(i2).getLatitude()) / 2, + (points.get(i1).getLongitude() + + points.get(i2).getLongitude()) / 2); + } + if(middleNodeCoord != null) { + long fid = makeFakeId(); + Node middleNode = new Node(fid, middleNodeCoord); + nodeMap.put(fid, middleNode); + + middleNode.addTag("name", wayName); + middleNode.addTag("place", "road_name_POI"); + } + } + } mode = 0; currentWay = null; // ways are processed at the end of the document, @@ -376,11 +406,15 @@ class Osm5XmlHandler extends DefaultHandler { // if that fails, fake a (hopefully) unique value Long fakeIdVal = fakeIdMap.get(id); if(fakeIdVal == null) { - fakeIdVal = (1L << 62) + nextFakeId++; + fakeIdVal = makeFakeId(); fakeIdMap.put(id, fakeIdVal); } //System.out.printf("%s = 0x%016x\n", id, fakeIdVal); return fakeIdVal; } } + + private long makeFakeId() { + return FAKE_ID_BASE + nextFakeId++; + } }