2014-10-27 48 views
2

我正在從開放的街道地圖上使用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

您是否檢查PBF文件是否損壞?是否可以用其他工具閱讀,如[osmosis](https://wiki.openstreetmap.org/wiki/Osmosis)? – scai 2014-10-28 08:01:45

+0

是的,我檢查過,它沒有損壞。 – Moe 2014-10-28 13:23:47

回答

0

OpenStreetMap .pbf文件不是簡單的protobufs。在這裏看到的文檔:

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

下節 「文件格式」,你會看到這一點:

格式的重複序列:

  • INT4:網絡字節順序中BlobHeader消息的長度
  • 序列化BlobHeader消息
  • 串行化斑點消息(大小在頭給出)

即,該文件的開始是第一protobuf的消息之前一個4字節整數。由於這個整數可能小於2^24,所以第一個字節當然是0,這就解釋了你所看到的確切例外。

您需要手動讀取此4字節值,然後確保只讀取那麼多字節並將它們解析爲BlobHeader,依此類推。

就我個人而言,我建議尋找一個PBF解碼器庫,它已經爲你處理。那裏一定有幾個。