PostGIS  3.7.0dev-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 1165 of file mvt.c.

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

Referenced by vectortile_tile_combine().

Here is the caller graph for this function: