PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ gserialized_spgist_picksplit_3d()

PGDLLEXPORT Datum gserialized_spgist_picksplit_3d ( PG_FUNCTION_ARGS  )

Definition at line 421 of file gserialized_spgist_3d.c.

422 {
423  spgPickSplitIn *in = (spgPickSplitIn *)PG_GETARG_POINTER(0);
424  spgPickSplitOut *out = (spgPickSplitOut *)PG_GETARG_POINTER(1);
425  BOX3D *centroid;
426  int median, i;
427  double *lowXs = palloc(sizeof(double) * in->nTuples);
428  double *highXs = palloc(sizeof(double) * in->nTuples);
429  double *lowYs = palloc(sizeof(double) * in->nTuples);
430  double *highYs = palloc(sizeof(double) * in->nTuples);
431  double *lowZs = palloc(sizeof(double) * in->nTuples);
432  double *highZs = palloc(sizeof(double) * in->nTuples);
433  int32_t srid = SRID_UNKNOWN;
434 
435  /* Calculate median of all 6D coordinates */
436  for (i = 0; i < in->nTuples; i++)
437  {
438  BOX3D* box_in = DatumGetBox3DP(in->datums[i]);
439  lowXs[i] = box_in->xmin;
440  highXs[i] = box_in->xmax;
441  lowYs[i] = box_in->ymin;
442  highYs[i] = box_in->ymax;
443  lowZs[i] = box_in->zmin;
444  highZs[i] = box_in->zmax;
445 
446  if (i == 0)
447  srid = box_in->srid;
448  }
449 
450  qsort(lowXs, in->nTuples, sizeof(double), compareDoubles);
451  qsort(highXs, in->nTuples, sizeof(double), compareDoubles);
452  qsort(lowYs, in->nTuples, sizeof(double), compareDoubles);
453  qsort(highYs, in->nTuples, sizeof(double), compareDoubles);
454  qsort(lowZs, in->nTuples, sizeof(double), compareDoubles);
455  qsort(highZs, in->nTuples, sizeof(double), compareDoubles);
456 
457  median = in->nTuples / 2;
458 
459  centroid = palloc(sizeof(BOX3D));
460 
461  centroid->xmin = lowXs[median];
462  centroid->xmax = highXs[median];
463  centroid->ymin = lowYs[median];
464  centroid->ymax = highYs[median];
465  centroid->zmin = lowZs[median];
466  centroid->zmax = highZs[median];
467  centroid->srid = srid;
468 
469  /* Fill the output */
470  out->hasPrefix = true;
471  out->prefixDatum = Box3DPGetDatum(centroid);
472 
473  out->nNodes = 64;
474  out->nodeLabels = NULL; /* We don't need node labels. */
475 
476  out->mapTuplesToNodes = palloc(sizeof(int) * in->nTuples);
477  out->leafTupleDatums = palloc(sizeof(Datum) * in->nTuples);
478 
479  /*
480  * Assign ranges to corresponding nodes according to octants relative to
481  * the "centroid" range
482  */
483  for (i = 0; i < in->nTuples; i++)
484  {
485  BOX3D* box_in = DatumGetBox3DP(in->datums[i]);
486  uint8 octant = getOctant(centroid, box_in);
487 
488  out->leafTupleDatums[i] = Box3DPGetDatum(box_in);
489  out->mapTuplesToNodes[i] = octant;
490  }
491 
492  pfree(lowXs);
493  pfree(highXs);
494  pfree(lowYs);
495  pfree(highYs);
496  pfree(lowZs);
497  pfree(highZs);
498 
499  PG_RETURN_VOID();
500 }
static uint8 getOctant(const BOX3D *centroid, const BOX3D *inBox)
static int compareDoubles(const void *a, const void *b)
#define SRID_UNKNOWN
Unknown SRID value.
Definition: liblwgeom.h:215
Datum centroid(PG_FUNCTION_ARGS)
double xmax
Definition: liblwgeom.h:340
double zmin
Definition: liblwgeom.h:339
double ymax
Definition: liblwgeom.h:340
double ymin
Definition: liblwgeom.h:339
double zmax
Definition: liblwgeom.h:340
double xmin
Definition: liblwgeom.h:339
int32_t srid
Definition: liblwgeom.h:341

References centroid(), compareDoubles(), getOctant(), BOX3D::srid, SRID_UNKNOWN, BOX3D::xmax, BOX3D::xmin, BOX3D::ymax, BOX3D::ymin, BOX3D::zmax, and BOX3D::zmin.

Here is the call graph for this function: