diff --git a/misc/pbfparser/BPbfBlobDecoder.java b/misc/pbfparser/BPbfBlobDecoder.java index 4bd47e1..06ba406 100644 --- a/misc/pbfparser/BPbfBlobDecoder.java +++ b/misc/pbfparser/BPbfBlobDecoder.java @@ -210,9 +210,19 @@ public class BPbfBlobDecoder } } - private long fromWid; - private long toWid; - private long viaNid; + private LongList fromWid; + private LongList toWid; + private LongList viaNid; + + private LongList addLong( LongList ll, long l ) + { + if ( ll == null ) + { + ll = new LongList( 1 ); + } + ll.add( l ); + return ll; + } private LongList buildRelationMembers( List memberIds, List memberRoles, List memberTypes, @@ -220,7 +230,7 @@ public class BPbfBlobDecoder { LongList wayIds = new LongList( 16 ); - fromWid = toWid = viaNid = 0; + fromWid = toWid = viaNid = null; Iterator memberIdIterator = memberIds.iterator(); Iterator memberRoleIterator = memberRoles.iterator(); @@ -240,12 +250,12 @@ public class BPbfBlobDecoder if ( memberType == Osmformat.Relation.MemberType.WAY ) // currently just waymembers { wayIds.add( refId ); - if ( "from".equals( role ) ) fromWid = refId; - if ( "to".equals( role ) ) toWid = refId; + if ( "from".equals( role ) ) fromWid = addLong( fromWid, refId ); + if ( "to".equals( role ) ) toWid = addLong( toWid, refId ); } if ( memberType == Osmformat.Relation.MemberType.NODE ) // currently just waymembers { - if ( "via".equals( role ) ) viaNid = refId; + if ( "via".equals( role ) ) viaNid = addLong( viaNid, refId ); } } return wayIds; diff --git a/misc/pbfparser/OsmParser.java b/misc/pbfparser/OsmParser.java index 7fd22bd..749a373 100644 --- a/misc/pbfparser/OsmParser.java +++ b/misc/pbfparser/OsmParser.java @@ -92,7 +92,7 @@ public class OsmParser extends MapCreatorBase } } - public void addRelation( long rid, Map tags, LongList wayIds, long fromWid, long toWid, long viaNid ) + public void addRelation( long rid, Map tags, LongList wayIds, LongList fromWid, LongList toWid, LongList viaNid ) { RelationData r = new RelationData( rid, wayIds ); r.setTags( (HashMap)tags ); @@ -100,7 +100,17 @@ public class OsmParser extends MapCreatorBase try { rListener.nextRelation( r ); - rListener.nextRestriction( r, fromWid, toWid, viaNid ); + if ( fromWid == null || toWid == null || viaNid == null || viaNid.size() != 1 ) + { + return; + } + for( int fi = 0; fi < fromWid.size(); fi++ ) + { + for( int ti = 0; ti < toWid.size(); ti++ ) + { + rListener.nextRestriction( r, fromWid.get( fi ), toWid.get( ti ), viaNid.get( 0 ) ); + } + } } catch( Exception e ) { diff --git a/misc/pbfparser/README.txt b/misc/pbfparser/README.txt index bd2bec6..298e3b9 100644 --- a/misc/pbfparser/README.txt +++ b/misc/pbfparser/README.txt @@ -18,5 +18,6 @@ brouter.jar in this folder -> pack all the compiled class files together in a jar "pbfparser.jar" with "jar cf pbfparser.jar btools/**/*.class" -Alternatively, you can run the Mapcreator against a *xml.bz2 Database-Extract, -then you don't need the pbf-parser. +Alternatively, just for testing you can run the Mapcreator against a *xml.bz2 Database-Extract, +then you don't need the pbf-parser. However, the XML-Parser does not (yet) parse +Turn-Restrictions, so really just for testing... diff --git a/misc/pbfparser/compile_parser.bat b/misc/pbfparser/compile_parser.bat index a95926a..7a5452b 100644 --- a/misc/pbfparser/compile_parser.bat +++ b/misc/pbfparser/compile_parser.bat @@ -1 +1 @@ -javac -d . -cp pbfparser.jar;brouter.jar BPbfFieldDecoder.java BPbfBlobDecoder.java OsmParser.java OsmParser2.java +javac -d . -cp pbfparser.jar;brouter.jar BPbfFieldDecoder.java BPbfBlobDecoder.java OsmParser.java