PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ 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);
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: