use generator for BlockPositions

master
Oliver Tonnhofer 2013-01-21 20:19:37 +01:00
parent 108982a729
commit 354c89945c
1 changed files with 27 additions and 7 deletions

View File

@ -20,6 +20,12 @@ type PBF struct {
offset int64
}
type BlockPosition struct {
filename string
offset int64
size int32
}
func Open(filename string) (f *PBF, err error) {
file, err := os.Open(filename)
if err != nil {
@ -43,6 +49,21 @@ func (pbf *PBF) NextDataPosition() (offset int64, size int32) {
return
}
func (pbf *PBF) BlockPositions() (positions chan BlockPosition) {
positions = make(chan BlockPosition)
go func() {
for {
offset, size := pbf.NextDataPosition()
if size == 0 {
close(positions)
return
}
positions <- BlockPosition{pbf.filename, offset, size}
}
}()
return
}
func (pbf *PBF) nextBlobHeaderSize() (size int32) {
pbf.offset += 4
binary.Read(pbf.file, binary.BigEndian, &size)
@ -149,20 +170,19 @@ func ReadDenseNodes(dense *osmpbf.DenseNodes, block *osmpbf.PrimitiveBlock) (nod
func blockPositions(filename string) {
pbf, err := Open(filename)
file, err := os.Open(filename)
if err != nil {
log.Fatal(err)
}
var nodesCounter, relationsCounter, waysCounter int
for {
offset, size := pbf.NextDataPosition()
if size == 0 {
break
for pos := range pbf.BlockPositions() {
file, err := os.Open(pos.filename)
if err != nil {
log.Fatal(err)
}
block := ReadPrimitiveBlock(file, offset, size)
block := ReadPrimitiveBlock(file, pos.offset, pos.size)
for _, group := range block.Primitivegroup {
dense := group.GetDense()