use delta encoding for way.Ref

master
Oliver Tonnhofer 2013-05-13 14:24:57 +02:00
parent 77b999274d
commit 460f386a24
3 changed files with 45 additions and 1 deletions

View File

@ -83,10 +83,30 @@ func UnmarshalNode(data []byte) (node *element.Node, err error) {
return node, nil
}
func deltaPack(data []int64) {
if len(data) < 2 {
return
}
lastVal := data[0]
for i := 1; i < len(data); i++ {
data[i], lastVal = data[i]-lastVal, data[i]
}
}
func deltaUnpack(data []int64) {
if len(data) < 2 {
return
}
for i := 1; i < len(data); i++ {
data[i] = data[i] + data[i-1]
}
}
func MarshalWay(way *element.Way) ([]byte, error) {
// TODO reuse Way to avoid make(Tags) for each way in TagsAsArray
pbfWay := &Way{}
pbfWay.Id = &way.Id
deltaPack(way.Refs)
pbfWay.Refs = way.Refs
pbfWay.Tags = way.TagsAsArray()
return proto.Marshal(pbfWay)
@ -101,6 +121,7 @@ func UnmarshalWay(data []byte) (way *element.Way, err error) {
way = &element.Way{}
way.Id = *pbfWay.Id
deltaUnpack(pbfWay.Refs)
way.Refs = pbfWay.Refs
way.TagsFromArray(pbfWay.Tags)
return way, nil
@ -109,6 +130,7 @@ func UnmarshalWay(data []byte) (way *element.Way, err error) {
func MarshalRelation(relation *element.Relation) ([]byte, error) {
pbfRelation := &Relation{}
pbfRelation.Id = &relation.Id
// TODO store members
//pbfRelation.Members = relation.Members
pbfRelation.Tags = relation.TagsAsArray()
return proto.Marshal(pbfRelation)

View File

@ -73,3 +73,25 @@ func TestMarshalWay(t *testing.T) {
}
}
func TestDeltaPack(t *testing.T) {
ids := []int64{1000, 999, 1001, -8, 1234}
deltaPack(ids)
for i, id := range []int64{1000, -1, 2, -1009, 1242} {
if ids[i] != id {
t.Fatal(ids[i], id, ids)
}
}
}
func TestDeltaUnpack(t *testing.T) {
ids := []int64{1000, -1, 2, -1009, 1242}
deltaUnpack(ids)
for i, id := range []int64{1000, 999, 1001, -8, 1234} {
if ids[i] != id {
t.Fatal(ids[i], id, ids)
}
}
}

View File

@ -289,7 +289,7 @@ func main() {
for i := 0; i < runtime.NumCPU(); i++ {
waitFill.Add(1)
go func() {
m := mapping.WayTagFilter()
// m := mapping.WayTagFilter()
var err error
geos := geos.NewGEOS()
defer geos.Finish()