in h3_polyfill.c [221:266]
H3Error cellToBBox(H3Index cell, BBox *out, bool coverChildren) {
// Adjust the BBox to handle poles, if needed
int res = H3_GET_RESOLUTION(cell);
if (res == 0) {
int baseCell = H3_GET_BASE_CELL(cell);
if (NEVER(baseCell < 0) || baseCell >= NUM_BASE_CELLS) {
return E_CELL_INVALID;
}
*out = RES0_BBOXES[baseCell];
} else {
LatLng center;
H3Error centerErr = H3_EXPORT(cellToLatLng)(cell, ¢er);
if (centerErr != E_SUCCESS) {
return centerErr;
}
double lngRatio = 1 / cos(center.lat);
out->north = center.lat + MAX_EDGE_LENGTH_RADS[res];
out->south = center.lat - MAX_EDGE_LENGTH_RADS[res];
out->east = center.lng + MAX_EDGE_LENGTH_RADS[res] * lngRatio;
out->west = center.lng - MAX_EDGE_LENGTH_RADS[res] * lngRatio;
}
// Buffer the bounding box to cover children. Call this even if no buffering
// is required in order to normalize the bbox to lat/lng bounds
scaleBBox(out, coverChildren ? CHILD_SCALE_FACTOR : CELL_SCALE_FACTOR);
// Cell that contains the north pole
if (cell == NORTH_POLE_CELLS[res]) {
out->north = M_PI_2;
}
// Cell that contains the south pole
if (cell == SOUTH_POLE_CELLS[res]) {
out->south = -M_PI_2;
}
// If we contain a pole, expand the longitude to include the full domain,
// effectively making the bbox a circle around the pole.
if (out->north == M_PI_2 || out->south == -M_PI_2) {
out->east = M_PI;
out->west = -M_PI;
}
return E_SUCCESS;
}