PostGIS  3.4.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 1166 of file mvt.c.

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

Referenced by vectortile_tile_combine().

Here is the caller graph for this function: