func writeNodes(file *os.File, nodes []node) error { if len(nodes) == 0 { return nil } for nodeGroupIndex := 0; nodeGroupIndex < (len(nodes)/8000)+1; nodeGroupIndex++ { beg := (nodeGroupIndex + 0) * 8000 end := (nodeGroupIndex + 1) * 8000 if len(nodes) < end { end = len(nodes) } nodeGroup := nodes[beg:end] stringTable := make([][]byte, 1, 1000) stringTableIndexes := make(map[string]uint32, 0) for _, node := range nodeGroup { for _, s := range node.keys { idx := stringTableIndexes[s] if idx == 0 { stringTableIndexes[s] = uint32(len(stringTable)) stringTable = append(stringTable, []byte(s)) } } for _, s := range node.values { idx := stringTableIndexes[s] if idx == 0 { stringTableIndexes[s] = uint32(len(stringTable)) stringTable = append(stringTable, []byte(s)) } } } osmNodes := make([]*OSMPBF.Node, len(nodeGroup)) for idx, node := range nodeGroup { osmNode := &OSMPBF.Node{} var nodeId int64 = node.id osmNode.Id = &nodeId var rawlon int64 = int64(node.lon/.000000001) / 100 var rawlat int64 = int64(node.lat/.000000001) / 100 osmNode.Lon = &rawlon osmNode.Lat = &rawlat osmNode.Keys = make([]uint32, len(node.keys)) for i, s := range node.keys { osmNode.Keys[i] = stringTableIndexes[s] } osmNode.Vals = make([]uint32, len(node.values)) for i, s := range node.values { osmNode.Vals[i] = stringTableIndexes[s] } osmNodes[idx] = osmNode } group := OSMPBF.PrimitiveGroup{} group.Nodes = osmNodes block := OSMPBF.PrimitiveBlock{} block.Stringtable = &OSMPBF.StringTable{stringTable, nil} block.Primitivegroup = []*OSMPBF.PrimitiveGroup{&group} err := WriteBlock(file, &block, "OSMData") if err != nil { return err } } return nil }