我正在使用开放街道地图中的pbf文件
我想解析节点,关系和方法。
当我尝试解析节点时,我收到了该消息。
代码看起来像
package myCode;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import protpbufCode.OsmPbf;
import protpbufCode.OsmPbf.Node;
import protpbufCode.OsmPbf.PrimitiveGroup;
public class ReadingPBF
{
public static void print(PrimitiveGroup node)
{
for (Node m: node.getNodesList())
{
System.out.print("Person ID: " + m.getId() + " ");
System.out.print(" Lat: " + m.getLat()+ " ");
System.out.print(" Long: "+ m.getLon()+ " ");
System.out.println("");
}
}
public static void main (String args[])
{
try
{
PrimitiveGroup newNode = PrimitiveGroup.parseFrom(new FileInputStream(new File("isle.pbf")));
print(newNode);
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println(e.getMessage());
System.out.println(e.getCause());
}
}
}
OsmPbf是使用protobuf编译器创建的java类。
打印出来的东西。
com.google.protobuf.InvalidProtocolBufferException: Protocol message contained an invalid tag (zero).
at com.google.protobuf.InvalidProtocolBufferException.invalidTag(InvalidProtocolBufferException.java:89)
at com.google.protobuf.CodedInputStream.readTag(CodedInputStream.java:158)
at protpbufCode.OsmPbf$PrimitiveGroup.<init>(OsmPbf.java:5230)
at protpbufCode.OsmPbf$PrimitiveGroup.<init>(OsmPbf.java:5219)
at protpbufCode.OsmPbf$PrimitiveGroup$1.parsePartialFrom(OsmPbf.java:5329)
at protpbufCode.OsmPbf$PrimitiveGroup$1.parsePartialFrom(OsmPbf.java:1)
at com.google.protobuf.AbstractParser.parsePartialFrom(AbstractParser.java:192)
at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:209)
at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:215)
at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:49)
at protpbufCode.OsmPbf$PrimitiveGroup.parseFrom(OsmPbf.java:5627)
at myCode.ReadingPBF.main(ReadingPBF.java:33)
Protocol message contained an invalid tag (zero).
null
答案 0 :(得分:1)
OpenStreetMap .pbf文件不是简单的protobufs。请参阅此处的文档:
http://wiki.openstreetmap.org/wiki/PBF_Format
在“文件格式”部分下,您会看到:
格式是重复序列:
- int4:网络字节顺序中BlobHeader消息的长度
- 序列化BlobHeader消息
- 序列化的Blob消息(标题中给出了大小)
也就是说,文件在第一个protobuf消息之前以4字节整数开始。由于这个整数可能小于2 ^ 24,因此第一个字节当然是零,这解释了你所看到的确切异常。
您需要手动读取此4字节值,然后确保只读取那么多字节并将其解析为BlobHeader
,依此类推。
就个人而言,我建议寻找已经为您处理此问题的PBF解码器库。那里肯定有一些。