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

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

Here is the call graph for this function: