first simple pbf counter

master
Oliver Tonnhofer 2012-12-26 14:07:30 +01:00
commit d6d3928bfd
1 changed files with 100 additions and 0 deletions

100
parser.go Normal file
View File

@ -0,0 +1,100 @@
package main
import (
"code.google.com/p/goprotobuf/proto"
"encoding/binary"
"fmt"
// "goposm/osmpbf/fileformat"
"bytes"
"compress/zlib"
"io/ioutil"
"log"
"os"
"osmpbf"
)
func nextBlobHeader(file *os.File, offset int64) (position int64, size int32) {
newOffset, err := file.Seek(offset, 0)
if offset != newOffset {
log.Fatal(err)
return
}
position = offset + 4
binary.Read(file, binary.BigEndian, &size)
return
}
func blockPositions(filename string) {
file, err := os.Open(filename)
if err != nil {
log.Fatal(err)
}
var offset int64
var blobHeader = &osmpbf.BlobHeader{}
var blob = &osmpbf.Blob{}
var block = &osmpbf.PrimitiveBlock{}
var nodesCounter, relationsCounter, waysCounter int
for {
position, size := nextBlobHeader(file, offset)
if size == 0 {
break
}
data := make([]byte, size)
file.Read(data)
err = proto.Unmarshal(data, blobHeader)
if err != nil {
log.Fatal("unmarshaling error: ", err)
}
offset = position + int64(size) + int64(blobHeader.GetDatasize())
if blobHeader.GetType() == "OSMHeader" {
fmt.Println("Skip header", blobHeader.GetType())
continue
}
blobData := make([]byte, blobHeader.GetDatasize())
file.Read(blobData)
err = proto.Unmarshal(blobData, blob)
if err != nil {
log.Fatal("unmarshaling error: ", err)
}
buf := bytes.NewBuffer(blob.GetZlibData())
r, err := zlib.NewReader(buf)
if err != nil {
log.Fatal("zlib error: ", err)
}
// raw := make([]byte, blob.GetRawSize())
raw, err := ioutil.ReadAll(r)
// bytes, err := r.Read(raw)
if err != nil {
log.Fatal("zlib read error: ", err)
}
err = proto.Unmarshal(raw, block)
if err != nil {
log.Fatal("unmarshaling error: ", err)
}
for _, group := range block.Primitivegroup {
dense := group.GetDense()
if dense != nil {
nodesCounter += len(dense.Id)
}
nodesCounter += len(group.Nodes)
waysCounter += len(group.Ways)
relationsCounter += len(group.Relations)
}
}
fmt.Printf("nodes: %v\tways: %v\trelations:%v\n", nodesCounter, waysCounter, relationsCounter)
}
func main() {
blockPositions(os.Args[1])
fmt.Println("done")
// osmpbf
}