static void process_nodes(VALUE out, OSMPBF__PrimitiveGroup *group, OSMPBF__StringTable *string_table, int64_t lat_offset, int64_t lon_offset, int64_t granularity, int32_t ts_granularity) { double lat = 0; double lon = 0; unsigned j = 0; size_t i = 0; for(i = 0; i < group->n_nodes; i++) { OSMPBF__Node *node = group->nodes[i]; VALUE node_out = rb_hash_new(); lat = NANO_DEGREE * (lat_offset + (node->lat * granularity)); lon = NANO_DEGREE * (lon_offset + (node->lon * granularity)); rb_hash_aset(node_out, STR2SYM("id"), LL2NUM(node->id)); rb_hash_aset(node_out, STR2SYM("lat"), FIX7(rb_float_new(lat))); rb_hash_aset(node_out, STR2SYM("lon"), FIX7(rb_float_new(lon))); if(node->info) add_info(node_out, node->info, string_table, ts_granularity); VALUE tags = rb_hash_new(); for(j = 0; j < node->n_keys; j++) { char *key = parse_binary_str(string_table->s[node->keys[j]]); char *value = parse_binary_str(string_table->s[node->vals[j]]); rb_hash_aset(tags, str_new(key), str_new(value)); free(key); free(value); } rb_hash_aset(node_out, STR2SYM("tags"), tags); rb_ary_push(out, node_out); } }
static void process_dense_nodes(VALUE out, OSMPBF__DenseNodes *dense_nodes, OSMPBF__StringTable *string_table, int64_t lat_offset, int64_t lon_offset, int64_t granularity, int32_t ts_granularity) { uint64_t node_id = 0; int64_t delta_lat = 0; int64_t delta_lon = 0; int64_t delta_timestamp = 0; int64_t delta_changeset = 0; int32_t delta_user_sid = 0; int32_t delta_uid = 0; double lat = 0; double lon = 0; unsigned j = 0; size_t i = 0; for(i = 0; i < dense_nodes->n_id; i++) { VALUE node = rb_hash_new(); node_id += dense_nodes->id[i]; delta_lat += dense_nodes->lat[i]; delta_lon += dense_nodes->lon[i]; lat = NANO_DEGREE * (lat_offset + (delta_lat * granularity)); lon = NANO_DEGREE * (lon_offset + (delta_lon * granularity)); rb_hash_aset(node, STR2SYM("id"), LL2NUM(node_id)); rb_hash_aset(node, STR2SYM("lat"), FIX7(rb_float_new(lat))); rb_hash_aset(node, STR2SYM("lon"), FIX7(rb_float_new(lon))); // Extract info if(dense_nodes->denseinfo) { delta_timestamp += dense_nodes->denseinfo->timestamp[i]; delta_changeset += dense_nodes->denseinfo->changeset[i]; delta_user_sid += dense_nodes->denseinfo->user_sid[i]; delta_uid += dense_nodes->denseinfo->uid[i]; OSMPBF__Info info = { .version = dense_nodes->denseinfo->version[i], .timestamp = delta_timestamp, .changeset = delta_changeset, .user_sid = delta_user_sid, .uid = delta_uid }; add_info(node, &info, string_table, ts_granularity); } // Extract tags VALUE tags = rb_hash_new(); if(j < dense_nodes->n_keys_vals) { while((dense_nodes->keys_vals[j] != 0) && (j < dense_nodes->n_keys_vals)) { char *key = parse_binary_str(string_table->s[dense_nodes->keys_vals[j]]); char *value = parse_binary_str(string_table->s[dense_nodes->keys_vals[j+1]]); rb_hash_aset(tags, str_new(key), str_new(value)); free(key); free(value); j += 2; } j += 1; } rb_hash_aset(node, STR2SYM("tags"), tags); rb_ary_push(out, node); } }
"%*1" LETTER "%n\0"; const char LETTER2[] = FIX2( LETTER ) "%n\0"; const char LETTER3[] = FIX3( LETTER ) "%n\0"; const char LETTER4[] = FIX4( LETTER ) "%n\0"; const char LETTER5[] = FIX5( LETTER ) "%n\0"; const char LETTER7[] = FIX7( LETTER ) "%n\0"; const char LETTER8[] = FIX8( LETTER ) "%n\0"; const char LETTER9[] = FIX9( LETTER ) "%n\0"; const char LETTER16[] = FIX16( LETTER ) "%n\0"; /////////////////////////////////////////////////////////////////////////// const char LETTERDIGIT1[] = "%*1" LETTERDIGIT "%n\0";