我正在使用开放街道地图中的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

最佳答案

OpenStreetMap .pbf文件不是简单的协议。请参阅此处的文档:

http://wiki.openstreetmap.org/wiki/PBF_Format

在“文件格式”部分下,您会看到以下内容:


  格式是以下重复序列:
  
  
  int4:BlobHeader消息的长度,以网络字节顺序
  序列化的BlobHeader消息
  序列化的Blob消息(大小在标头中给出)
  


也就是说,文件在第一个protobuf消息之前以4字节整数开头。由于此整数可能小于2 ^ 24,因此第一个字节当然为零,这将说明您所看到的确切异常。

您将需要手动读取此4字节的值,然后确保仅读取那么多的字节并将其解析为BlobHeader,依此类推。

我个人建议您寻找已经为您处理过的PBF解码器库。那里一定有一些。

09-30 12:09
查看更多