PostGIS  3.1.6dev-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 1375 of file mvt.c.

1376 {
1377  const uint32_t key_offset = layer->n_keys;
1378  const uint32_t value_offset = layer->n_values;
1379  const uint32_t feature_offset = layer->n_features;
1380 
1381  if (!layer->n_keys)
1382  {
1383  layer->keys = layer2->keys;
1384  layer->n_keys = layer2->n_keys;
1385  }
1386  else if (layer2->n_keys)
1387  {
1388  layer->keys = repalloc(layer->keys, sizeof(char *) * (layer->n_keys + layer2->n_keys));
1389  memcpy(&layer->keys[key_offset], layer2->keys, sizeof(char *) * layer2->n_keys);
1390  layer->n_keys += layer2->n_keys;
1391  }
1392 
1393  if (!layer->n_values)
1394  {
1395  layer->values = layer2->values;
1396  layer->n_values = layer2->n_values;
1397  }
1398  else if (layer2->n_values)
1399  {
1400  layer->values =
1401  repalloc(layer->values, sizeof(VectorTile__Tile__Value *) * (layer->n_values + layer2->n_values));
1402  memcpy(
1403  &layer->values[value_offset], layer2->values, sizeof(VectorTile__Tile__Value *) * layer2->n_values);
1404  layer->n_values += layer2->n_values;
1405  }
1406 
1407  if (!layer->n_features)
1408  {
1409  layer->features = layer2->features;
1410  layer->n_features = layer2->n_features;
1411  }
1412  else if (layer2->n_features)
1413  {
1414  layer->features = repalloc(
1415  layer->features, sizeof(VectorTile__Tile__Feature *) * (layer->n_features + layer2->n_features));
1416  memcpy(&layer->features[feature_offset], layer2->features, sizeof(char *) * layer2->n_features);
1417  layer->n_features += layer2->n_features;
1418  /* We need to adapt the indexes of the copied features */
1419  for (uint32_t i = feature_offset; i < layer->n_features; i++)
1420  {
1421  for (uint32_t t = 0; t < layer->features[i]->n_tags; t += 2)
1422  {
1423  layer->features[i]->tags[t] += key_offset;
1424  layer->features[i]->tags[t + 1] += value_offset;
1425  }
1426  }
1427  }
1428 
1429  return layer;
1430 }

Referenced by vectortile_tile_combine().

Here is the caller graph for this function: