package btools.mapcreator; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.zip.GZIPInputStream; /** * Parser for OSM data * * @author ab */ public class OsmParser extends MapCreatorBase { private BufferedReader _br; private NodeListener nListener; private WayListener wListener; private RelationListener rListener; public void readMap(File mapFile, NodeListener nListener, WayListener wListener, RelationListener rListener) throws Exception { this.nListener = nListener; this.wListener = wListener; this.rListener = rListener; if (mapFile == null) { _br = new BufferedReader(new InputStreamReader(System.in)); } else { if (mapFile.getName().endsWith(".gz")) { _br = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream(mapFile)))); } else { _br = new BufferedReader(new InputStreamReader(new FileInputStream(mapFile))); } } for (; ; ) { String line = _br.readLine(); if (line == null) break; if (checkNode(line)) continue; if (checkWay(line)) continue; if (checkRelation(line)) continue; if (checkChangeset(line)) continue; } if (mapFile != null) { _br.close(); } } private boolean checkNode(String line) throws Exception { int idx0 = line.indexOf("")) { // read additional tags for (; ; ) { String l2 = _br.readLine(); if (l2 == null) return false; int i2; if ((i2 = l2.indexOf("= 0) { // property-tag i2 += 8; int ri2 = l2.indexOf('"', i2); String key = l2.substring(i2, ri2); i2 = l2.indexOf(" v=\"", ri2); if (i2 >= 0) { i2 += 4; int ri3 = l2.indexOf('"', i2); String value = l2.substring(i2, ri3); n.putTag(key, value); } } else if (l2.indexOf("") >= 0) { // end-tag break; } } } nListener.nextNode(n); return true; } private boolean checkWay(String line) throws Exception { int idx0 = line.indexOf("= 0) { // node reference i2 += 9; int ri2 = l2.indexOf('"', i2); long nid = Long.parseLong(l2.substring(i2, ri2)); w.nodes.add(nid); } else if ((i2 = l2.indexOf("= 0) { // property-tag i2 += 8; int ri2 = l2.indexOf('"', i2); String key = l2.substring(i2, ri2); i2 = l2.indexOf(" v=\"", ri2); if (i2 >= 0) { i2 += 4; int ri3 = l2.indexOf('"', i2); String value = l2.substring(i2, ri3); w.putTag(key, value); } } else if (l2.indexOf("") >= 0) { // end-tag break; } } wListener.nextWay(w); return true; } private boolean checkChangeset(String line) throws Exception { int idx0 = line.indexOf("")) { int loopcheck = 0; for (; ; ) { String l2 = _br.readLine(); if (l2.indexOf("") >= 0 || ++loopcheck > 10000) break; } } return true; } private boolean checkRelation(String line) throws Exception { int idx0 = line.indexOf("= 0) { // node reference i2 += 24; int ri2 = l2.indexOf('"', i2); long wid = Long.parseLong(l2.substring(i2, ri2)); r.ways.add(wid); } else if ((i2 = l2.indexOf("= 0) { // property-tag i2 += 8; int ri2 = l2.indexOf('"', i2); String key = l2.substring(i2, ri2); i2 = l2.indexOf(" v=\"", ri2); if (i2 >= 0) { i2 += 4; int ri3 = l2.indexOf('"', i2); String value = l2.substring(i2, ri3); r.putTag(key, value); } } else if (l2.indexOf("") >= 0) { // end-tag break; } } rListener.nextRelation(r); return true; } }