PostGIS  3.3.9dev-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 1167 of file mvt.c.

1168 {
1169  const uint32_t key_offset = layer->n_keys;
1170  const uint32_t value_offset = layer->n_values;
1171  const uint32_t feature_offset = layer->n_features;
1172 
1173  if (!layer->n_keys)
1174  {
1175  layer->keys = layer2->keys;
1176  layer->n_keys = layer2->n_keys;
1177  }
1178  else if (layer2->n_keys)
1179  {
1180  layer->keys = repalloc(layer->keys, sizeof(char *) * (layer->n_keys + layer2->n_keys));
1181  memcpy(&layer->keys[key_offset], layer2->keys, sizeof(char *) * layer2->n_keys);
1182  layer->n_keys += layer2->n_keys;
1183  }
1184 
1185  if (!layer->n_values)
1186  {
1187  layer->values = layer2->values;
1188  layer->n_values = layer2->n_values;
1189  }
1190  else if (layer2->n_values)
1191  {
1192  layer->values =
1193  repalloc(layer->values, sizeof(VectorTile__Tile__Value *) * (layer->n_values + layer2->n_values));
1194  memcpy(
1195  &layer->values[value_offset], layer2->values, sizeof(VectorTile__Tile__Value *) * layer2->n_values);
1196  layer->n_values += layer2->n_values;
1197  }
1198 
1199  if (!layer->n_features)
1200  {
1201  layer->features = layer2->features;
1202  layer->n_features = layer2->n_features;
1203  }
1204  else if (layer2->n_features)
1205  {
1206  layer->features = repalloc(
1207  layer->features, sizeof(VectorTile__Tile__Feature *) * (layer->n_features + layer2->n_features));
1208  memcpy(&layer->features[feature_offset], layer2->features, sizeof(char *) * layer2->n_features);
1209  layer->n_features += layer2->n_features;
1210  /* We need to adapt the indexes of the copied features */
1211  for (uint32_t i = feature_offset; i < layer->n_features; i++)
1212  {
1213  for (uint32_t t = 0; t < layer->features[i]->n_tags; t += 2)
1214  {
1215  layer->features[i]->tags[t] += key_offset;
1216  layer->features[i]->tags[t + 1] += value_offset;
1217  }
1218  }
1219  }
1220 
1221  return layer;
1222 }

Referenced by vectortile_tile_combine().

Here is the caller graph for this function: