getTileCoordForXYAndZ_(x, y, z, reverseIntersectionPolicy, opt_tileCoord) {
    const origin = this.getOrigin(z);
    const resolution = this.getResolution(z);
    const tileSize = toSize(this.getTileSize(z), this.tmpSize_);

    let tileCoordX = (x - origin[0]) / resolution / tileSize[0];
    let tileCoordY = (origin[1] - y) / resolution / tileSize[1];

    if (reverseIntersectionPolicy) {
      tileCoordX = ceil(tileCoordX, DECIMALS) - 1;
      tileCoordY = ceil(tileCoordY, DECIMALS) - 1;
    } else {
      tileCoordX = floor(tileCoordX, DECIMALS);
      tileCoordY = floor(tileCoordY, DECIMALS);
    }

    return createOrUpdateTileCoord(z, tileCoordX, tileCoordY, opt_tileCoord);
  }
Although there is repetition between this method and `getTileCoordForXYAndResolution_`,
they should have separate implementations.  This method is for integer zoom
levels.  The other method should only be called for resolutions corresponding
to non-integer zoom levels.
@param {number} x Map x coordinate.
@param {number} y Map y coordinate.
@param {number} z Integer zoom level.
@param {boolean} reverseIntersectionPolicy Instead of letting edge
    intersections go to the higher tile coordinate, let edge intersections
    go to the lower tile coordinate.
@param {import("../tilecoord.js").TileCoord} [opt_tileCoord] Temporary import("../tilecoord.js").TileCoord object.
@return {import("../tilecoord.js").TileCoord} Tile coordinate.
@private