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);
  }
}
Example #3
0
"%*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";