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