gpt4 book ai didi

java - 协议(protocol)消息包含无效标记(零)

转载 作者:行者123 更新时间:2023-11-30 11:13:01 25 4
gpt4 key购买 nike

我正在处理来自开放街道 map 的 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 文件不是简单的 protobuf。请参阅此处的文档:

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

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

The format is a repeating sequence of:

  • int4: length of the BlobHeader message in network byte order
  • serialized BlobHeader message
  • serialized Blob message (size is given in the header)

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

您需要手动读取这个 4 字节的值,然后确保只读取那么多字节并将它们解析为 BlobHeader,等等。

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

关于java - 协议(protocol)消息包含无效标记(零),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26598419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com