PostGIS  3.2.2dev-r@@SVN_REVISION@@

◆ vectortile_layer_combine()

static VectorTile__Tile__Layer* vectortile_layer_combine ( VectorTile__Tile__Layer *  layer,
VectorTile__Tile__Layer *  layer2 
)
static

Combine 2 layers.

This is going to push everything from layer2 into layer1 We can do this because both sources and the result live in the same aggregation context so we are good as long as we don't free anything from the sources

TODO: Apply hash to remove duplicates (https://trac.osgeo.org/postgis/ticket/4310)

Definition at line 1141 of file mvt.c.

1142 {
1143  const uint32_t key_offset = layer->n_keys;
1144  const uint32_t value_offset = layer->n_values;
1145  const uint32_t feature_offset = layer->n_features;
1146 
1147  if (!layer->n_keys)
1148  {
1149  layer->keys = layer2->keys;
1150  layer->n_keys = layer2->n_keys;
1151  }
1152  else if (layer2->n_keys)
1153  {
1154  layer->keys = repalloc(layer->keys, sizeof(char *) * (layer->n_keys + layer2->n_keys));
1155  memcpy(&layer->keys[key_offset], layer2->keys, sizeof(char *) * layer2->n_keys);
1156  layer->n_keys += layer2->n_keys;
1157  }
1158 
1159  if (!layer->n_values)
1160  {
1161  layer->values = layer2->values;
1162  layer->n_values = layer2->n_values;
1163  }
1164  else if (layer2->n_values)
1165  {
1166  layer->values =
1167  repalloc(layer->values, sizeof(VectorTile__Tile__Value *) * (layer->n_values + layer2->n_values));
1168  memcpy(
1169  &layer->values[value_offset], layer2->values, sizeof(VectorTile__Tile__Value *) * layer2->n_values);
1170  layer->n_values += layer2->n_values;
1171  }
1172 
1173  if (!layer->n_features)
1174  {
1175  layer->features = layer2->features;
1176  layer->n_features = layer2->n_features;
1177  }
1178  else if (layer2->n_features)
1179  {
1180  layer->features = repalloc(
1181  layer->features, sizeof(VectorTile__Tile__Feature *) * (layer->n_features + layer2->n_features));
1182  memcpy(&layer->features[feature_offset], layer2->features, sizeof(char *) * layer2->n_features);
1183  layer->n_features += layer2->n_features;
1184  /* We need to adapt the indexes of the copied features */
1185  for (uint32_t i = feature_offset; i < layer->n_features; i++)
1186  {
1187  for (uint32_t t = 0; t < layer->features[i]->n_tags; t += 2)
1188  {
1189  layer->features[i]->tags[t] += key_offset;
1190  layer->features[i]->tags[t + 1] += value_offset;
1191  }
1192  }
1193  }
1194 
1195  return layer;
1196 }

Referenced by vectortile_tile_combine().

Here is the caller graph for this function: